summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsvncommit <devs@roundcube.net>2006-09-14 03:49:28 +0000
committersvncommit <devs@roundcube.net>2006-09-14 03:49:28 +0000
commita0109c4933e0bfb5ed9dbcf94f932991ca689542 (patch)
tree955246969bf9da5d5335d1d7c483025fdbd50407
parentbb5ddfa0ade5fbd2ed9be16e51d4ce695252eece (diff)
Initial TinyMCE editor support (still need to work on spellcheck and skins)
-rw-r--r--CHANGELOG6
-rw-r--r--SQL/mysql.initial.sql1
-rw-r--r--SQL/mysql.update.sql2
-rw-r--r--SQL/mysql5.initial.sql3
-rwxr-xr-xSQL/postgres.initial.sql3
-rw-r--r--SQL/postgres.update.sql2
-rw-r--r--SQL/sqlite.initial.sql3
-rw-r--r--index.php17
-rw-r--r--program/include/bugs.inc14
-rw-r--r--program/include/main.inc18
-rw-r--r--program/include/rcube_shared.inc81
-rw-r--r--program/js/app.js117
-rw-r--r--program/js/editor.js148
-rw-r--r--program/js/tiny_mce/blank.htm9
-rw-r--r--program/js/tiny_mce/langs/en.js41
-rw-r--r--program/js/tiny_mce/langs/readme.txt7
-rw-r--r--program/js/tiny_mce/license.txt437
-rw-r--r--program/js/tiny_mce/plugins/cleanup/editor_plugin.js0
-rw-r--r--program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js12
-rw-r--r--program/js/tiny_mce/plugins/cleanup/readme.txt1
-rw-r--r--program/js/tiny_mce/plugins/emotions/editor_plugin.js1
-rw-r--r--program/js/tiny_mce/plugins/emotions/editor_plugin_src.js65
-rw-r--r--program/js/tiny_mce/plugins/emotions/emotions.htm40
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/emotions.gifbin0 -> 319 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/readme.txt2
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-cool.gifbin0 -> 354 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-cry.gifbin0 -> 329 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gifbin0 -> 331 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gifbin0 -> 344 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-frown.gifbin0 -> 340 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gifbin0 -> 336 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gifbin0 -> 338 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gifbin0 -> 344 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gifbin0 -> 321 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gifbin0 -> 325 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-smile.gifbin0 -> 345 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gifbin0 -> 342 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gifbin0 -> 328 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gifbin0 -> 337 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-wink.gifbin0 -> 351 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/images/smiley-yell.gifbin0 -> 336 bytes
-rw-r--r--program/js/tiny_mce/plugins/emotions/jscripts/functions.js21
-rw-r--r--program/js/tiny_mce/plugins/emotions/langs/en.js22
-rw-r--r--program/js/tiny_mce/plugins/emotions/readme.txt1
-rw-r--r--program/js/tiny_mce/plugins/readme.txt1
-rw-r--r--program/js/tiny_mce/plugins/searchreplace/editor_plugin.js1
-rw-r--r--program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js185
-rw-r--r--program/js/tiny_mce/plugins/searchreplace/images/replace.gifbin0 -> 125 bytes
-rw-r--r--program/js/tiny_mce/plugins/searchreplace/images/search.gifbin0 -> 191 bytes
-rw-r--r--program/js/tiny_mce/plugins/searchreplace/jscripts/replace.js40
-rw-r--r--program/js/tiny_mce/plugins/searchreplace/jscripts/search.js36
-rw-r--r--program/js/tiny_mce/plugins/searchreplace/langs/en.js21
-rw-r--r--program/js/tiny_mce/plugins/searchreplace/readme.txt1
-rw-r--r--program/js/tiny_mce/plugins/searchreplace/replace.htm49
-rw-r--r--program/js/tiny_mce/plugins/searchreplace/search.htm42
-rw-r--r--program/js/tiny_mce/plugins/table/cell.htm182
-rw-r--r--program/js/tiny_mce/plugins/table/css/cell.css17
-rw-r--r--program/js/tiny_mce/plugins/table/css/row.css25
-rw-r--r--program/js/tiny_mce/plugins/table/css/table.css13
-rw-r--r--program/js/tiny_mce/plugins/table/editor_plugin.js1
-rw-r--r--program/js/tiny_mce/plugins/table/editor_plugin_src.js1054
-rw-r--r--program/js/tiny_mce/plugins/table/images/buttons.gifbin0 -> 1356 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table.gifbin0 -> 287 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_cell_props.gifbin0 -> 189 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_delete.gifbin0 -> 372 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_delete_col.gifbin0 -> 163 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_delete_row.gifbin0 -> 171 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_insert_col_after.gifbin0 -> 165 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_insert_col_before.gifbin0 -> 165 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_insert_row_after.gifbin0 -> 163 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_insert_row_before.gifbin0 -> 159 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_merge_cells.gifbin0 -> 198 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_row_props.gifbin0 -> 187 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/images/table_split_cells.gifbin0 -> 210 bytes
-rw-r--r--program/js/tiny_mce/plugins/table/jscripts/cell.js249
-rw-r--r--program/js/tiny_mce/plugins/table/jscripts/merge_cells.js19
-rw-r--r--program/js/tiny_mce/plugins/table/jscripts/row.js200
-rw-r--r--program/js/tiny_mce/plugins/table/jscripts/table.js344
-rw-r--r--program/js/tiny_mce/plugins/table/langs/en.js78
-rw-r--r--program/js/tiny_mce/plugins/table/merge_cells.htm37
-rw-r--r--program/js/tiny_mce/plugins/table/readme.txt1
-rw-r--r--program/js/tiny_mce/plugins/table/row.htm159
-rw-r--r--program/js/tiny_mce/plugins/table/table.htm155
-rw-r--r--program/js/tiny_mce/themes/advanced/about.htm52
-rw-r--r--program/js/tiny_mce/themes/advanced/anchor.htm33
-rw-r--r--program/js/tiny_mce/themes/advanced/charmap.htm53
-rw-r--r--program/js/tiny_mce/themes/advanced/color_picker.htm13
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/about.htm31
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/common_buttons.htm162
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm45
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gifbin0 -> 5189 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gifbin0 -> 7195 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gifbin0 -> 5658 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gifbin0 -> 7094 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/index.htm27
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm32
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/insert_image_button.htm65
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/insert_link_button.htm33
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/insert_table_button.htm71
-rw-r--r--program/js/tiny_mce/themes/advanced/docs/en/style.css28
-rw-r--r--program/js/tiny_mce/themes/advanced/editor_template.js1
-rw-r--r--program/js/tiny_mce/themes/advanced/editor_template_src.js1411
-rw-r--r--program/js/tiny_mce/themes/advanced/image.htm100
-rw-r--r--program/js/tiny_mce/themes/advanced/images/anchor.gifbin0 -> 171 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/anchor_symbol.gifbin0 -> 70 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/backcolor.gifbin0 -> 174 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/bold.gifbin0 -> 76 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/bold_de_se.gifbin0 -> 73 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/bold_es.gifbin0 -> 80 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/bold_fr.gifbin0 -> 78 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/bold_ru.gifbin0 -> 77 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/bold_tw.gifbin0 -> 207 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/browse.gifbin0 -> 113 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/bullist.gifbin0 -> 108 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/button_menu.gifbin0 -> 57 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/buttons.gifbin0 -> 8399 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gifbin0 -> 677 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/charmap.gifbin0 -> 245 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/cleanup.gifbin0 -> 256 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/close.gifbin0 -> 102 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/code.gifbin0 -> 110 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/color.gifbin0 -> 125 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/copy.gifbin0 -> 263 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/custom_1.gifbin0 -> 76 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/cut.gifbin0 -> 187 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/forecolor.gifbin0 -> 272 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/help.gifbin0 -> 295 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/hr.gifbin0 -> 63 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/image.gifbin0 -> 194 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/indent.gifbin0 -> 112 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/insert_button_bg.gifbin0 -> 703 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/italic.gifbin0 -> 79 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/italic_de_se.gifbin0 -> 75 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/italic_es.gifbin0 -> 74 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/italic_ru.gifbin0 -> 78 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/italic_tw.gifbin0 -> 274 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/justifycenter.gifbin0 -> 70 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/justifyfull.gifbin0 -> 71 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/justifyleft.gifbin0 -> 71 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/justifyright.gifbin0 -> 70 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/link.gifbin0 -> 175 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/menu_check.gifbin0 -> 51 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/newdocument.gifbin0 -> 170 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/numlist.gifbin0 -> 111 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/opacity.pngbin0 -> 147 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/outdent.gifbin0 -> 110 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/paste.gifbin0 -> 286 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/redo.gifbin0 -> 169 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/removeformat.gifbin0 -> 168 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/separator.gifbin0 -> 57 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/spacer.gifbin0 -> 43 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/statusbar_resize.gifbin0 -> 79 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/strikethrough.gifbin0 -> 83 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/sub.gifbin0 -> 148 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/sup.gifbin0 -> 147 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/underline.gifbin0 -> 88 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/underline_es.gifbin0 -> 79 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/underline_fr.gifbin0 -> 79 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/underline_ru.gifbin0 -> 77 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/underline_tw.gifbin0 -> 245 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/undo.gifbin0 -> 175 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/unlink.gifbin0 -> 190 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/visualaid.gifbin0 -> 206 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gifbin0 -> 694 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/xp/tab_end.gifbin0 -> 169 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gifbin0 -> 428 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gifbin0 -> 101 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gifbin0 -> 48 bytes
-rw-r--r--program/js/tiny_mce/themes/advanced/jscripts/about.js75
-rw-r--r--program/js/tiny_mce/themes/advanced/jscripts/anchor.js74
-rw-r--r--program/js/tiny_mce/themes/advanced/jscripts/charmap.js326
-rw-r--r--program/js/tiny_mce/themes/advanced/jscripts/color_picker.js108
-rw-r--r--program/js/tiny_mce/themes/advanced/jscripts/image.js81
-rw-r--r--program/js/tiny_mce/themes/advanced/jscripts/link.js70
-rw-r--r--program/js/tiny_mce/themes/advanced/jscripts/source_editor.js66
-rw-r--r--program/js/tiny_mce/themes/advanced/langs/en.js81
-rw-r--r--program/js/tiny_mce/themes/advanced/link.htm100
-rw-r--r--program/js/tiny_mce/themes/advanced/source_editor.htm30
-rw-r--r--program/js/tiny_mce/tiny_mce.js1
-rw-r--r--program/js/tiny_mce/tiny_mce_popup.js272
-rw-r--r--program/js/tiny_mce/tiny_mce_src.js6719
-rw-r--r--program/js/tiny_mce/utils/editable_selects.js63
-rw-r--r--program/js/tiny_mce/utils/form_utils.js210
-rw-r--r--program/js/tiny_mce/utils/mclayer.js212
-rw-r--r--program/js/tiny_mce/utils/mctabs.js76
-rw-r--r--program/js/tiny_mce/utils/validate.js50
-rw-r--r--program/lib/Mail/mime.php19
-rw-r--r--program/localization/en_US/labels.inc15
-rw-r--r--program/localization/en_US/messages.inc1
-rw-r--r--program/steps/mail/compose.inc245
-rw-r--r--program/steps/mail/func.inc60
-rw-r--r--program/steps/mail/sendmail.inc75
-rw-r--r--program/steps/settings/edit_identity.inc34
-rw-r--r--program/steps/settings/func.inc9
-rw-r--r--program/steps/settings/save_identity.inc15
-rw-r--r--program/steps/settings/save_prefs.inc3
-rw-r--r--skins/default/editor_content.css58
-rw-r--r--skins/default/editor_popup.css327
-rw-r--r--skins/default/editor_ui.css353
-rw-r--r--skins/default/templates/compose.html4
-rw-r--r--skins/default/templates/ldappublicsearch.html2
201 files changed, 15839 insertions, 136 deletions
diff --git a/CHANGELOG b/CHANGELOG
index e683252f3..debca4992 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,12 @@
CHANGELOG RoundCube Webmail
---------------------------
+2006/09/13 (estadtherr)
+----------
+- Introduction of TinyMCE HTML editor support for message composition and signatures
+ Note : a new column is added to the "identities" database table
+
+
2006/09/12 (estadtherr)
----------
- Fixed html2text treatment of table headers (Bug #1484020)
diff --git a/SQL/mysql.initial.sql b/SQL/mysql.initial.sql
index 716268b1a..f49fd7084 100644
--- a/SQL/mysql.initial.sql
+++ b/SQL/mysql.initial.sql
@@ -58,6 +58,7 @@ CREATE TABLE `identities` (
`reply-to` varchar(128) NOT NULL default '',
`bcc` varchar(128) NOT NULL default '',
`signature` text NOT NULL,
+ `html_signature` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`identity_id`),
KEY `user_id` (`user_id`)
);
diff --git a/SQL/mysql.update.sql b/SQL/mysql.update.sql
index cfd5af361..b16f2555f 100644
--- a/SQL/mysql.update.sql
+++ b/SQL/mysql.update.sql
@@ -7,3 +7,5 @@ ALTER TABLE `messages`
ADD `structure` TEXT,
ADD UNIQUE `uniqueness` (`cache_key`, `uid`);
+ALTER TABLE 'identities'
+ ADD 'html_signature' tinyint(1) default 0 NOT NULL;
diff --git a/SQL/mysql5.initial.sql b/SQL/mysql5.initial.sql
index 24e143119..ee6fc3352 100644
--- a/SQL/mysql5.initial.sql
+++ b/SQL/mysql5.initial.sql
@@ -114,6 +114,7 @@ CREATE TABLE `identities` (
`reply-to` varchar(128) NOT NULL,
`bcc` varchar(128) NOT NULL,
`signature` text NOT NULL,
+ `html_signature` tinyint(1) NOT NULL DEFAULT '0',
`user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY(`identity_id`),
CONSTRAINT `User_ID_FK_identities` FOREIGN KEY (`user_id`)
@@ -123,4 +124,4 @@ CREATE TABLE `identities` (
) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
-SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file
+SET FOREIGN_KEY_CHECKS=1;
diff --git a/SQL/postgres.initial.sql b/SQL/postgres.initial.sql
index 029afaab3..ebd504d0d 100755
--- a/SQL/postgres.initial.sql
+++ b/SQL/postgres.initial.sql
@@ -69,7 +69,8 @@ CREATE TABLE identities (
email character varying(128) NOT NULL,
"reply-to" character varying(128),
bcc character varying(128),
- signature text
+ signature text,
+ html_signature integer DEFAULT 0 NOT NULL
);
diff --git a/SQL/postgres.update.sql b/SQL/postgres.update.sql
index 6ca855edc..2ad60298f 100644
--- a/SQL/postgres.update.sql
+++ b/SQL/postgres.update.sql
@@ -5,3 +5,5 @@ ALTER TABLE "messages" DROP body;
ALTER TABLE "messages" ADD structure TEXT;
ALTER TABLE "messages" ADD UNIQUE (cache_key, uid);
+ALTER TABLE "identities" ADD html_signature integer DEFAULT 0 NOT NULL;
+
diff --git a/SQL/sqlite.initial.sql b/SQL/sqlite.initial.sql
index 4ddc40d5d..5be69785a 100644
--- a/SQL/sqlite.initial.sql
+++ b/SQL/sqlite.initial.sql
@@ -58,7 +58,8 @@ CREATE TABLE identities (
email varchar(128) NOT NULL default '',
"reply-to" varchar(128) NOT NULL default '',
bcc varchar(128) NOT NULL default '',
- signature text NOT NULL default ''
+ signature text NOT NULL default '',
+ html_signature tinyint NOT NULL default '0'
);
CREATE INDEX ix_identities_user_id ON identities(user_id);
diff --git a/index.php b/index.php
index 85a9eefef..4e9dee1c7 100644
--- a/index.php
+++ b/index.php
@@ -81,6 +81,7 @@ require_once('include/rcube_imap.inc');
require_once('include/bugs.inc');
require_once('include/main.inc');
require_once('include/cache.inc');
+require_once('lib/html2text.inc');
require_once('PEAR.php');
@@ -145,6 +146,21 @@ if ($_action=='error' && !empty($_GET['_code']))
raise_error(array('code' => hexdec($_GET['_code'])), FALSE, TRUE);
}
+// handle HTML->text conversion
+if ($_action=='html2text')
+ {
+ $htmlText = $HTTP_RAW_POST_DATA;
+ $converter = new html2text($htmlText);
+
+ // TODO possibly replace with rcube_remote_response()
+ send_nocacheing_headers();
+ header('Content-Type: text/plain');
+ $plaintext = $converter->get_text();
+ print $plaintext;
+
+ exit;
+ }
+
// try to log in
if ($_action=='login' && $_task=='mail')
@@ -241,7 +257,6 @@ if ($_action=='keep-alive')
exit;
}
-
// include task specific files
if ($_task=='mail')
{
diff --git a/program/include/bugs.inc b/program/include/bugs.inc
index 771f1aeda..bf4c572c8 100644
--- a/program/include/bugs.inc
+++ b/program/include/bugs.inc
@@ -115,5 +115,19 @@ function log_bug($arg_arr)
}
}
+function log_debug($filename, $text)
+{
+ global $CONFIG, $INSTALL_PATH;
+
+ if (empty($CONFIG['log_dir']))
+ $CONFIG['log_dir'] = $INSTALL_PATH.'logs';
+
+ // try to open specific log file for writing
+ if ($fp = @fopen($CONFIG['log_dir'].'/'.$filename, 'a'))
+ {
+ fwrite($fp, date("d-M-Y H:i:s", mktime()) . ' ' . $text . "\n");
+ fclose($fp);
+ }
+}
?> \ No newline at end of file
diff --git a/program/include/main.inc b/program/include/main.inc
index 02f5b5713..bbda83aa7 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -375,7 +375,7 @@ function load_gui()
// don't wait for page onload. Call init at the bottom of the page (delayed)
$javascript_foot = "if (window.call_init)\n call_init('$JS_OBJECT_NAME');";
-
+
if (!empty($GLOBALS['_framed']))
$javascript .= "$JS_OBJECT_NAME.set_env('framed', true);\n";
@@ -1197,6 +1197,7 @@ function rcube_xml_command($command, $str_attrib, $add_attrib=array())
'composeattachment' => 'rcmail_compose_attachment_field',
'priorityselector' => 'rcmail_priority_selector',
'charsetselector' => 'rcmail_charset_selector',
+ 'editorselector' => 'rcmail_editor_selector',
'searchform' => 'rcmail_search_form',
'receiptcheckbox' => 'rcmail_receipt_checkbox',
@@ -1279,8 +1280,7 @@ function rcube_button($attrib)
if ($attrib['type'])
$attrib['type'] = strtolower($attrib['type']);
else
- $attrib['type'] = ($attrib['image'] || $attrib['imagepas'] || $arg['imageact']) ? 'image' : 'link';
-
+ $attrib['type'] = ($attrib['image'] || $attrib['imagepas'] || $attrib['imageact']) ? 'image' : 'link';
$command = $attrib['command'];
@@ -1289,7 +1289,7 @@ function rcube_button($attrib)
$attrib = $sa_buttons[$attrib['name']];
// add button to button stack
- else if($attrib['image'] || $arg['imageact'] || $attrib['imagepas'] || $attrib['class'])
+ else if($attrib['image'] || $attrib['imageact'] || $attrib['imagepas'] || $attrib['class'])
{
if(!$attrib['name'])
$attrib['name'] = $command;
@@ -1487,7 +1487,15 @@ function rcube_table_output($attrib, $table_data, $a_show_cols, $id_col)
}
-
+/**
+ * Create an edit field for inclusion on a form
+ *
+ * @param string col field name
+ * @param string value field value
+ * @param array attrib HTML element attributes for field
+ * @param string type HTML element type (default 'text')
+ * @return string HTML field definition
+ */
function rcmail_get_edit_field($col, $value, $attrib, $type='text')
{
$fname = '_'.$col;
diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc
index af4c295dd..11af48205 100644
--- a/program/include/rcube_shared.inc
+++ b/program/include/rcube_shared.inc
@@ -28,13 +28,15 @@ class rcube_html_page
var $scripts_path = '';
var $script_files = array();
+ var $external_scripts = array();
var $scripts = array();
var $charset = 'ISO-8859-1';
var $script_tag_file = "<script type=\"text/javascript\" src=\"%s%s\"></script>\n";
var $script_tag = "<script type=\"text/javascript\">\n<!--\n%s\n\n//-->\n</script>\n";
var $default_template = "<html>\n<head><title></title></head>\n<body></body>\n</html>";
-
+ var $tag_format_external_script = "<script type=\"text/javascript\" src=\"%s\"></script>\n";
+
var $title = '';
var $header = '';
var $footer = '';
@@ -69,13 +71,22 @@ class rcube_html_page
$this->script_files[$position][] = $file;
}
-
+ function include_external_script($script_location, $position='head')
+ {
+ if (!is_array($this->external_scripts[$position]))
+ {
+ $this->external_scripts[$position] = array();
+ }
+
+ $this->external_scripts[$position][] = $script_location;
+ }
+
function add_script($script, $position='head')
{
if (!isset($this->scripts[$position]))
- $this->scripts[$position] = '';
-
- $this->scripts[$position] .= "\n$script";
+ $this->scripts[$position] = "\n$script";
+ else
+ $this->scripts[$position] .= "\n$script";
}
@@ -139,19 +150,27 @@ class rcube_html_page
foreach ($this->script_files['head'] as $file)
$__page_header .= sprintf($this->script_tag_file, $this->scripts_path, $file);
+ if (is_array($this->external_scripts['head']))
+ {
+ foreach ($this->external_scripts['head'] as $xscript)
+ {
+ $__page_header .= sprintf($this->tag_format_external_script, $xscript);
+ }
+ }
+
if (strlen($this->scripts['head']))
$__page_header .= sprintf($this->script_tag, $this->scripts['head']);
if (is_array($this->script_files['foot']))
+ {
foreach ($this->script_files['foot'] as $file)
$__page_footer .= sprintf($this->script_tag_file, $this->scripts_path, $file);
+ }
if (strlen($this->scripts['foot']))
$__page_footer .= sprintf($this->script_tag, $this->scripts['foot']);
-
$__page_header .= $this->css->show();
-
// find page header
if($hpos = strpos(strtolower($output), '</head>'))
@@ -192,8 +211,12 @@ class rcube_html_page
// find and add page footer
- if(($fpos = strpos(strtolower($output), '</body>')) || ($fpos = strpos(strtolower($output), '</html>')))
+ $output_lc = strtolower($output);
+ if(($fpos = strrpos($output_lc, '</body>')) ||
+ ($fpos = strrpos($output_lc, '</html>')))
+ {
$output = substr($output,0,$fpos) . "$__page_footer\n" . substr($output,$fpos,strlen($output));
+ }
else
$output .= "\n$__page_footer";
@@ -202,7 +225,7 @@ class rcube_html_page
$__page_header = $__page_footer = '';
- // correct absolute pathes in images and other tags
+ // correct absolute paths in images and other tags
$output = preg_replace('/(src|href|background)=(["\']?)(\/[a-z0-9_\-]+)/Ui', "\\1=\\2$base_path\\3", $output);
$output = str_replace('$__skin_path', $base_path, $output);
@@ -854,9 +877,9 @@ class textarea extends base_form_element
if (isset($this->attrib['value']))
unset($this->attrib['value']);
- if (strlen($value))
+ if (strlen($value) && !isset($this->attrib['mce_editable']))
$value = rep_specialchars_output($value, 'html', 'replace', FALSE);
-
+
// return final tag
return sprintf('<%s%s>%s</%s>%s',
$this->_conv_case('textarea', 'tag'),
@@ -1233,7 +1256,7 @@ function array2js($arr, $type='')
if (!ereg("^[_a-zA-Z]{1}[_a-zA-Z0-9]*$", $key) /* || is_js_reserved_word($key) */)
$key = "'$key'";
- if (!is_array($value))
+ if (!is_array($value) && is_string($value))
{
$value = str_replace("\r\n", '\n', $value);
$value = str_replace("\n", '\n', $value);
@@ -1244,6 +1267,11 @@ function array2js($arr, $type='')
{
if ($type=='string')
$is_string = true;
+ else if (($type == 'mixed' && is_bool($value)) || $type == 'bool')
+ {
+ $is_string = false;
+ $value = $value ? "true" : "false";
+ }
else if ((($type=='mixed' && is_numeric($value)) || $type=='int') && strlen($value)<16) // js interprets numbers with digits >15 as ...e+...
$is_string = FALSE;
else
@@ -1270,7 +1298,9 @@ function array2js($arr, $type='')
}
}
else
+ {
return $arr;
+ }
}
@@ -1437,4 +1467,31 @@ function get_offset_time($offset_str, $factor=1)
}
+/**
+ * strrstr
+ *
+ * return the last occurence of a string in another string
+ * @param haystack string string in which to search
+ * @param needle string string for which to search
+ * @return index of needle within haystack, or false if not found
+ */
+function strrstr($haystack, $needle)
+ {
+ $pver = phpversion();
+ if ($pver[0] >= 5)
+ {
+ return strrpos($haystack, $needle);
+ }
+ else
+ {
+ $index = strpos(strrev($haystack), strrev($needle));
+ if($index === false) {
+ return false;
+ }
+ $index = strlen($haystack) - strlen($needle) - $index;
+ return $index;
+ }
+ }
+
+
?>
diff --git a/program/js/app.js b/program/js/app.js
index d52efae1b..eedcd13e7 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -142,7 +142,7 @@ function rcube_webmail()
if (this.gui_objects.remoteobjectsmsg)
this.gui_objects.remoteobjectsmsg.style.display = 'block';
this.enable_command('load-images', true);
- }
+ }
if (this.env.action=='compose')
{
@@ -155,7 +155,7 @@ function rcube_webmail()
if (this.env.drafts_mailbox)
this.enable_command('savedraft', true);
}
-
+
if (this.env.messagecount)
this.enable_command('select-all', 'select-none', 'sort', 'expunge', true);
@@ -174,7 +174,7 @@ function rcube_webmail()
// show printing dialog
if (this.env.action=='print')
window.print();
-
+
// get unread count for each mailbox
if (this.gui_objects.mailboxlist)
this.http_request('getunread', '');
@@ -437,7 +437,7 @@ function rcube_webmail()
var input_replyto = rcube_find_object('_replyto');
var input_subject = rcube_find_object('_subject');
var input_message = rcube_find_object('_message');
-
+
// init live search events
if (input_to)
this.init_address_input_events(input_to);
@@ -456,7 +456,7 @@ function rcube_webmail()
input_subject.focus();
else if (input_message)
this.set_caret2start(input_message); // input_message.focus();
-
+
// get summary of all field values
this.cmp_hash = this.compose_field_hash();
@@ -2019,7 +2019,7 @@ function rcube_webmail()
}
// check for empty body
- if (input_message.value=='')
+ if ((input_message.value=='')&&(tinyMCE.getContent()==''))
{
if (!confirm(this.get_label('nobodywarning')))
{
@@ -2079,35 +2079,67 @@ function rcube_webmail()
var id = obj.options[obj.selectedIndex].value;
var input_message = rcube_find_object('_message');
var message = input_message ? input_message.value : '';
+ var is_html = (rcube_find_object('_is_html').value == '1');
var sig, p;
if (!this.env.identity)
this.env.identity = id
-
- // remove the 'old' signature
- if (this.env.identity && this.env.signatures && this.env.signatures[this.env.identity])
+
+ if (!is_html)
{
- sig = this.env.signatures[this.env.identity];
- if (sig.indexOf('--')!=0)
- sig = '--\n'+sig;
-
- p = message.lastIndexOf(sig);
- if (p>=0)
- message = message.substring(0, p-1) + message.substring(p+sig.length, message.length);
+ // remove the 'old' signature
+ if (this.env.identity && this.env.signatures && this.env.signatures[this.env.identity])
+ {
+ sig = this.env.signatures[this.env.identity]['text'];
+ if (sig.indexOf('--')!=0)
+ sig = '--\n'+sig;
+
+ p = message.lastIndexOf(sig);
+ if (p>=0)
+ message = message.substring(0, p-1) + message.substring(p+sig.length, message.length);
+ }
+
+ // add the new signature string
+ if (this.env.signatures && this.env.signatures[id])
+ {
+ sig = this.env.signatures[id]['text'];
+ if (sig.indexOf('--')!=0)
+ sig = '--\n'+sig;
+ message += '\n'+sig;
+ }
}
-
- // add the new signature string
- if (this.env.signatures && this.env.signatures[id])
+ else
{
- sig = this.env.signatures[id];
- if (sig.indexOf('--')!=0)
- sig = '--\n'+sig;
- message += '\n'+sig;
+ var eid = tinyMCE.getEditorId('_message');
+ // editor is a TinyMCE_Control object
+ var editor = tinyMCE.getInstanceById(eid);
+ var msgDoc = editor.getDoc();
+ var msgBody = msgDoc.body;
+
+ if (this.env.signatures && this.env.signatures[id])
+ {
+ // Append the signature as a span within the body
+ var sigElem = msgDoc.getElementById("_rc_sig");
+ if (!sigElem)
+ {
+ sigElem = msgDoc.createElement("span");
+ sigElem.setAttribute("id", "_rc_sig");
+ msgBody.appendChild(sigElem);
+ }
+ if (this.env.signatures[id]['is_html'])
+ {
+ sigElem.innerHTML = this.env.signatures[id]['text'];
+ }
+ else
+ {
+ sigElem.innerHTML = '<pre>' + this.env.signatures[id]['text'] + '</pre>';
+ }
+ }
}
if (input_message)
input_message.value = message;
-
+
this.env.identity = id;
return true;
};
@@ -3431,6 +3463,18 @@ function rcube_webmail()
};
+ this.toggle_editor = function(checkbox, textElementName)
+ {
+ var ischecked = checkbox.checked;
+ if (ischecked)
+ {
+ tinyMCE.execCommand('mceAddControl', true, textElementName);
+ }
+ else
+ {
+ tinyMCE.execCommand('mceRemoveControl', true, textElementName);
+ }
+ }
/********************************************************/
/********* drag & drop methods *********/
@@ -3820,7 +3864,7 @@ function rcube_http_request()
}
}
- // sedn GET request
+ // send GET request
this.GET = function(url)
{
this.build();
@@ -3841,9 +3885,28 @@ function rcube_http_request()
};
- this.POST = function(url, a_param)
+ this.POST = function(url, body, contentType)
+ {
+ // default value for contentType if not provided
+ contentType = typeof(contentType) != 'undefined' ?
+ contentType : 'application/x-www-form-urlencoded';
+
+ this.build();
+
+ if (!this.xmlhttp)
{
- // not implemented yet
+ this.onerror(this);
+ return false;
+ }
+
+ var ref=this;
+ this.url = url;
+ this.busy = true;
+
+ this.xmlhttp.onreadystatechange = function() { ref.xmlhttp_onreadystatechange(); };
+ this.xmlhttp.open('POST', url, true);
+ this.xmlhttp.setRequestHeader('Content-Type', contentType);
+ this.xmlhttp.send(body);
};
diff --git a/program/js/editor.js b/program/js/editor.js
new file mode 100644
index 000000000..333559c2e
--- /dev/null
+++ b/program/js/editor.js
@@ -0,0 +1,148 @@
+/*
+ +-----------------------------------------------------------------------+
+ | RoundCube editor js library |
+ | |
+ | This file is part of the RoundCube web development suite |
+ | Copyright (C) 2006, RoundCube Dev, - Switzerland |
+ | Licensed under the GNU GPL |
+ | |
+ +-----------------------------------------------------------------------+
+ | Author: Eric Stadtherr <estadtherr@gmail.com> |
+ +-----------------------------------------------------------------------+
+
+ $Id: editor.js 000 2006-05-18 19:12:28Z roundcube $
+*/
+
+// Initialize the message editor
+
+function rcmail_editor_init(skin_path)
+{
+ tinyMCE.init({ mode : 'specific_textareas',
+ accessibility_focus : false,
+ apply_source_formatting : true,
+ theme : 'advanced',
+ plugins : 'emotions,table,searchreplace',
+ theme_advanced_buttons1 : 'bold,italic,underline,separator,strikethrough,justifyleft,justifycenter,justifyright,justifyfull,separator,bullist,numlist,outdent,indent,separator,forecolor,backcolor,formatselect,fontselect,fontsizeselect',
+ theme_advanced_buttons2 : 'undo,redo,image,hr,link,unlink,emotions,charmap,code,separator,search,replace,spellchecker,separator,tablecontrols',
+ theme_advanced_buttons3 : '',
+ theme_advanced_toolbar_location : 'top',
+ theme_advanced_toolbar_align : 'left',
+ extended_valid_elements : 'font[face|size|color|style],span[id|class|align|style]',
+ content_css : skin_path + '/editor_content.css',
+ popups_css : skin_path + '/editor_popups.css',
+ editor_css : skin_path + '/editor_ui.css'
+ });
+}
+
+// Set the state of the HTML/Plain toggles based on the _is_html field value
+function rcmail_set_editor_toggle_states()
+{
+ // set the editor toggle based on the state of the editor
+
+ var htmlFlag = document.getElementsByName('_is_html')[0];
+ var toggles = document.getElementsByName('_editorSelect');
+ for(var t=0; t<toggles.length; t++)
+ {
+ if (toggles[t].value == 'html')
+ {
+ toggles[t].checked = (htmlFlag.value == "1");
+ }
+ else
+ {
+ toggles[t].checked = (htmlFlag.value == "0");
+ }
+ }
+}
+
+// Toggle between the HTML and Plain Text editors
+
+function rcmail_toggle_editor(toggler)
+{
+ var selectedEditor = toggler.value;
+
+ // determine the currently displayed editor
+
+ var htmlFlag = document.getElementsByName('_is_html')[0];
+ var currentEditor = htmlFlag.value;
+
+ if (selectedEditor == currentEditor)
+ {
+ return;
+ }
+
+ // do the appropriate conversion
+
+ var composeElement = document.getElementById('compose-body');
+
+ if (selectedEditor == 'html')
+ {
+ var existingPlainText = composeElement.value;
+ var htmlText = "<pre>" + existingPlainText + "</pre>";
+ composeElement.value = htmlText;
+ tinyMCE.execCommand('mceAddControl', true, '_message');
+ htmlFlag.value = "1";
+ }
+ else
+ {
+ rcmail.set_busy(true, 'converting');
+ var thisMCE = tinyMCE.getInstanceById('_message');
+ var existingHtml = tinyMCE.getContent();
+ rcmail_html2plain(existingHtml);
+ tinyMCE.execCommand('mceRemoveControl', true, '_message');
+ htmlFlag.value = "0";
+ }
+}
+
+function rcmail_html2plain(htmlText)
+{
+ var http_request = new rcube_http_request();
+
+ http_request.onerror = function(o) { rcmail_handle_toggle_error(o); };
+ http_request.oncomplete = function(o) { rcmail_set_text_value(o); };
+ var url=rcmail.env.comm_path+'&_action=html2text';
+ console('HTTP request: ' + url);
+ http_request.POST(url, htmlText, 'application/octet-stream');
+}
+
+/*
+function old_html2Plain(htmlText)
+{
+ var http_request = false;
+ if (window.XMLHttpRequest)
+ {
+ http_request = new XMLHttpRequest();
+ //http_request.overrideMimeType('text/plain');
+ }
+
+ if (http_request)
+ {
+ rcmail.set_busy(true);
+
+ http_request.onreadystatechange = function()
+ { setTextValue(http_request); };
+ //var url = window.location.protocol + '://' +
+ //window.location.host + window.location.pathname +
+ //'conv_html.php';
+
+ var url = 'conv_html.php';
+ //alert('calling ' + url);
+ var reqbody = 'htmlText=' + htmlText;
+ http_request.open('POST', url, true);
+ http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+ http_request.send(reqbody);
+ }
+}
+
+*/
+
+function rcmail_set_text_value(httpRequest)
+{
+ rcmail.set_busy(false);
+ var composeElement = document.getElementById('compose-body');
+ composeElement.value = httpRequest.get_text();
+}
+
+function rcmail_handle_toggle_error(httpRequest)
+{
+ alert('html2text request returned with error ' + httpRequest.xmlhttp.status);
+}
diff --git a/program/js/tiny_mce/blank.htm b/program/js/tiny_mce/blank.htm
new file mode 100644
index 000000000..5a4a5a57c
--- /dev/null
+++ b/program/js/tiny_mce/blank.htm
@@ -0,0 +1,9 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>blank_page</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body class="mceContentBody">
+
+</body>
+</html>
diff --git a/program/js/tiny_mce/langs/en.js b/program/js/tiny_mce/langs/en.js
new file mode 100644
index 000000000..c093eafa0
--- /dev/null
+++ b/program/js/tiny_mce/langs/en.js
@@ -0,0 +1,41 @@
+// UK lang variables
+
+tinyMCE.addToLang('',{
+bold_desc : 'Bold (Ctrl+B)',
+italic_desc : 'Italic (Ctrl+I)',
+underline_desc : 'Underline (Ctrl+U)',
+striketrough_desc : 'Strikethrough',
+justifyleft_desc : 'Align left',
+justifycenter_desc : 'Align center',
+justifyright_desc : 'Align right',
+justifyfull_desc : 'Align full',
+bullist_desc : 'Unordered list',
+numlist_desc : 'Ordered list',
+outdent_desc : 'Outdent',
+indent_desc : 'Indent',
+undo_desc : 'Undo (Ctrl+Z)',
+redo_desc : 'Redo (Ctrl+Y)',
+link_desc : 'Insert/edit link',
+unlink_desc : 'Unlink',
+image_desc : 'Insert/edit image',
+cleanup_desc : 'Cleanup messy code',
+focus_alert : 'A editor instance must be focused before using this command.',
+edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?',
+insert_link_title : 'Insert/edit link',
+insert : 'Insert',
+update : 'Update',
+cancel : 'Cancel',
+insert_link_url : 'Link URL',
+insert_link_target : 'Target',
+insert_link_target_same : 'Open link in the same window',
+insert_link_target_blank : 'Open link in a new window',
+insert_image_title : 'Insert/edit image',
+insert_image_src : 'Image URL',
+insert_image_alt : 'Image description',
+help_desc : 'Help',
+bold_img : "bold.gif",
+italic_img : "italic.gif",
+underline_img : "underline.gif",
+clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'
+});
diff --git a/program/js/tiny_mce/langs/readme.txt b/program/js/tiny_mce/langs/readme.txt
new file mode 100644
index 000000000..44eda6fbe
--- /dev/null
+++ b/program/js/tiny_mce/langs/readme.txt
@@ -0,0 +1,7 @@
+Language packs are from version 2.0.5 removed from the core but can be downloadable from the TinyMCE website.
+http://tinymce.moxiecode.com/download.php
+
+The language pack codes are based on ISO-639-1
+http://www.loc.gov/standards/iso639-2/englangn.html
+
+Try using entires if possible. &aring; etc.
diff --git a/program/js/tiny_mce/license.txt b/program/js/tiny_mce/license.txt
new file mode 100644
index 000000000..3b0396a2b
--- /dev/null
+++ b/program/js/tiny_mce/license.txt
@@ -0,0 +1,437 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+.
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+.
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+.
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+.
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+.
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+.
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+.
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+.
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/program/js/tiny_mce/plugins/cleanup/editor_plugin.js b/program/js/tiny_mce/plugins/cleanup/editor_plugin.js
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/program/js/tiny_mce/plugins/cleanup/editor_plugin.js
diff --git a/program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js b/program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js
new file mode 100644
index 000000000..cb7dfac96
--- /dev/null
+++ b/program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js
@@ -0,0 +1,12 @@
+/**
+ * $RCSfile: editor_plugin_src.js,v $
+ * $Revision: 1.10 $
+ * $Date: 2006/02/10 16:29:38 $
+ *
+ * Experimental plugin for new Cleanup routine, this logic will be moved into the core ones it's stable enougth.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+/* Dummy file since cleanup is now moved to core */
diff --git a/program/js/tiny_mce/plugins/cleanup/readme.txt b/program/js/tiny_mce/plugins/cleanup/readme.txt
new file mode 100644
index 000000000..d1a646663
--- /dev/null
+++ b/program/js/tiny_mce/plugins/cleanup/readme.txt
@@ -0,0 +1 @@
+Dummy plugin since cleanup is now moved into core.
diff --git a/program/js/tiny_mce/plugins/emotions/editor_plugin.js b/program/js/tiny_mce/plugins/emotions/editor_plugin.js
new file mode 100644
index 000000000..07779873b
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/editor_plugin.js
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('emotions','en,tr,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk');var TinyMCE_EmotionsPlugin={getInfo:function(){return{longname:'Emotions',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_emotions.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};},getControlHTML:function(cn){switch(cn){case"emotions":return tinyMCE.getButtonHTML(cn,'lang_emotions_desc','{$pluginurl}/images/emotions.gif','mceEmotion');}return"";},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceEmotion":var template=new Array();template['file']='../../plugins/emotions/emotions.htm';template['width']=160;template['height']=160;template['width']+=tinyMCE.getLang('lang_emotions_delta_width',0);template['height']+=tinyMCE.getLang('lang_emotions_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;}return false;}};tinyMCE.addPlugin('emotions',TinyMCE_EmotionsPlugin); \ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/emotions/editor_plugin_src.js b/program/js/tiny_mce/plugins/emotions/editor_plugin_src.js
new file mode 100644
index 000000000..10db6422d
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/editor_plugin_src.js
@@ -0,0 +1,65 @@
+/**
+ * $RCSfile: editor_plugin_src.js,v $
+ * $Revision: 1.23 $
+ * $Date: 2006/02/10 16:29:38 $
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('emotions', 'en,tr,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk');
+
+// Plucin static class
+var TinyMCE_EmotionsPlugin = {
+ getInfo : function() {
+ return {
+ longname : 'Emotions',
+ author : 'Moxiecode Systems',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_emotions.html',
+ version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+ };
+ },
+
+ /**
+ * Returns the HTML contents of the emotions control.
+ */
+ getControlHTML : function(cn) {
+ switch (cn) {
+ case "emotions":
+ return tinyMCE.getButtonHTML(cn, 'lang_emotions_desc', '{$pluginurl}/images/emotions.gif', 'mceEmotion');
+ }
+
+ return "";
+ },
+
+ /**
+ * Executes the mceEmotion command.
+ */
+ execCommand : function(editor_id, element, command, user_interface, value) {
+ // Handle commands
+ switch (command) {
+ case "mceEmotion":
+ var template = new Array();
+
+ template['file'] = '../../plugins/emotions/emotions.htm'; // Relative to theme
+ template['width'] = 160;
+ template['height'] = 160;
+
+ // Language specific width and height addons
+ template['width'] += tinyMCE.getLang('lang_emotions_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_emotions_delta_height', 0);
+
+ tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});
+
+ return true;
+ }
+
+ // Pass to next handler in chain
+ return false;
+ }
+};
+
+// Register plugin
+tinyMCE.addPlugin('emotions', TinyMCE_EmotionsPlugin);
diff --git a/program/js/tiny_mce/plugins/emotions/emotions.htm b/program/js/tiny_mce/plugins/emotions/emotions.htm
new file mode 100644
index 000000000..c70f4b45f
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/emotions.htm
@@ -0,0 +1,40 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_emotions_title}</title>
+ <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/functions.js"></script>
+ <base target="_self" />
+</head>
+<body style="display: none">
+ <div align="center">
+ <div class="title">{$lang_emotions_title}:<br /><br /></div>
+
+ <table border="0" cellspacing="0" cellpadding="4">
+ <tr>
+ <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>
+ <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>
+ <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>
+ <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>
+ </tr>
+ <tr>
+ <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>
+ <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>
+ <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>
+ <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>
+ </tr>
+ <tr>
+ <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>
+ <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>
+ <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>
+ <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>
+ </tr>
+ <tr>
+ <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>
+ <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>
+ <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>
+ <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>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
diff --git a/program/js/tiny_mce/plugins/emotions/images/emotions.gif b/program/js/tiny_mce/plugins/emotions/images/emotions.gif
new file mode 100644
index 000000000..a39ed8ec3
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/emotions.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/readme.txt b/program/js/tiny_mce/plugins/emotions/images/readme.txt
new file mode 100644
index 000000000..a3cea1b68
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/readme.txt
@@ -0,0 +1,2 @@
+These emotions where taken from Mozilla Thunderbird.
+I hope they don't get angry if I use them here after all this is a open source project aswell.
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif
new file mode 100644
index 000000000..ba90cc36f
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif
new file mode 100644
index 000000000..74d897a4f
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif
new file mode 100644
index 000000000..963a96b8a
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif
new file mode 100644
index 000000000..16f68cc1e
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif
new file mode 100644
index 000000000..716f55e16
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif
new file mode 100644
index 000000000..334d49e0e
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif
new file mode 100644
index 000000000..4efd549ed
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif
new file mode 100644
index 000000000..1606c119e
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif
new file mode 100644
index 000000000..ca2451e10
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif
new file mode 100644
index 000000000..b33d3cca1
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif
new file mode 100644
index 000000000..e6a9e60d5
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif
new file mode 100644
index 000000000..cb99cdd91
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif
new file mode 100644
index 000000000..2075dc160
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif
new file mode 100644
index 000000000..bef7e2573
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif
new file mode 100644
index 000000000..9faf1aff8
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif b/program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif
new file mode 100644
index 000000000..648e6e879
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/emotions/jscripts/functions.js b/program/js/tiny_mce/plugins/emotions/jscripts/functions.js
new file mode 100644
index 000000000..95a9eafe8
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/jscripts/functions.js
@@ -0,0 +1,21 @@
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+}
+
+function insertEmotion(file_name, title) {
+ title = tinyMCE.getLang(title);
+
+ if (title == null)
+ title = "";
+
+ // XML encode
+ title = title.replace(/&/g, '&amp;');
+ title = title.replace(/\"/g, '&quot;');
+ title = title.replace(/</g, '&lt;');
+ title = title.replace(/>/g, '&gt;');
+
+ 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 + '" />';
+
+ tinyMCE.execCommand('mceInsertContent', false, html);
+ tinyMCEPopup.close();
+}
diff --git a/program/js/tiny_mce/plugins/emotions/langs/en.js b/program/js/tiny_mce/plugins/emotions/langs/en.js
new file mode 100644
index 000000000..3cdd67517
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/langs/en.js
@@ -0,0 +1,22 @@
+// UK lang variables
+
+tinyMCE.addToLang('emotions',{
+title : 'Insert emotion',
+desc : 'Emotions',
+cool : 'Cool',
+cry : 'Cry',
+embarassed : 'Embarassed',
+foot_in_mouth : 'Foot in mouth',
+frown : 'Frown',
+innocent : 'Innocent',
+kiss : 'Kiss',
+laughing : 'Laughing',
+money_mouth : 'Money mouth',
+sealed : 'Sealed',
+smile : 'Smile',
+surprised : 'Surprised',
+tongue_out : 'Tongue out',
+undecided : 'Undecided',
+wink : 'Wink',
+yell : 'Yell'
+});
diff --git a/program/js/tiny_mce/plugins/emotions/readme.txt b/program/js/tiny_mce/plugins/emotions/readme.txt
new file mode 100644
index 000000000..4fdb78aec
--- /dev/null
+++ b/program/js/tiny_mce/plugins/emotions/readme.txt
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.
diff --git a/program/js/tiny_mce/plugins/readme.txt b/program/js/tiny_mce/plugins/readme.txt
new file mode 100644
index 000000000..b694fdb6b
--- /dev/null
+++ b/program/js/tiny_mce/plugins/readme.txt
@@ -0,0 +1 @@
+This is the location you place TinyMCE plugins.
diff --git a/program/js/tiny_mce/plugins/searchreplace/editor_plugin.js b/program/js/tiny_mce/plugins/searchreplace/editor_plugin.js
new file mode 100644
index 000000000..a78b35e06
--- /dev/null
+++ b/program/js/tiny_mce/plugins/searchreplace/editor_plugin.js
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('searchreplace','en,tr,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,zh_tw,zh_tw_utf8,sk');var TinyMCE_SearchReplacePlugin={getInfo:function(){return{longname:'Search/Replace',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_searchreplace.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};},initInstance:function(inst){inst.addShortcut('ctrl','f','lang_searchreplace_search_desc','mceSearch',true);},getControlHTML:function(cn){switch(cn){case"search":return tinyMCE.getButtonHTML(cn,'lang_searchreplace_search_desc','{$pluginurl}/images/search.gif','mceSearch',true);case"replace":return tinyMCE.getButtonHTML(cn,'lang_searchreplace_replace_desc','{$pluginurl}/images/replace.gif','mceSearchReplace',true);}return"";},execCommand:function(editor_id,element,command,user_interface,value){var instance=tinyMCE.getInstanceById(editor_id);function defValue(key,default_value){value[key]=typeof(value[key])=="undefined"?default_value:value[key];}function replaceSel(search_str,str,back){instance.execCommand('mceInsertContent',false,str);}if(!value)value=new Array();defValue("editor_id",editor_id);defValue("searchstring","");defValue("replacestring",null);defValue("replacemode","none");defValue("casesensitive",false);defValue("backwards",false);defValue("wrap",false);defValue("wholeword",false);defValue("inline","yes");switch(command){case"mceResetSearch":tinyMCE.lastSearchRng=null;return true;case"mceSearch":if(user_interface){var template=new Array();if(value['replacestring']!=null){template['file']='../../plugins/searchreplace/replace.htm';template['width']=320;template['height']=100+(tinyMCE.isNS7?20:0);template['width']+=tinyMCE.getLang('lang_searchreplace_replace_delta_width',0);template['height']+=tinyMCE.getLang('lang_searchreplace_replace_delta_height',0);}else{template['file']='../../plugins/searchreplace/search.htm';template['width']=310;template['height']=105+(tinyMCE.isNS7?25:0);template['width']+=tinyMCE.getLang('lang_searchreplace_search_delta_width',0);template['height']+=tinyMCE.getLang('lang_searchreplace_replace_delta_height',0);}instance.execCommand('SelectAll');if(tinyMCE.isMSIE){var r=instance.selection.getRng();r.collapse(true);r.select();}else instance.selection.getSel().collapseToStart();tinyMCE.openWindow(template,value);}else{var win=tinyMCE.getInstanceById(editor_id).contentWindow;var doc=tinyMCE.getInstanceById(editor_id).contentWindow.document;var body=tinyMCE.getInstanceById(editor_id).contentWindow.document.body;if(body.innerHTML==""){alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true;}if(value['replacemode']=="current"){replaceSel(value['string'],value['replacestring'],value['backwards']);value['replacemode']="none";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true;}if(tinyMCE.isMSIE){var rng=tinyMCE.lastSearchRng?tinyMCE.lastSearchRng:doc.selection.createRange();var flags=0;if(value['wholeword'])flags=flags|2;if(value['casesensitive'])flags=flags|4;if(!rng.findText){alert('This operation is currently not supported by this browser.');return true;}if(value['replacemode']=="all"){while(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select();rng.collapse(false);replaceSel(value['string'],value['replacestring'],value['backwards']);}alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));return true;}if(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select();rng.collapse(value['backwards']);tinyMCE.lastSearchRng=rng;}else alert(tinyMCE.getLang('lang_searchreplace_notfound'));}else{if(value['replacemode']=="all"){while(win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))replaceSel(value['string'],value['replacestring'],value['backwards']);alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));return true;}if(!win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))alert(tinyMCE.getLang('lang_searchreplace_notfound'));}}return true;case"mceSearchReplace":value['replacestring']="";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true;}return false;}};tinyMCE.addPlugin("searchreplace",TinyMCE_SearchReplacePlugin); \ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js
new file mode 100644
index 000000000..eed96db9e
--- /dev/null
+++ b/program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js
@@ -0,0 +1,185 @@
+/**
+ * $RCSfile: editor_plugin_src.js,v $
+ * $Revision: 1.27 $
+ * $Date: 2006/02/13 15:09:28 $
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+/* Import theme specific language pack */
+tinyMCE.importPluginLanguagePack('searchreplace', 'en,tr,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,zh_tw,zh_tw_utf8,sk');
+
+var TinyMCE_SearchReplacePlugin = {
+ getInfo : function() {
+ return {
+ longname : 'Search/Replace',
+ author : 'Moxiecode Systems',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_searchreplace.html',
+ version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+ };
+ },
+
+ initInstance : function(inst) {
+ inst.addShortcut('ctrl', 'f', 'lang_searchreplace_search_desc', 'mceSearch', true);
+ },
+
+ getControlHTML : function(cn) {
+ switch (cn) {
+ case "search":
+ return tinyMCE.getButtonHTML(cn, 'lang_searchreplace_search_desc', '{$pluginurl}/images/search.gif', 'mceSearch', true);
+ case "replace":
+ return tinyMCE.getButtonHTML(cn, 'lang_searchreplace_replace_desc', '{$pluginurl}/images/replace.gif', 'mceSearchReplace', true);
+ }
+ return "";
+ },
+
+ /**
+ * Executes the search/replace commands.
+ */
+ execCommand : function(editor_id, element, command, user_interface, value) {
+ var instance = tinyMCE.getInstanceById(editor_id);
+
+ function defValue(key, default_value) {
+ value[key] = typeof(value[key]) == "undefined" ? default_value : value[key];
+ }
+
+ function replaceSel(search_str, str, back) {
+ instance.execCommand('mceInsertContent', false, str);
+ }
+
+ if (!value)
+ value = new Array();
+
+ // Setup defualt values
+ defValue("editor_id", editor_id);
+ defValue("searchstring", "");
+ defValue("replacestring", null);
+ defValue("replacemode", "none");
+ defValue("casesensitive", false);
+ defValue("backwards", false);
+ defValue("wrap", false);
+ defValue("wholeword", false);
+ defValue("inline", "yes");
+
+ // Handle commands
+ switch (command) {
+ case "mceResetSearch":
+ tinyMCE.lastSearchRng = null;
+ return true;
+
+ case "mceSearch":
+ if (user_interface) {
+ // Open search dialog
+ var template = new Array();
+
+ if (value['replacestring'] != null) {
+ template['file'] = '../../plugins/searchreplace/replace.htm'; // Relative to theme
+ template['width'] = 320;
+ template['height'] = 100 + (tinyMCE.isNS7 ? 20 : 0);
+ template['width'] += tinyMCE.getLang('lang_searchreplace_replace_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_searchreplace_replace_delta_height', 0);
+ } else {
+ template['file'] = '../../plugins/searchreplace/search.htm'; // Relative to theme
+ template['width'] = 310;
+ template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0);
+ template['width'] += tinyMCE.getLang('lang_searchreplace_search_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_searchreplace_replace_delta_height', 0);
+ }
+
+ instance.execCommand('SelectAll');
+
+ if (tinyMCE.isMSIE) {
+ var r = instance.selection.getRng();
+ r.collapse(true);
+ r.select();
+ } else
+ instance.selection.getSel().collapseToStart();
+
+ tinyMCE.openWindow(template, value);
+ } else {
+ var win = tinyMCE.getInstanceById(editor_id).contentWindow;
+ var doc = tinyMCE.getInstanceById(editor_id).contentWindow.document;
+ var body = tinyMCE.getInstanceById(editor_id).contentWindow.document.body;
+
+ // Whats the point
+ if (body.innerHTML == "") {
+ alert(tinyMCE.getLang('lang_searchreplace_notfound'));
+ return true;
+ }
+
+ // Handle replace current
+ if (value['replacemode'] == "current") {
+ replaceSel(value['string'], value['replacestring'], value['backwards']);
+
+ // Search next one
+ value['replacemode'] = "none";
+ tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false);
+
+ return true;
+ }
+
+ if (tinyMCE.isMSIE) {
+ var rng = tinyMCE.lastSearchRng ? tinyMCE.lastSearchRng : doc.selection.createRange();
+ var flags = 0;
+
+ if (value['wholeword'])
+ flags = flags | 2;
+
+ if (value['casesensitive'])
+ flags = flags | 4;
+
+ if (!rng.findText) {
+ alert('This operation is currently not supported by this browser.');
+ return true;
+ }
+
+ // Handle replace all mode
+ if (value['replacemode'] == "all") {
+ while (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) {
+ rng.scrollIntoView();
+ rng.select();
+ rng.collapse(false);
+ replaceSel(value['string'], value['replacestring'], value['backwards']);
+ }
+
+ alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));
+ return true;
+ }
+
+ if (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) {
+ rng.scrollIntoView();
+ rng.select();
+ rng.collapse(value['backwards']);
+ tinyMCE.lastSearchRng = rng;
+ } else
+ alert(tinyMCE.getLang('lang_searchreplace_notfound'));
+ } else {
+ if (value['replacemode'] == "all") {
+ while (win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false))
+ replaceSel(value['string'], value['replacestring'], value['backwards']);
+
+ alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));
+ return true;
+ }
+
+ if (!win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false))
+ alert(tinyMCE.getLang('lang_searchreplace_notfound'));
+ }
+ }
+ return true;
+
+ case "mceSearchReplace":
+ value['replacestring'] = "";
+
+ tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false);
+ return true;
+ }
+
+ // Pass to next handler in chain
+ return false;
+ }
+};
+
+tinyMCE.addPlugin("searchreplace", TinyMCE_SearchReplacePlugin);
diff --git a/program/js/tiny_mce/plugins/searchreplace/images/replace.gif b/program/js/tiny_mce/plugins/searchreplace/images/replace.gif
new file mode 100644
index 000000000..784c73e2a
--- /dev/null
+++ b/program/js/tiny_mce/plugins/searchreplace/images/replace.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/searchreplace/images/search.gif b/program/js/tiny_mce/plugins/searchreplace/images/search.gif
new file mode 100644
index 000000000..cfe76b5d5
--- /dev/null
+++ b/program/js/tiny_mce/plugins/searchreplace/images/search.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/searchreplace/jscripts/replace.js b/program/js/tiny_mce/plugins/searchreplace/jscripts/replace.js
new file mode 100644
index 000000000..3cb417813
--- /dev/null
+++ b/program/js/tiny_mce/plugins/searchreplace/jscripts/replace.js
@@ -0,0 +1,40 @@
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ var formObj = document.forms[0];
+
+ formObj.searchstring.value = tinyMCE.getWindowArg("searchstring");
+ formObj.replacestring.value = tinyMCE.getWindowArg("replacestring");
+ formObj.casesensitivebox.checked = tinyMCE.getWindowArg("casesensitive");
+// formObj.backwards[0].checked = tinyMCE.getWindowArg("backwards");
+// formObj.backwards[1].checked = !tinyMCE.getWindowArg("backwards");
+// formObj.wrapatend.checked = tinyMCE.getWindowArg("wrap");
+// formObj.wholeword.checked = tinyMCE.getWindowArg("wholeword");
+
+ tinyMCEPopup.execCommand("mceResetSearch", false, {dummy : ""}, false);
+}
+
+function searchNext(replacemode) {
+ var formObj = document.forms[0];
+
+ // Whats the point?
+ if (formObj.searchstring.value == "" || formObj.searchstring.value == formObj.replacestring.value)
+ return;
+
+ // Do search
+ tinyMCEPopup.execCommand('mceSearch', false, {
+ string : formObj.searchstring.value,
+ replacestring : formObj.replacestring.value,
+ replacemode : replacemode,
+ casesensitive : formObj.casesensitivebox.checked,
+ backwards : false
+// wrap : formObj.wrapatend.checked,
+// wholeword : formObj.wholeword.checked
+ }, false);
+
+ window.focus();
+}
+
+function cancelAction() {
+ tinyMCEPopup.close();
+}
diff --git a/program/js/tiny_mce/plugins/searchreplace/jscripts/search.js b/program/js/tiny_mce/plugins/searchreplace/jscripts/search.js
new file mode 100644
index 000000000..5202fdc50
--- /dev/null
+++ b/program/js/tiny_mce/plugins/searchreplace/jscripts/search.js
@@ -0,0 +1,36 @@
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ var formObj = document.forms[0];
+
+ formObj.searchstring.value = tinyMCE.getWindowArg("searchstring");
+ formObj.casesensitivebox.checked = tinyMCE.getWindowArg("casesensitive");
+ formObj.backwards[0].checked = tinyMCE.getWindowArg("backwards");
+ formObj.backwards[1].checked = !tinyMCE.getWindowArg("backwards");
+// formObj.wrapatend.checked = tinyMCE.getWindowArg("wrap");
+// formObj.wholeword.checked = tinyMCE.getWindowArg("wholeword");
+
+ tinyMCEPopup.execCommand("mceResetSearch", false, {dummy : ""}, false);
+}
+
+function searchNext() {
+ var formObj = document.forms[0];
+
+ if (formObj.searchstring.value == "")
+ return;
+
+ // Do search
+ tinyMCEPopup.execCommand('mceSearch', false, {
+ string : formObj.searchstring.value,
+ casesensitive : formObj.casesensitivebox.checked,
+ backwards : formObj.backwards[0].checked
+// wrap : formObj.wrapatend.checked,
+// wholeword : formObj.wholeword.checked
+ }, false);
+
+ window.focus();
+}
+
+function cancelAction() {
+ tinyMCEPopup.close();
+}
diff --git a/program/js/tiny_mce/plugins/searchreplace/langs/en.js b/program/js/tiny_mce/plugins/searchreplace/langs/en.js
new file mode 100644
index 000000000..32af8282e
--- /dev/null
+++ b/program/js/tiny_mce/plugins/searchreplace/langs/en.js
@@ -0,0 +1,21 @@
+// UK lang variables
+
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'Find',
+searchreplace_searchnext_desc : 'Find again',
+searchreplace_replace_desc : 'Find/Replace',
+searchreplace_notfound : 'The search has been completed. The search string could not be found.',
+searchreplace_search_title : 'Find',
+searchreplace_replace_title : 'Find/Replace',
+searchreplace_allreplaced : 'All occurrences of the search string were replaced.',
+searchreplace_findwhat : 'Find what',
+searchreplace_replacewith : 'Replace with',
+searchreplace_direction : 'Direction',
+searchreplace_up : 'Up',
+searchreplace_down : 'Down',
+searchreplace_case : 'Match case',
+searchreplace_findnext : 'Find&nbsp;next',
+searchreplace_replace : 'Replace',
+searchreplace_replaceall : 'Replace&nbsp;all',
+searchreplace_cancel : 'Cancel'
+});
diff --git a/program/js/tiny_mce/plugins/searchreplace/readme.txt b/program/js/tiny_mce/plugins/searchreplace/readme.txt
new file mode 100644
index 000000000..4fdb78aec
--- /dev/null
+++ b/program/js/tiny_mce/plugins/searchreplace/readme.txt
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.
diff --git a/program/js/tiny_mce/plugins/searchreplace/replace.htm b/program/js/tiny_mce/plugins/searchreplace/replace.htm
new file mode 100644
index 000000000..0629da334
--- /dev/null
+++ b/program/js/tiny_mce/plugins/searchreplace/replace.htm
@@ -0,0 +1,49 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_searchreplace_replace_title}</title>
+ <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/replace.js"></script>
+ <base target="_self" />
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none; margin: 4px;">
+<form onsubmit="searchNext('none');return false;" action="#">
+ <table border="0" cellspacing="0" cellpadding="2">
+ <tr>
+ <td><label for="searchstring">{$lang_searchreplace_findwhat}</label></td>
+ <td><input type="text" id="searchstring" name="searchstring" style="width: 200px" /></td>
+ </tr>
+ <tr>
+ <td><label for="replacestring">{$lang_searchreplace_replacewith}</label></td>
+ <td><input type="text" id="replacestring" name="replacestring" style="width: 200px" /></td>
+ </tr>
+ <tr>
+ <td colspan="2"><!--<table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><label>{$lang_searchreplace_direction}</label></td>
+ <td><input id="backwardsu" name="backwards" class="radio" type="radio" value="true" /></td>
+ <td><label for="backwardsu">{$lang_searchreplace_up}</label></td>
+ <td><input id="backwardsd" name="backwards" class="radio" type="radio" value="false" /></td>
+ <td><label for="backwardsd">{$lang_searchreplace_down}</label></td>
+ </tr>
+ </table>--></td>
+ </tr>
+ <tr>
+<td colspan="2"><table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><input id="casesensitivebox" name="casesensitivebox" class="checkbox" type="checkbox" value="true" /></td>
+ <td><label for="casesensitivebox">{$lang_searchreplace_case}</label></td>
+ </tr>
+</table></td>
+</tr>
+ </table>
+ <table border="0" width="300" cellspacing="0" cellpadding="4">
+ <tr>
+ <td><input id="insertBtn" name="insertBtn" type="button" value="{$lang_searchreplace_findnext}" onclick="searchNext('none');" /></td>
+ <td><input name="replaceBtn" type="button" id="replaceBtn" value="{$lang_searchreplace_replace}" onclick="searchNext('current');" /></td>
+ <td><input name="replaceBtn" type="button" id="replaceAllBtn" value="{$lang_searchreplace_replaceall}" onclick="searchNext('all');" /></td>
+ <td align="right"><input name="cancelBtn" type="button" id="cancelBtn" value="{$lang_searchreplace_cancel}" onclick="cancelAction();" /></td>
+ </tr>
+ </table>
+</form>
+</body>
+</html>
diff --git a/program/js/tiny_mce/plugins/searchreplace/search.htm b/program/js/tiny_mce/plugins/searchreplace/search.htm
new file mode 100644
index 000000000..fe9055ed5
--- /dev/null
+++ b/program/js/tiny_mce/plugins/searchreplace/search.htm
@@ -0,0 +1,42 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_searchreplace_search_title}</title>
+ <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/search.js"></script>
+ <base target="_self" />
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none; margin: 4px;">
+<form onsubmit="searchNext();return false;" action="#">
+ <table border="0" cellspacing="0" cellpadding="2">
+ <tr>
+ <td><label for="searchstring">{$lang_searchreplace_findwhat}</label>&nbsp;<input type="text" id="searchstring" name="searchstring" style="width: 200px" /></td>
+ </tr>
+ <tr>
+ <td><table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><label>{$lang_searchreplace_direction}</label></td>
+ <td><input id="backwardsu" name="backwards" class="radio" type="radio" value="true" /></td>
+ <td><label for="backwardsu">{$lang_searchreplace_up}</label></td>
+ <td><input id="backwardsd" name="backwards" class="radio" type="radio" value="false" /></td>
+ <td><label for="backwardsd">{$lang_searchreplace_down}</label></td>
+ </tr>
+ </table></td>
+ </tr>
+ <tr>
+<td><table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><input id="casesensitivebox" name="casesensitivebox" class="checkbox" type="checkbox" value="true" /></td>
+ <td><label for="casesensitivebox">{$lang_searchreplace_case}</label></td>
+ </tr>
+</table></td>
+</tr>
+ </table>
+ <table border="0" width="300" cellspacing="0" cellpadding="4">
+ <tr>
+ <td><input id="insert" name="insert" type="submit" value="{$lang_searchreplace_findnext}" /></td>
+ <td align="right"><input id="cancel" name="cancel" type="button" value="{$lang_searchreplace_cancel}" onclick="cancelAction();" /></td>
+ </tr>
+ </table>
+</form>
+</body>
+</html>
diff --git a/program/js/tiny_mce/plugins/table/cell.htm b/program/js/tiny_mce/plugins/table/cell.htm
new file mode 100644
index 000000000..7171d4faa
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/cell.htm
@@ -0,0 +1,182 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_table_cell_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/form_utils.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/cell.js"></script>
+ <link href="css/cell.css" rel="stylesheet" type="text/css" />
+ <base target="_self" />
+</head>
+<body id="tablecell" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+ <form onsubmit="updateAction();return false;" action="#">
+ <div class="tabs">
+ <ul>
+ <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>
+ <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_tab}</a></span></li>
+ </ul>
+ </div>
+
+ <div class="panel_wrapper">
+ <div id="general_panel" class="panel current">
+ <fieldset>
+ <legend>{$lang_table_general_props}</legend>
+
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <td><label for="align">{$lang_table_align}</label></td>
+ <td>
+ <select id="align" name="align">
+ <option value="">{$lang_not_set}</option>
+ <option value="center">{$lang_table_align_middle}</option>
+ <option value="left">{$lang_table_align_left}</option>
+ <option value="right">{$lang_table_align_right}</option>
+ </select>
+ </td>
+
+ <td><label for="celltype">{$lang_table_cell_type}</label></td>
+ <td>
+ <select id="celltype" name="celltype">
+ <option value="td">{$lang_table_td}</option>
+ <option value="th">{$lang_table_th}</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td><label for="valign">{$lang_table_valign}</label></td>
+ <td>
+ <select id="valign" name="valign">
+ <option value="">{$lang_not_set}</option>
+ <option value="top">{$lang_table_align_top}</option>
+ <option value="middle">{$lang_table_align_middle}</option>
+ <option value="bottom">{$lang_table_align_bottom}</option>
+ </select>
+ </td>
+
+ <td><label for="scope">{$lang_table_scope}</label></td>
+ <td>
+ <select id="scope" name="scope">
+ <option value="">{$lang_not_set}</option>
+ <option value="col">{$lang_table_col}</option>
+ <option value="row">{$lang_table_row}</option>
+ <option value="rowgroup">{$lang_table_rowgroup}</option>
+ <option value="colgroup">{$lang_table_colgroup}</option>
+ </select>
+ </td>
+
+ </tr>
+
+ <tr>
+ <td><label for="width">{$lang_table_width}</label></td>
+ <td><input id="width" name="width" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>
+
+ <td><label for="height">{$lang_table_height}</label></td>
+ <td><input id="height" name="height" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>
+ </tr>
+
+ <tr id="styleSelectRow">
+ <td><label for="class">{$lang_class_name}</label></td>
+ <td colspan="3">
+ <select id="class" name="class">
+ <option value="" selected="selected">{$lang_not_set}</option>
+ </select>
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+ </div>
+
+ <div id="advanced_panel" class="panel">
+ <fieldset>
+ <legend>{$lang_table_advanced_props}</legend>
+
+ <table border="0" cellpadding="0" cellspacing="4">
+ <tr>
+ <td class="column1"><label for="id">{$lang_table_id}</label></td>
+ <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td>
+ </tr>
+
+ <tr>
+ <td><label for="style">{$lang_table_style}</label></td>
+ <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="dir">{$lang_table_langdir}</label></td>
+ <td>
+ <select id="dir" name="dir" style="width: 200px">
+ <option value="">{$lang_not_set}</option>
+ <option value="ltr">{$lang_table_ltr}</option>
+ <option value="rtl">{$lang_table_rtl}</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="lang">{$lang_table_langcode}</label></td>
+ <td>
+ <input id="lang" name="lang" type="text" value="" style="width: 200px" />
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td>
+ <td>
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>
+ <td id="backgroundimagebrowsercontainer">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="bordercolor">{$lang_table_bordercolor}</label></td>
+ <td>
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>
+ <td id="bordercolor_pickcontainer">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td>
+ <td>
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>
+ <td id="bgcolor_pickcontainer">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+ </div>
+ </div>
+
+ <div class="mceActionPanel">
+ <div>
+ <select id="action" name="action">
+ <option value="cell">{$lang_table_cell_cell}</option>
+ <option value="row">{$lang_table_cell_row}</option>
+ <option value="all">{$lang_table_cell_all}</option>
+ </select>
+ </div>
+
+ <div style="float: left">
+ <div><input type="button" id="insert" name="insert" value="{$lang_update}" onclick="updateAction();" /></div>
+ </div>
+
+ <div style="float: right">
+ <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+ </div>
+ </div>
+ </form>
+</body>
+</html>
diff --git a/program/js/tiny_mce/plugins/table/css/cell.css b/program/js/tiny_mce/plugins/table/css/cell.css
new file mode 100644
index 000000000..a067ecdfe
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/css/cell.css
@@ -0,0 +1,17 @@
+/* CSS file for cell dialog in the table plugin */
+
+.panel_wrapper div.current {
+ height: 200px;
+}
+
+.advfield {
+ width: 200px;
+}
+
+#action {
+ margin-bottom: 3px;
+}
+
+#class {
+ width: 150px;
+} \ No newline at end of file
diff --git a/program/js/tiny_mce/plugins/table/css/row.css b/program/js/tiny_mce/plugins/table/css/row.css
new file mode 100644
index 000000000..1f7755daf
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/css/row.css
@@ -0,0 +1,25 @@
+/* CSS file for row dialog in the table plugin */
+
+.panel_wrapper div.current {
+ height: 200px;
+}
+
+.advfield {
+ width: 200px;
+}
+
+#action {
+ margin-bottom: 3px;
+}
+
+#rowtype,#align,#valign,#class,#height {
+ width: 150px;
+}
+
+#height {
+ width: 50px;
+}
+
+.col2 {
+ padding-left: 20px;
+}
diff --git a/program/js/tiny_mce/plugins/table/css/table.css b/program/js/tiny_mce/plugins/table/css/table.css
new file mode 100644
index 000000000..804f766ee
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/css/table.css
@@ -0,0 +1,13 @@
+/* CSS file for table dialog in the table plugin */
+
+.panel_wrapper div.current {
+ height: 220px;
+}
+
+.advfield {
+ width: 200px;
+}
+
+#class {
+ width: 150px;
+}
diff --git a/program/js/tiny_mce/plugins/table/editor_plugin.js b/program/js/tiny_mce/plugins/table/editor_plugin.js
new file mode 100644
index 000000000..2e0fd012b
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/editor_plugin.js
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('table','en,tr,ar,cs,da,de,el,es,fi,fr_ca,hu,it,ja,ko,nl,nb,pl,pt,pt_br,sv,tw,zh_cn,fr,de,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,is,zh_tw,zh_tw_utf8,sk');var TinyMCE_TablePlugin={getInfo:function(){return{longname:'Tables',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_table.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};},initInstance:function(inst){if(tinyMCE.isGecko){var doc=inst.getDoc();tinyMCE.addEvent(doc,"mouseup",TinyMCE_TablePlugin._mouseDownHandler);}inst.tableRowClipboard=null;},getControlHTML:function(control_name){var controls=new Array(['table','table.gif','lang_table_desc','mceInsertTable',true],['delete_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";var inst=tinyMCE.getInstanceById(editor_id);tinyMCE.switchClass(editor_id+'_table','mceButtonNormal');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+'_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){for(var y=0;y<grid.length;y++){for(var 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();var rows=table.rows;for(var y=0;y<rows.length;y++){for(var x=0;x<rows[y].cells.length;x++){var td=rows[y].cells[x];var sd=getColRowSpan(td);for(xstart=x;grid[y]&&grid[y][xstart];xstart++);for(var y2=y;y2<y+sd['rowspan'];y2++){if(!grid[y2])grid[y2]=new Array();for(var x2=xstart;x2<xstart+sd['colspan'];x2++){grid[y2][x2]=td;}}}}return grid;}function trimRow(table,tr,td,new_tr){var grid=getTableGrid(table);var cpos=getCellPos(grid,td);if(new_tr.cells.length!=tr.childNodes.length){var cells=tr.childNodes;var 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(tableElm!=trElm.parentNode)tableElm=trElm.parentNode;if(tableElm&&trElm){switch(command){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);break;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"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);}break;case"mceTableDeleteRow":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);if(grid.length==1){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;inst.selection.selectNode(getCell(grid,cpos.rowindex,0),true,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;}}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;}}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.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;inst.selection.selectNode(getCell(grid,0,cpos.cellindex),true,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/program/js/tiny_mce/plugins/table/editor_plugin_src.js b/program/js/tiny_mce/plugins/table/editor_plugin_src.js
new file mode 100644
index 000000000..4b512b42b
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/editor_plugin_src.js
@@ -0,0 +1,1054 @@
+/**
+ * $RCSfile: editor_plugin_src.js,v $
+ * $Revision: 1.38 $
+ * $Date: 2006/02/11 18:53:51 $
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('table', 'en,tr,ar,cs,da,de,el,es,fi,fr_ca,hu,it,ja,ko,nl,nb,pl,pt,pt_br,sv,tw,zh_cn,fr,de,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,is,zh_tw,zh_tw_utf8,sk');
+
+var TinyMCE_TablePlugin = {
+ getInfo : function() {
+ return {
+ longname : 'Tables',
+ author : 'Moxiecode Systems',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_table.html',
+ version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+ };
+ },
+
+ initInstance : function(inst) {
+ if (tinyMCE.isGecko) {
+ var doc = inst.getDoc();
+ tinyMCE.addEvent(doc, "mouseup", TinyMCE_TablePlugin._mouseDownHandler);
+ }
+
+ inst.tableRowClipboard = null;
+ },
+
+ /**
+ * Returns the HTML contents of the table control.
+ */
+ getControlHTML : function(control_name) {
+ var controls = new Array(
+ ['table', 'table.gif', 'lang_table_desc', 'mceInsertTable', true],
+ ['delete_col', 'table_delete_col.gif', 'lang_table_delete_col_desc', 'mceTableDeleteCol'],
+ ['delete_row', 'table_delete_row.gif', 'lang_table_delete_row_desc', 'mceTableDeleteRow'],
+ ['col_after', 'table_insert_col_after.gif', 'lang_table_col_after_desc', 'mceTableInsertColAfter'],
+ ['col_before', 'table_insert_col_before.gif', 'lang_table_col_before_desc', 'mceTableInsertColBefore'],
+ ['row_after', 'table_insert_row_after.gif', 'lang_table_row_after_desc', 'mceTableInsertRowAfter'],
+ ['row_before', 'table_insert_row_before.gif', 'lang_table_row_before_desc', 'mceTableInsertRowBefore'],
+ ['row_props', 'table_row_props.gif', 'lang_table_row_desc', 'mceTableRowProps', true],
+ ['cell_props', 'table_cell_props.gif', 'lang_table_cell_desc', 'mceTableCellProps', true],
+ ['split_cells', 'table_split_cells.gif', 'lang_table_split_cells_desc', 'mceTableSplitCells', true],
+ ['merge_cells', 'table_merge_cells.gif', 'lang_table_merge_cells_desc', 'mceTableMergeCells', true]);
+
+ // Render table control
+ for (var i=0; i<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));
+ }
+
+ // Special tablecontrols
+ if (control_name == "tablecontrols") {
+ var html = "";
+
+ html += tinyMCE.getControlHTML("table");
+ html += tinyMCE.getControlHTML("separator");
+ html += tinyMCE.getControlHTML("row_props");
+ html += tinyMCE.getControlHTML("cell_props");
+ html += tinyMCE.getControlHTML("separator");
+ html += tinyMCE.getControlHTML("row_before");
+ html += tinyMCE.getControlHTML("row_after");
+ html += tinyMCE.getControlHTML("delete_row");
+ html += tinyMCE.getControlHTML("separator");
+ html += tinyMCE.getControlHTML("col_before");
+ html += tinyMCE.getControlHTML("col_after");
+ html += tinyMCE.getControlHTML("delete_col");
+ html += tinyMCE.getControlHTML("separator");
+ html += tinyMCE.getControlHTML("split_cells");
+ html += tinyMCE.getControlHTML("merge_cells");
+
+ return html;
+ }
+
+ return "";
+ },
+
+ /**
+ * Executes the table commands.
+ */
+ execCommand : function(editor_id, element, command, user_interface, value) {
+ // Is table command
+ switch (command) {
+ case "mceInsertTable":
+ case "mceTableRowProps":
+ case "mceTableCellProps":
+ case "mceTableSplitCells":
+ case "mceTableMergeCells":
+ case "mceTableInsertRowBefore":
+ case "mceTableInsertRowAfter":
+ case "mceTableDeleteRow":
+ case "mceTableInsertColBefore":
+ case "mceTableInsertColAfter":
+ case "mceTableDeleteCol":
+ case "mceTableCutRow":
+ case "mceTableCopyRow":
+ case "mceTablePasteRowBefore":
+ case "mceTablePasteRowAfter":
+ case "mceTableDelete":
+ var inst = tinyMCE.getInstanceById(editor_id);
+
+ inst.execCommand('mceBeginUndoLevel');
+ TinyMCE_TablePlugin._doExecCommand(editor_id, element, command, user_interface, value);
+ inst.execCommand('mceEndUndoLevel');
+
+ return true;
+ }
+
+ // Pass to next handler in chain
+ return false;
+ },
+
+ handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
+ var colspan = "1", rowspan = "1";
+
+ var inst = tinyMCE.getInstanceById(editor_id);
+
+ // Reset table controls
+ tinyMCE.switchClass(editor_id + '_table', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_cell_props', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_row_before', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_row_after', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_delete_row', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_col_before', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_col_after', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_delete_col', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_split_cells', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_merge_cells', 'mceButtonDisabled');
+
+ // Within a td element
+ if (tdElm = tinyMCE.getParentElement(node, "td,th")) {
+ tinyMCE.switchClass(editor_id + '_cell_props', 'mceButtonSelected');
+ tinyMCE.switchClass(editor_id + '_row_before', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_row_after', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_delete_row', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_col_before', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_col_after', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_delete_col', 'mceButtonNormal');
+
+ colspan = tinyMCE.getAttrib(tdElm, "colspan");
+ rowspan = tinyMCE.getAttrib(tdElm, "rowspan");
+
+ colspan = colspan == "" ? "1" : colspan;
+ rowspan = rowspan == "" ? "1" : rowspan;
+
+ if (colspan != "1" || rowspan != "1")
+ tinyMCE.switchClass(editor_id + '_split_cells', 'mceButtonNormal');
+ }
+
+ // Within a tr element
+ if (tinyMCE.getParentElement(node, "tr"))
+ tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonSelected');
+
+ // Within table
+ if (tinyMCE.getParentElement(node, "table")) {
+ tinyMCE.switchClass(editor_id + '_table', 'mceButtonSelected');
+ tinyMCE.switchClass(editor_id + '_merge_cells', 'mceButtonNormal');
+ }
+ },
+
+ // Private plugin internal methods
+
+ _mouseDownHandler : function(e) {
+ var elm = tinyMCE.isMSIE ? event.srcElement : e.target;
+ var focusElm = tinyMCE.selectedInstance.getFocusElement();
+
+ // If press on special Mozilla create TD/TR thingie
+ if (elm.nodeName == "BODY" && (focusElm.nodeName == "TD" || focusElm.nodeName == "TH" || (focusElm.parentNode && focusElm.parentNode.nodeName == "TD") ||(focusElm.parentNode && focusElm.parentNode.nodeName == "TH") )) {
+ window.setTimeout(function() {
+ var tableElm = tinyMCE.getParentElement(focusElm, "table");
+ tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);
+ }, 10);
+ }
+ },
+
+ /**
+ * Executes the table commands.
+ */
+ _doExecCommand : function(editor_id, element, command, user_interface, value) {
+ var inst = tinyMCE.getInstanceById(editor_id);
+ var focusElm = inst.getFocusElement();
+ var trElm = tinyMCE.getParentElement(focusElm, "tr");
+ var tdElm = tinyMCE.getParentElement(focusElm, "td,th");
+ var tableElm = tinyMCE.getParentElement(focusElm, "table");
+ var doc = inst.contentWindow.document;
+ var tableBorder = tableElm ? tableElm.getAttribute("border") : "";
+
+ // Get first TD if no TD found
+ if (trElm && tdElm == null)
+ tdElm = trElm.cells[0];
+
+ // ------- Inner functions ---------
+ function inArray(ar, v) {
+ for (var i=0; i<ar.length; i++) {
+ // Is array
+ if (ar[i].length > 0 && inArray(ar[i], v))
+ return true;
+
+ // Found value
+ if (ar[i] == v)
+ return true;
+ }
+
+ return false;
+ }
+
+ function makeTD() {
+ var newTD = doc.createElement("td");
+ newTD.innerHTML = "&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) {
+ for (var y=0; y<grid.length; y++) {
+ for (var 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();
+ var rows = table.rows;
+
+ for (var y=0; y<rows.length; y++) {
+ for (var x=0; x<rows[y].cells.length; x++) {
+ var td = rows[y].cells[x];
+ var sd = getColRowSpan(td);
+
+ // All ready filled
+ for (xstart = x; grid[y] && grid[y][xstart]; xstart++) ;
+
+ // Fill box
+ for (var y2=y; y2<y+sd['rowspan']; y2++) {
+ if (!grid[y2])
+ grid[y2] = new Array();
+
+ for (var x2=xstart; x2<xstart+sd['colspan']; x2++) {
+ grid[y2][x2] = td;
+ }
+ }
+ }
+ }
+
+ return grid;
+ }
+
+ function trimRow(table, tr, td, new_tr) {
+ var grid = getTableGrid(table);
+ var cpos = getCellPos(grid, td);
+
+ // Time to crop away some
+ if (new_tr.cells.length != tr.childNodes.length) {
+ var cells = tr.childNodes;
+ var lastElm = null;
+
+ for (var x=0; td = getCell(grid, cpos.rowindex, x); x++) {
+ var remove = true;
+ var sd = getColRowSpan(td);
+
+ // Remove due to rowspan
+ if (inArray(cells, td)) {
+ new_tr.childNodes[x]._delete = true;
+ } else if ((lastElm == null || td != lastElm) && sd.colspan > 1) { // Remove due to colspan
+ 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");
+
+ // Delete row
+ if (tr._delete) {
+ tr.parentNode.removeChild(tr);
+ continue;
+ }
+
+ // Delete cells
+ 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) {
+ // Add rows
+ 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;";
+ }
+
+ // Reset col/row span
+ newTD.colSpan = 1;
+ newTD.rowSpan = 1;
+
+ newTR.appendChild(newTD);
+
+ lastCell = tdElm;
+ }
+
+ return newTR;
+ }
+
+ // ---- Commands -----
+
+ // Handle commands
+ switch (command) {
+ case "mceTableRowProps":
+ if (trElm == null)
+ return true;
+
+ if (user_interface) {
+ // Setup template
+ var template = new Array();
+
+ template['file'] = '../../plugins/table/row.htm';
+ template['width'] = 380;
+ template['height'] = 295;
+
+ // Language specific width and height addons
+ template['width'] += tinyMCE.getLang('lang_table_rowprops_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_table_rowprops_delta_height', 0);
+
+ // Open window
+ tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes"});
+ }
+
+ return true;
+
+ case "mceTableCellProps":
+ if (tdElm == null)
+ return true;
+
+ if (user_interface) {
+ // Setup template
+ var template = new Array();
+
+ template['file'] = '../../plugins/table/cell.htm';
+ template['width'] = 380;
+ template['height'] = 295;
+
+ // Language specific width and height addons
+ template['width'] += tinyMCE.getLang('lang_table_cellprops_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_table_cellprops_delta_height', 0);
+
+ // Open window
+ tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes"});
+ }
+
+ return true;
+
+ case "mceInsertTable":
+ if (user_interface) {
+ // Setup template
+ var template = new Array();
+
+ template['file'] = '../../plugins/table/table.htm';
+ template['width'] = 380;
+ template['height'] = 295;
+
+ // Language specific width and height addons
+ template['width'] += tinyMCE.getLang('lang_table_table_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_table_table_delta_height', 0);
+
+ // Open window
+ 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":
+ // No table just return (invalid command)
+ if (!tableElm)
+ return true;
+
+ // Table has a tbody use that reference
+ // Changed logic by ApTest 2005.07.12 (www.aptest.com)
+ // Now lookk at the focused element and take its parentNode. That will be a tbody or a table.
+ if (tableElm != trElm.parentNode)
+ tableElm = trElm.parentNode;
+
+ if (tableElm && trElm) {
+ switch (command) {
+ 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;
+
+ // Create cells
+ 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);
+ break;
+
+ 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 "mceTableInsertRowAfter":
+ if (!trElm || !tdElm)
+ return true;
+
+ var grid = getTableGrid(tableElm);
+ var cpos = getCellPos(grid, tdElm);
+ var newTR = doc.createElement("tr");
+ var lastTDElm = null;
+
+ // Create cells
+ 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);
+ }
+ break;
+
+ case "mceTableDeleteRow":
+ if (!trElm || !tdElm)
+ return true;
+
+ var grid = getTableGrid(tableElm);
+ var cpos = getCellPos(grid, tdElm);
+
+ // Only one row, remove whole table
+ if (grid.length == 1) {
+ tableElm.parentNode.removeChild(tableElm);
+ return true;
+ }
+
+ // Move down row spanned cells
+ 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);
+ }
+ }
+
+ // Delete cells
+ var lastTDElm = null;
+ for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
+ if (tdElm != lastTDElm) {
+ var sd = getColRowSpan(tdElm);
+
+ if (sd.rowspan > 1) {
+ tdElm.rowSpan = sd.rowspan - 1;
+ } else {
+ trElm = tdElm.parentNode;
+
+ if (trElm.parentNode)
+ trElm._delete = true;
+ }
+
+ lastTDElm = tdElm;
+ }
+ }
+
+ deleteMarked(tableElm);
+
+ cpos.rowindex--;
+ if (cpos.rowindex < 0)
+ cpos.rowindex = 0;
+
+ inst.selection.selectNode(getCell(grid, cpos.rowindex, 0), true, 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;
+ }
+ }
+ 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;
+ }
+ }
+ break;
+
+ case "mceTableDeleteCol":
+ if (!trElm || !tdElm)
+ return true;
+
+ var grid = getTableGrid(tableElm);
+ var cpos = getCellPos(grid, tdElm);
+ var lastTDElm = null;
+
+ // Only one col, remove whole table
+ if (grid.length > 1 && grid[0].length <= 1) {
+ tableElm.parentNode.removeChild(tableElm);
+ return true;
+ }
+
+ // Delete cells
+ for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
+ if (tdElm != lastTDElm) {
+ var sd = getColRowSpan(tdElm);
+
+ if (sd['colspan'] > 1)
+ tdElm.colSpan = sd['colspan'] - 1;
+ else {
+ if (tdElm.parentNode)
+ tdElm.parentNode.removeChild(tdElm);
+ }
+
+ lastTDElm = tdElm;
+ }
+ }
+
+ cpos.cellindex--;
+ if (cpos.cellindex < 0)
+ cpos.cellindex = 0;
+
+ inst.selection.selectNode(getCell(grid, 0, cpos.cellindex), true, true);
+ break;
+
+ case "mceTableSplitCells":
+ if (!trElm || !tdElm)
+ return true;
+
+ var spandata = getColRowSpan(tdElm);
+
+ var colspan = spandata["colspan"];
+ var rowspan = spandata["rowspan"];
+
+ // Needs splitting
+ if (colspan > 1 || rowspan > 1) {
+ // Generate cols
+ tdElm.colSpan = 1;
+ for (var i=1; i<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);
+ }
+
+ // Apply visual aids
+ tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");
+ break;
+
+ case "mceTableMergeCells":
+ var rows = new Array();
+ var sel = inst.getSel();
+ var grid = getTableGrid(tableElm);
+
+ if (tinyMCE.isMSIE || sel.rangeCount == 1) {
+ if (user_interface) {
+ // Setup template
+ var template = new Array();
+ var sp = getColRowSpan(tdElm);
+
+ template['file'] = '../../plugins/table/merge_cells.htm';
+ template['width'] = 250;
+ template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0);
+
+ // Language specific width and height addons
+ template['width'] += tinyMCE.getLang('lang_table_merge_cells_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_table_merge_cells_delta_height', 0);
+
+ // Open window
+ tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : "update", numcols : sp.colspan, numrows : sp.rowspan});
+
+ return true;
+ } else {
+ var numRows = parseInt(value['numrows']);
+ var numCols = parseInt(value['numcols']);
+ var cpos = getCellPos(grid, tdElm);
+
+ if (("" + numRows) == "NaN")
+ numRows = 1;
+
+ if (("" + numCols) == "NaN")
+ numCols = 1;
+
+ // Get rows and cells
+ var tRows = tableElm.rows;
+ for (var y=cpos.rowindex; y<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);
+
+ // Within range
+ if (cp.cellindex < cpos.cellindex+numCols && cp.rowindex < cpos.rowindex+numRows)
+ rowCells[rowCells.length] = td;
+ }
+ }
+
+ if (rowCells.length > 0)
+ rows[rows.length] = rowCells;
+ }
+
+ //return true;
+ }
+ } else {
+ var cells = new Array();
+ var sel = inst.getSel();
+ var lastTR = null;
+ var curRow = null;
+ var x1 = -1, y1 = -1, x2, y2;
+
+ // Only one cell selected, whats the point?
+ if (sel.rangeCount < 2)
+ return true;
+
+ // Get all selected cells
+ for (var i=0; i<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;
+ }
+
+ // Get rows and cells
+ 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;
+ }
+
+ // Find selected cells in grid and box
+ 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]) {
+ // Get start pos
+ if (x1 == -1) {
+ x1 = x;
+ y1 = y;
+ }
+
+ // Get end pos
+ x2 = x;
+ y2 = y;
+
+ grid[y][x]._selected = true;
+ }
+ }
+ }
+ }
+
+ // Is there gaps, if so deny
+ 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;
+ }
+ }
+ }
+ }
+
+ // Validate selection and get total rowspan and colspan
+ var rowSpan = 1, colSpan = 1;
+
+ // Validate horizontal and get total colspan
+ 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;
+ }
+
+ // Validate vertical and get total rowspan
+ 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;
+ }
+
+ // Setup td
+ tdElm = rows[0][0];
+ tdElm.rowSpan = rowSpan;
+ tdElm.colSpan = colSpan;
+
+ // Merge cells
+ 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;
+
+ // Not current cell
+ if (rows[y][x] != tdElm && !rows[y][x]._deleted) {
+ var cpos = getCellPos(grid, rows[y][x]);
+ var tr = rows[y][x].parentNode;
+
+ tr.removeChild(rows[y][x]);
+ rows[y][x]._deleted = true;
+
+ // Empty TR, remove it
+ if (!tr.hasChildNodes()) {
+ tr.parentNode.removeChild(tr);
+
+ var lastCell = null;
+ for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) {
+ if (cellElm != lastCell && cellElm.rowSpan > 1)
+ cellElm.rowSpan--;
+
+ lastCell = cellElm;
+ }
+
+ if (tdElm.rowSpan > 1)
+ tdElm.rowSpan--;
+ }
+ }
+ }
+ }
+
+ break;
+ }
+
+ tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");
+ tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);
+ tinyMCE.triggerNodeChange();
+ inst.repaint();
+ }
+
+ return true;
+ }
+
+ // Pass to next handler in chain
+ return false;
+ }
+};
+
+tinyMCE.addPlugin("table", TinyMCE_TablePlugin);
diff --git a/program/js/tiny_mce/plugins/table/images/buttons.gif b/program/js/tiny_mce/plugins/table/images/buttons.gif
new file mode 100644
index 000000000..bfc1568be
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/buttons.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table.gif b/program/js/tiny_mce/plugins/table/images/table.gif
new file mode 100644
index 000000000..2911830c3
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_cell_props.gif b/program/js/tiny_mce/plugins/table/images/table_cell_props.gif
new file mode 100644
index 000000000..bee7ed652
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_cell_props.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_delete.gif b/program/js/tiny_mce/plugins/table/images/table_delete.gif
new file mode 100644
index 000000000..2a00e6ad6
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_delete.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_delete_col.gif b/program/js/tiny_mce/plugins/table/images/table_delete_col.gif
new file mode 100644
index 000000000..91f53af02
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_delete_col.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_delete_row.gif b/program/js/tiny_mce/plugins/table/images/table_delete_row.gif
new file mode 100644
index 000000000..7025733fe
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_delete_row.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif b/program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif
new file mode 100644
index 000000000..85058080c
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif b/program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif
new file mode 100644
index 000000000..b669d4fa6
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif b/program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif
new file mode 100644
index 000000000..b9c144661
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif b/program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif
new file mode 100644
index 000000000..157d37365
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_merge_cells.gif b/program/js/tiny_mce/plugins/table/images/table_merge_cells.gif
new file mode 100644
index 000000000..6834e611e
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_merge_cells.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_row_props.gif b/program/js/tiny_mce/plugins/table/images/table_row_props.gif
new file mode 100644
index 000000000..e5c7cc37a
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_row_props.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/images/table_split_cells.gif b/program/js/tiny_mce/plugins/table/images/table_split_cells.gif
new file mode 100644
index 000000000..8ccb1b5f8
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/images/table_split_cells.gif
Binary files differ
diff --git a/program/js/tiny_mce/plugins/table/jscripts/cell.js b/program/js/tiny_mce/plugins/table/jscripts/cell.js
new file mode 100644
index 000000000..436eaad17
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/jscripts/cell.js
@@ -0,0 +1,249 @@
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+ document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');
+ document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor')
+
+ var inst = tinyMCE.selectedInstance;
+ var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th");
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(tinyMCE.getAttrib(tdElm, "style"));
+
+ // Get table cell data
+ var celltype = tdElm.nodeName.toLowerCase();
+ var align = tinyMCE.getAttrib(tdElm, 'align');
+ var valign = tinyMCE.getAttrib(tdElm, 'valign');
+ var width = trimSize(getStyle(tdElm, 'width', 'width'));
+ var height = trimSize(getStyle(tdElm, 'height', 'height'));
+ var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor'));
+ var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor'));
+ var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tdElm, 'class'), false);
+ var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;
+ var id = tinyMCE.getAttrib(tdElm, 'id');
+ var lang = tinyMCE.getAttrib(tdElm, 'lang');
+ var dir = tinyMCE.getAttrib(tdElm, 'dir');
+ var scope = tinyMCE.getAttrib(tdElm, 'scope');
+
+ // Setup form
+ addClassesToList('class', 'table_cell_styles');
+ formObj.bordercolor.value = bordercolor;
+ formObj.bgcolor.value = bgcolor;
+ formObj.backgroundimage.value = backgroundimage;
+ formObj.width.value = width;
+ formObj.height.value = height;
+ formObj.id.value = id;
+ formObj.lang.value = lang;
+ formObj.style.value = tinyMCE.serializeStyle(st);
+ selectByValue(formObj, 'align', align);
+ selectByValue(formObj, 'valign', valign);
+ selectByValue(formObj, 'class', className);
+ selectByValue(formObj, 'celltype', celltype);
+ selectByValue(formObj, 'dir', dir);
+ selectByValue(formObj, 'scope', scope);
+
+ // Resize some elements
+ if (isVisible('backgroundimagebrowser'))
+ document.getElementById('backgroundimage').style.width = '180px';
+
+ updateColor('bordercolor_pick', 'bordercolor');
+ updateColor('bgcolor_pick', 'bgcolor');
+}
+
+function updateAction() {
+ tinyMCEPopup.restoreSelection();
+
+ var inst = tinyMCE.selectedInstance;
+ var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th");
+ var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");
+ var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");
+ var formObj = document.forms[0];
+
+ inst.execCommand('mceBeginUndoLevel');
+
+ switch (getSelectValue(formObj, 'action')) {
+ case "cell":
+ var celltype = getSelectValue(formObj, 'celltype');
+ var scope = getSelectValue(formObj, 'scope');
+
+ if (tinyMCE.getParam("accessibility_warnings")) {
+ if (celltype == "th" && scope == "")
+ var answer = confirm(tinyMCE.getLang('lang_table_missing_scope', '', true));
+ else
+ var answer = true;
+
+ if (!answer)
+ return;
+ }
+
+ updateCell(tdElm);
+ break;
+
+ case "row":
+ var cell = trElm.firstChild;
+
+ if (cell.nodeName != "TD" && cell.nodeName != "TH")
+ cell = nextCell(cell);
+
+ do {
+ cell = updateCell(cell, true);
+ } while ((cell = nextCell(cell)) != null);
+
+ break;
+
+ case "all":
+ var rows = tableElm.getElementsByTagName("tr");
+
+ for (var i=0; i<rows.length; i++) {
+ var cell = rows[i].firstChild;
+
+ if (cell.nodeName != "TD" && cell.nodeName != "TH")
+ cell = nextCell(cell);
+
+ do {
+ cell = updateCell(cell, true);
+ } while ((cell = nextCell(cell)) != null);
+ }
+
+ break;
+ }
+
+ tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
+ tinyMCE.triggerNodeChange();
+ inst.execCommand('mceEndUndoLevel');
+ tinyMCEPopup.close();
+}
+
+function nextCell(elm) {
+ while ((elm = elm.nextSibling) != null) {
+ if (elm.nodeName == "TD" || elm.nodeName == "TH")
+ return elm;
+ }
+
+ return null;
+}
+
+function updateCell(td, skip_id) {
+ var inst = tinyMCE.selectedInstance;
+ var formObj = document.forms[0];
+ var curCellType = td.nodeName.toLowerCase();
+ var celltype = getSelectValue(formObj, 'celltype');
+ var doc = inst.getDoc();
+
+ if (!skip_id)
+ td.setAttribute('id', formObj.id.value);
+
+ td.setAttribute('align', formObj.align.value);
+ td.setAttribute('vAlign', formObj.valign.value);
+ td.setAttribute('lang', formObj.lang.value);
+ td.setAttribute('dir', getSelectValue(formObj, 'dir'));
+ td.setAttribute('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(formObj.style.value)));
+ td.setAttribute('scope', formObj.scope.value);
+ tinyMCE.setAttrib(td, 'class', getSelectValue(formObj, 'class'));
+
+ // Clear deprecated attributes
+ tinyMCE.setAttrib(td, 'width', '');
+ tinyMCE.setAttrib(td, 'height', '');
+ tinyMCE.setAttrib(td, 'bgColor', '');
+ tinyMCE.setAttrib(td, 'borderColor', '');
+ tinyMCE.setAttrib(td, 'background', '');
+
+ // Set styles
+ td.style.width = getCSSSize(formObj.width.value);
+ td.style.height = getCSSSize(formObj.height.value);
+ if (formObj.bordercolor.value != "") {
+ td.style.borderColor = formObj.bordercolor.value;
+ td.style.borderStyle = td.style.borderStyle == "" ? "solid" : td.style.borderStyle;
+ td.style.borderWidth = td.style.borderWidth == "" ? "1px" : td.style.borderWidth;
+ } else
+ td.style.borderColor = '';
+
+ td.style.backgroundColor = formObj.bgcolor.value;
+
+ if (formObj.backgroundimage.value != "")
+ td.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";
+ else
+ td.style.backgroundImage = '';
+
+ if (curCellType != celltype) {
+ // changing to a different node type
+ var newCell = doc.createElement(celltype);
+
+ for (var c=0; c<td.childNodes.length; c++)
+ newCell.appendChild(td.childNodes[c].cloneNode(1));
+
+ for (var a=0; a<td.attributes.length; a++) {
+ var attr = td.attributes[a];
+ newCell.setAttribute(attr.name, attr.value);
+ }
+
+ td.parentNode.replaceChild(newCell, td);
+ td = newCell;
+ }
+
+ return td;
+}
+
+function changedBackgroundImage() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ st['background-image'] = "url('" + formObj.backgroundimage.value + "')";
+
+ formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedSize() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ var width = formObj.width.value;
+ if (width != "")
+ st['width'] = getCSSSize(width);
+ else
+ st['width'] = "";
+
+ var height = formObj.height.value;
+ if (height != "")
+ st['height'] = getCSSSize(height);
+ else
+ st['height'] = "";
+
+ formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedColor() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ st['background-color'] = formObj.bgcolor.value;
+ st['border-color'] = formObj.bordercolor.value;
+
+ formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedStyle() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ if (st['background-image'])
+ formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+ else
+ formObj.backgroundimage.value = '';
+
+ if (st['width'])
+ formObj.width.value = trimSize(st['width']);
+
+ if (st['height'])
+ formObj.height.value = trimSize(st['height']);
+
+ if (st['background-color']) {
+ formObj.bgcolor.value = st['background-color'];
+ updateColor('bgcolor_pick','bgcolor');
+ }
+
+ if (st['border-color']) {
+ formObj.bordercolor.value = st['border-color'];
+ updateColor('bordercolor_pick','bordercolor');
+ }
+}
diff --git a/program/js/tiny_mce/plugins/table/jscripts/merge_cells.js b/program/js/tiny_mce/plugins/table/jscripts/merge_cells.js
new file mode 100644
index 000000000..51a274962
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/jscripts/merge_cells.js
@@ -0,0 +1,19 @@
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ var formObj = document.forms[0];
+
+ formObj.numcols.value = tinyMCE.getWindowArg('numcols', 1);
+ formObj.numrows.value = tinyMCE.getWindowArg('numrows', 1);
+}
+
+function mergeCells() {
+ var args = new Array();
+ var formObj = document.forms[0];
+
+ args["numcols"] = formObj.numcols.value;
+ args["numrows"] = formObj.numrows.value;
+
+ tinyMCEPopup.execCommand("mceTableMergeCells", false, args);
+ tinyMCEPopup.close();
+}
diff --git a/program/js/tiny_mce/plugins/table/jscripts/row.js b/program/js/tiny_mce/plugins/table/jscripts/row.js
new file mode 100644
index 000000000..395ddf028
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/jscripts/row.js
@@ -0,0 +1,200 @@
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+ document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+
+ var inst = tinyMCE.selectedInstance;
+ var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(tinyMCE.getAttrib(trElm, "style"));
+
+ // Get table row data
+ var rowtype = trElm.parentNode.nodeName.toLowerCase();
+ var align = tinyMCE.getAttrib(trElm, 'align');
+ var valign = tinyMCE.getAttrib(trElm, 'valign');
+ var height = trimSize(getStyle(trElm, 'height', 'height'));
+ var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(trElm, 'class'), false);
+ var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor'));
+ var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;
+ var id = tinyMCE.getAttrib(trElm, 'id');
+ var lang = tinyMCE.getAttrib(trElm, 'lang');
+ var dir = tinyMCE.getAttrib(trElm, 'dir');
+
+ // Setup form
+ addClassesToList('class', 'table_row_styles');
+ formObj.bgcolor.value = bgcolor;
+ formObj.backgroundimage.value = backgroundimage;
+ formObj.height.value = height;
+ formObj.id.value = id;
+ formObj.lang.value = lang;
+ formObj.style.value = tinyMCE.serializeStyle(st);
+ selectByValue(formObj, 'align', align);
+ selectByValue(formObj, 'valign', valign);
+ selectByValue(formObj, 'class', className);
+ selectByValue(formObj, 'rowtype', rowtype);
+ selectByValue(formObj, 'dir', dir);
+
+ // Resize some elements
+ if (isVisible('backgroundimagebrowser'))
+ document.getElementById('backgroundimage').style.width = '180px';
+
+ updateColor('bgcolor_pick', 'bgcolor');
+}
+
+function updateAction() {
+ tinyMCEPopup.restoreSelection();
+
+ var inst = tinyMCE.selectedInstance;
+ var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");
+ var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");
+ var formObj = document.forms[0];
+ var action = getSelectValue(formObj, 'action');
+
+ inst.execCommand('mceBeginUndoLevel');
+
+ switch (action) {
+ case "row":
+ updateRow(trElm);
+ break;
+
+ case "all":
+ var rows = tableElm.getElementsByTagName("tr");
+
+ for (var i=0; i<rows.length; i++)
+ updateRow(rows[i], true);
+
+ break;
+
+ case "odd":
+ case "even":
+ var rows = tableElm.getElementsByTagName("tr");
+
+ for (var i=0; i<rows.length; i++) {
+ if ((i % 2 == 0 && action == "odd") || (i % 2 != 0 && action == "even"))
+ updateRow(rows[i], true, true);
+ }
+
+ break;
+ }
+
+ tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
+ tinyMCE.triggerNodeChange();
+ inst.execCommand('mceEndUndoLevel');
+ tinyMCEPopup.close();
+}
+
+function updateRow(tr_elm, skip_id, skip_parent) {
+ var inst = tinyMCE.selectedInstance;
+ var formObj = document.forms[0];
+ var curRowType = tr_elm.parentNode.nodeName.toLowerCase();
+ var rowtype = getSelectValue(formObj, 'rowtype');
+ var doc = inst.getDoc();
+
+ // Update row element
+ if (!skip_id)
+ tr_elm.setAttribute('id', formObj.id.value);
+
+ tr_elm.setAttribute('align', getSelectValue(formObj, 'align'));
+ tr_elm.setAttribute('vAlign', getSelectValue(formObj, 'valign'));
+ tr_elm.setAttribute('lang', formObj.lang.value);
+ tr_elm.setAttribute('dir', getSelectValue(formObj, 'dir'));
+ tr_elm.setAttribute('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(formObj.style.value)));
+ tinyMCE.setAttrib(tr_elm, 'class', getSelectValue(formObj, 'class'));
+
+ // Clear deprecated attributes
+ tr_elm.setAttribute('background', '');
+ tr_elm.setAttribute('bgColor', '');
+ tr_elm.setAttribute('height', '');
+
+ // Set styles
+ tr_elm.style.height = getCSSSize(formObj.height.value);
+ tr_elm.style.backgroundColor = formObj.bgcolor.value;
+
+ if (formObj.backgroundimage.value != "")
+ tr_elm.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";
+ else
+ tr_elm.style.backgroundImage = '';
+
+ // Setup new rowtype
+ if (curRowType != rowtype && !skip_parent) {
+ // first, clone the node we are working on
+ var newRow = tr_elm.cloneNode(1);
+
+ // next, find the parent of its new destination (creating it if necessary)
+ var theTable = tinyMCE.getParentElement(tr_elm, "table");
+ var dest = rowtype;
+ var newParent = null;
+ for (var i = 0; i < theTable.childNodes.length; i++) {
+ if (theTable.childNodes[i].nodeName.toLowerCase() == dest)
+ newParent = theTable.childNodes[i];
+ }
+
+ if (newParent == null) {
+ newParent = doc.createElement(dest);
+
+ if (dest == "thead")
+ theTable.insertBefore(newParent, theTable.firstChild);
+ else
+ theTable.appendChild(newParent);
+ }
+
+ // append the row to the new parent
+ newParent.appendChild(newRow);
+
+ // remove the original
+ tr_elm.parentNode.removeChild(tr_elm);
+
+ // set tr_elm to the new node
+ tr_elm = newRow;
+ }
+}
+
+function changedBackgroundImage() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ st['background-image'] = "url('" + formObj.backgroundimage.value + "')";
+
+ formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedStyle() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ if (st['background-image'])
+ formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+ else
+ formObj.backgroundimage.value = '';
+
+ if (st['height'])
+ formObj.height.value = trimSize(st['height']);
+
+ if (st['background-color']) {
+ formObj.bgcolor.value = st['background-color'];
+ updateColor('bgcolor_pick','bgcolor');
+ }
+}
+
+function changedSize() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ var height = formObj.height.value;
+ if (height != "")
+ st['height'] = getCSSSize(height);
+ else
+ st['height'] = "";
+
+ formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedColor() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ st['background-color'] = formObj.bgcolor.value;
+
+ formObj.style.value = tinyMCE.serializeStyle(st);
+}
diff --git a/program/js/tiny_mce/plugins/table/jscripts/table.js b/program/js/tiny_mce/plugins/table/jscripts/table.js
new file mode 100644
index 000000000..02eaeee27
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/jscripts/table.js
@@ -0,0 +1,344 @@
+var action, orgTableWidth, orgTableHeight;
+
+function insertTable() {
+ var formObj = document.forms[0];
+ var inst = tinyMCE.selectedInstance;
+ var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className;
+ var html = '';
+ var elm = tinyMCE.tableElm;
+ var cellLimit, rowLimit, colLimit;
+
+ tinyMCEPopup.restoreSelection();
+
+ // Get form data
+ cols = formObj.elements['cols'].value;
+ rows = formObj.elements['rows'].value;
+ border = formObj.elements['border'].value != "" ? formObj.elements['border'].value : 0;
+ cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : "";
+ cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : "";
+ align = formObj.elements['align'].options[formObj.elements['align'].selectedIndex].value;
+ width = formObj.elements['width'].value;
+ height = formObj.elements['height'].value;
+ bordercolor = formObj.elements['bordercolor'].value;
+ bgcolor = formObj.elements['bgcolor'].value;
+ className = formObj.elements['class'].options[formObj.elements['class'].selectedIndex].value;
+ id = formObj.elements['id'].value;
+ summary = formObj.elements['summary'].value;
+ style = formObj.elements['style'].value;
+ dir = formObj.elements['dir'].value;
+ lang = formObj.elements['lang'].value;
+ background = formObj.elements['backgroundimage'].value;
+
+ cellLimit = tinyMCE.getParam('table_cell_limit', false);
+ rowLimit = tinyMCE.getParam('table_row_limit', false);
+ colLimit = tinyMCE.getParam('table_col_limit', false);
+
+ // Validate table size
+ if (colLimit && cols > colLimit) {
+ alert(tinyMCE.getLang('lang_table_col_limit', '', true, {cols : colLimit}));
+ return false;
+ } else if (rowLimit && rows > rowLimit) {
+ alert(tinyMCE.getLang('lang_table_row_limit', '', true, {rows : rowLimit}));
+ return false;
+ } else if (cellLimit && cols * rows > cellLimit) {
+ alert(tinyMCE.getLang('lang_table_cell_limit', '', true, {cells : cellLimit}));
+ return false;
+ }
+
+ // Update table
+ if (action == "update") {
+ inst.execCommand('mceBeginUndoLevel');
+
+ tinyMCE.setAttrib(elm, 'cellPadding', cellpadding, true);
+ tinyMCE.setAttrib(elm, 'cellSpacing', cellspacing, true);
+ tinyMCE.setAttrib(elm, 'border', border, true);
+ tinyMCE.setAttrib(elm, 'align', align);
+ tinyMCE.setAttrib(elm, 'class', className);
+ tinyMCE.setAttrib(elm, 'style', style);
+ tinyMCE.setAttrib(elm, 'id', id);
+ tinyMCE.setAttrib(elm, 'summary', summary);
+ tinyMCE.setAttrib(elm, 'dir', dir);
+ tinyMCE.setAttrib(elm, 'lang', lang);
+
+ // Not inline styles
+ if (!tinyMCE.getParam("inline_styles"))
+ tinyMCE.setAttrib(elm, 'width', width, true);
+
+ // Remove these since they are not valid XHTML
+ tinyMCE.setAttrib(elm, 'borderColor', '');
+ tinyMCE.setAttrib(elm, 'bgColor', '');
+ tinyMCE.setAttrib(elm, 'background', '');
+ tinyMCE.setAttrib(elm, 'height', '');
+
+ if (background != '')
+ elm.style.backgroundImage = "url('" + background + "')";
+ else
+ elm.style.backgroundImage = '';
+
+ if (tinyMCE.getParam("inline_styles"))
+ elm.style.borderWidth = border + "px";
+
+ if (tinyMCE.getParam("inline_styles")) {
+ if (width != '')
+ elm.style.width = getCSSSize(width);
+ }
+
+ if (bordercolor != "") {
+ elm.style.borderColor = bordercolor;
+ elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle;
+ elm.style.borderWidth = border == "" ? "1px" : border;
+ } else
+ elm.style.borderColor = '';
+
+ elm.style.backgroundColor = bgcolor;
+ elm.style.height = getCSSSize(height);
+
+ tinyMCE.handleVisualAid(tinyMCE.tableElm, false, inst.visualAid, inst);
+
+ // Fix for stange MSIE align bug
+ tinyMCE.tableElm.outerHTML = tinyMCE.tableElm.outerHTML;
+
+ tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
+ tinyMCE.triggerNodeChange();
+ inst.execCommand('mceEndUndoLevel');
+
+ // Repaint if dimensions changed
+ if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight)
+ inst.repaint();
+
+ tinyMCEPopup.close();
+ return true;
+ }
+
+ // Create new table
+ html += '<table';
+
+ html += makeAttrib('id', id);
+ html += makeAttrib('border', border);
+ html += makeAttrib('cellpadding', cellpadding);
+ html += makeAttrib('cellspacing', cellspacing);
+ html += makeAttrib('width', width);
+ //html += makeAttrib('height', height);
+ //html += makeAttrib('bordercolor', bordercolor);
+ //html += makeAttrib('bgcolor', bgcolor);
+ html += makeAttrib('align', align);
+ html += makeAttrib('class', tinyMCE.getVisualAidClass(className, border == 0));
+ html += makeAttrib('style', style);
+ html += makeAttrib('summary', summary);
+ html += makeAttrib('dir', dir);
+ html += makeAttrib('lang', lang);
+
+ html += '>';
+
+ for (var y=0; y<rows; y++) {
+ html += "<tr>";
+
+ for (var x=0; x<cols; x++)
+ html += '<td>&nbsp;</td>';
+
+ html += "</tr>";
+ }
+
+ html += "</table>";
+
+ inst.execCommand('mceBeginUndoLevel');
+ inst.execCommand('mceInsertContent', false, html);
+ tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual']);
+ inst.execCommand('mceEndUndoLevel');
+
+ tinyMCEPopup.close();
+}
+
+function makeAttrib(attrib, value) {
+ var formObj = document.forms[0];
+ var valueElm = formObj.elements[attrib];
+
+ if (typeof(value) == "undefined" || value == null) {
+ value = "";
+
+ if (valueElm)
+ value = valueElm.value;
+ }
+
+ if (value == "")
+ return "";
+
+ // XML encode it
+ value = value.replace(/&/g, '&amp;');
+ value = value.replace(/\"/g, '&quot;');
+ value = value.replace(/</g, '&lt;');
+ value = value.replace(/>/g, '&gt;');
+
+ return ' ' + attrib + '="' + value + '"';
+}
+
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+ document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+ document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');
+ document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+
+ var cols = 2, rows = 2, border = 0, cellpadding = "", cellspacing = "";
+ var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = "";
+ var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "";
+ var inst = tinyMCE.selectedInstance;
+ var formObj = document.forms[0];
+ var elm = tinyMCE.getParentElement(inst.getFocusElement(), "table");
+
+ tinyMCE.tableElm = elm;
+ action = tinyMCE.getWindowArg('action');
+ if (action == null)
+ action = tinyMCE.tableElm ? "update" : "insert";
+
+ if (tinyMCE.tableElm && action != "insert") {
+ var rowsAr = tinyMCE.tableElm.rows;
+ var cols = 0;
+ for (var i=0; i<rowsAr.length; i++)
+ if (rowsAr[i].cells.length > cols)
+ cols = rowsAr[i].cells.length;
+
+ cols = cols;
+ rows = rowsAr.length;
+
+ st = tinyMCE.parseStyle(tinyMCE.getAttrib(tinyMCE.tableElm, "style"));
+ border = trimSize(getStyle(elm, 'border', 'borderWidth'));
+ cellpadding = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellpadding', "");
+ cellspacing = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellspacing', "");
+ width = trimSize(getStyle(elm, 'width', 'width'));
+ height = trimSize(getStyle(elm, 'height', 'height'));
+ bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor'));
+ bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor'));
+ align = tinyMCE.getAttrib(tinyMCE.tableElm, 'align', align);
+ className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm, 'class'), false);
+ id = tinyMCE.getAttrib(tinyMCE.tableElm, 'id');
+ summary = tinyMCE.getAttrib(tinyMCE.tableElm, 'summary');
+ style = tinyMCE.serializeStyle(st);
+ dir = tinyMCE.getAttrib(tinyMCE.tableElm, 'dir');
+ lang = tinyMCE.getAttrib(tinyMCE.tableElm, 'lang');
+ background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+
+ orgTableWidth = width;
+ orgTableHeight = height;
+
+ action = "update";
+ }
+
+ addClassesToList('class', "table_styles");
+
+ // Update form
+ selectByValue(formObj, 'align', align);
+ selectByValue(formObj, 'class', className);
+ formObj.cols.value = cols;
+ formObj.rows.value = rows;
+ formObj.border.value = border;
+ formObj.cellpadding.value = cellpadding;
+ formObj.cellspacing.value = cellspacing;
+ formObj.width.value = width;
+ formObj.height.value = height;
+ formObj.bordercolor.value = bordercolor;
+ formObj.bgcolor.value = bgcolor;
+ formObj.id.value = id;
+ formObj.summary.value = summary;
+ formObj.style.value = style;
+ formObj.dir.value = dir;
+ formObj.lang.value = lang;
+ formObj.backgroundimage.value = background;
+ formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true);
+
+ updateColor('bordercolor_pick', 'bordercolor');
+ updateColor('bgcolor_pick', 'bgcolor');
+
+ // Resize some elements
+ if (isVisible('backgroundimagebrowser'))
+ document.getElementById('backgroundimage').style.width = '180px';
+
+ // Disable some fields in update mode
+ if (action == "update") {
+ formObj.cols.disabled = true;
+ formObj.rows.disabled = true;
+ }
+}
+
+function changedSize() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ var width = formObj.width.value;
+ if (width != "")
+ st['width'] = tinyMCE.getParam("inline_styles") ? getCSSSize(width) : "";
+ else
+ st['width'] = "";
+
+ var height = formObj.height.value;
+ if (height != "")
+ st['height'] = getCSSSize(height);
+ else
+ st['height'] = "";
+
+ formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedBackgroundImage() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ st['background-image'] = "url('" + formObj.backgroundimage.value + "')";
+
+ formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedBorder() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ // Update border width if the element has a color
+ if (formObj.border.value != "" && formObj.bordercolor.value != "")
+ st['border-width'] = formObj.border.value + "px";
+
+ formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedColor() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ st['background-color'] = formObj.bgcolor.value;
+
+ if (formObj.bordercolor.value != "") {
+ st['border-color'] = formObj.bordercolor.value;
+
+ // Add border-width if it's missing
+ if (!st['border-width'])
+ st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px";
+ }
+
+ formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedStyle() {
+ var formObj = document.forms[0];
+ var st = tinyMCE.parseStyle(formObj.style.value);
+
+ if (st['background-image'])
+ formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+ else
+ formObj.backgroundimage.value = '';
+
+ if (st['width'])
+ formObj.width.value = trimSize(st['width']);
+
+ if (st['height'])
+ formObj.height.value = trimSize(st['height']);
+
+ if (st['background-color']) {
+ formObj.bgcolor.value = st['background-color'];
+ updateColor('bgcolor_pick','bgcolor');
+ }
+
+ if (st['border-color']) {
+ formObj.bordercolor.value = st['border-color'];
+ updateColor('bordercolor_pick','bordercolor');
+ }
+}
diff --git a/program/js/tiny_mce/plugins/table/langs/en.js b/program/js/tiny_mce/plugins/table/langs/en.js
new file mode 100644
index 000000000..108d6afb1
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/langs/en.js
@@ -0,0 +1,78 @@
+// UK lang variables
+
+tinyMCE.addToLang('table',{
+general_tab : 'General',
+advanced_tab : 'Advanced',
+general_props : 'General properties',
+advanced_props : 'Advanced properties',
+desc : 'Inserts a new table',
+row_before_desc : 'Insert row before',
+row_after_desc : 'Insert row after',
+delete_row_desc : 'Delete row',
+col_before_desc : 'Insert column before',
+col_after_desc : 'Insert column after',
+delete_col_desc : 'Remove column',
+rowtype : 'Row in table part',
+title : 'Insert/Modify table',
+width : 'Width',
+height : 'Height',
+cols : 'Columns',
+rows : 'Rows',
+cellspacing : 'Cellspacing',
+cellpadding : 'Cellpadding',
+border : 'Border',
+align : 'Alignment',
+align_default : 'Default',
+align_left : 'Left',
+align_right : 'Right',
+align_middle : 'Center',
+row_title : 'Table row properties',
+cell_title : 'Table cell properties',
+cell_type : 'Cell type',
+row_desc : 'Table row properties',
+cell_desc : 'Table cell properties',
+valign : 'Vertical alignment',
+align_top : 'Top',
+align_bottom : 'Bottom',
+props_desc : 'Table properties',
+bordercolor : 'Border color',
+bgcolor : 'Background color',
+merge_cells_title : 'Merge table cells',
+split_cells_desc : 'Split table cells',
+merge_cells_desc : 'Merge table cells',
+cut_row_desc : 'Cut table row',
+copy_row_desc : 'Copy table row',
+paste_row_before_desc : 'Paste table row before',
+paste_row_after_desc : 'Paste table row after',
+id : 'Id',
+style: 'Style',
+langdir : 'Language direction',
+langcode : 'Language code',
+mime : 'Target MIME type',
+ltr : 'Left to right',
+rtl : 'Right to left',
+bgimage : 'Background image',
+summary : 'Summary',
+td : "Data",
+th : "Header",
+cell_cell : 'Update current cell',
+cell_row : 'Update all cells in row',
+cell_all : 'Update all cells in table',
+row_row : 'Update current row',
+row_odd : 'Update odd rows in table',
+row_even : 'Update even rows in table',
+row_all : 'Update all rows in table',
+thead : 'Table Head',
+tbody : 'Table Body',
+tfoot : 'Table Foot',
+del : 'Delete table',
+scope : 'Scope',
+row : 'Row',
+col : 'Col',
+rowgroup : 'Row Group',
+colgroup : 'Col Group',
+col_limit : 'You\'ve exceeded the maximum number of columns of {$cols}.',
+row_limit : 'You\'ve exceeded the maximum number of rows of {$rows}.',
+cell_limit : 'You\'ve exceeded the maximum number of cells of {$cells}.',
+missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.'
+});
diff --git a/program/js/tiny_mce/plugins/table/merge_cells.htm b/program/js/tiny_mce/plugins/table/merge_cells.htm
new file mode 100644
index 000000000..be723a9fa
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/merge_cells.htm
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_table_merge_cells_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="jscripts/merge_cells.js"></script>
+ <base target="_self" />
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="margin: 8px" style="display: none">
+<form onsubmit="insertTable();return false;" action="#">
+ <fieldset>
+ <legend>{$lang_table_merge_cells_title}</legend>
+ <table border="0" cellpadding="0" cellspacing="3" width="100%">
+ <tr>
+ <td>{$lang_table_cols}:</td>
+ <td align="right"><input type="text" name="numcols" value="" style="width: 30px" /></td>
+ <td>
+ </tr>
+ <tr>
+ <td>{$lang_table_rows}:</td>
+ <td align="right"><input type="text" name="numrows" value="" style="width: 30px" /></td>
+ </tr>
+ </table>
+ </fieldset>
+
+ <div class="mceActionPanel">
+ <div style="float: left">
+ <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="mergeCells();" />
+ </div>
+
+ <div style="float: right">
+ <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+ </div>
+ </div>
+</form>
+</body>
+</html>
diff --git a/program/js/tiny_mce/plugins/table/readme.txt b/program/js/tiny_mce/plugins/table/readme.txt
new file mode 100644
index 000000000..4fdb78aec
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/readme.txt
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.
diff --git a/program/js/tiny_mce/plugins/table/row.htm b/program/js/tiny_mce/plugins/table/row.htm
new file mode 100644
index 000000000..64f2afcb5
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/row.htm
@@ -0,0 +1,159 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_table_row_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/form_utils.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/row.js"></script>
+ <link href="css/row.css" rel="stylesheet" type="text/css" />
+ <base target="_self" />
+</head>
+<body id="tablerow" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+ <form onsubmit="updateAction();return false;">
+ <div class="tabs">
+ <ul>
+ <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>
+ <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_tab}</a></span></li>
+ </ul>
+ </div>
+
+ <div class="panel_wrapper">
+ <div id="general_panel" class="panel current">
+ <fieldset>
+ <legend>{$lang_table_general_props}</legend>
+
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <td><label for="rowtype">{$lang_table_rowtype}</label></td>
+ <td class="col2">
+ <select id="rowtype" name="rowtype">
+ <option value="thead">{$lang_table_thead}</option>
+ <option value="tbody">{$lang_table_tbody}</option>
+ <option value="tfoot">{$lang_table_tfoot}</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td><label for="align">{$lang_table_align}</label></td>
+ <td class="col2">
+ <select id="align" name="align">
+ <option value="">{$lang_not_set}</option>
+ <option value="center">{$lang_table_align_middle}</option>
+ <option value="left">{$lang_table_align_left}</option>
+ <option value="right">{$lang_table_align_right}</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td><label for="valign">{$lang_table_valign}</label></td>
+ <td class="col2">
+ <select id="valign" name="valign">
+ <option value="">{$lang_not_set}</option>
+ <option value="top">{$lang_table_align_top}</option>
+ <option value="middle">{$lang_table_align_middle}</option>
+ <option value="bottom">{$lang_table_align_bottom}</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr id="styleSelectRow">
+ <td><label for="class">{$lang_class_name}</label></td>
+ <td class="col2">
+ <select id="class" name="class">
+ <option value="" selected="selected">{$lang_not_set}</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td><label for="height">{$lang_table_height}</label></td>
+ <td class="col2"><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" /></td>
+ </tr>
+ </table>
+ </fieldset>
+ </div>
+
+ <div id="advanced_panel" class="panel">
+ <fieldset>
+ <legend>{$lang_table_advanced_props}</legend>
+
+ <table border="0" cellpadding="0" cellspacing="4">
+ <tr>
+ <td class="column1"><label for="id">{$lang_table_id}</label></td>
+ <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td>
+ </tr>
+
+ <tr>
+ <td><label for="style">{$lang_table_style}</label></td>
+ <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="dir">{$lang_table_langdir}</label></td>
+ <td>
+ <select id="dir" name="dir" style="width: 200px">
+ <option value="">{$lang_not_set}</option>
+ <option value="ltr">{$lang_table_ltr}</option>
+ <option value="rtl">{$lang_table_rtl}</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="lang">{$lang_table_langcode}</label></td>
+ <td>
+ <input id="lang" name="lang" type="text" value="" style="width: 200px" />
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td>
+ <td>
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>
+ <td id="backgroundimagebrowsercontainer">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td>
+ <td>
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>
+ <td id="bgcolor_pickcontainer">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+ </div>
+ </div>
+
+ <div class="mceActionPanel">
+ <div>
+ <select id="action" name="action">
+ <option value="row">{$lang_table_row_row}</option>
+ <option value="odd">{$lang_table_row_odd}</option>
+ <option value="even">{$lang_table_row_even}</option>
+ <option value="all">{$lang_table_row_all}</option>
+ </select>
+ </div>
+
+ <div style="float: left">
+ <div><input type="button" id="insert" name="insert" value="{$lang_update}" onclick="updateAction();" /></div>
+ </div>
+
+ <div style="float: right">
+ <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+ </div>
+ </div>
+ </form>
+</body>
+</html>
diff --git a/program/js/tiny_mce/plugins/table/table.htm b/program/js/tiny_mce/plugins/table/table.htm
new file mode 100644
index 000000000..846f55131
--- /dev/null
+++ b/program/js/tiny_mce/plugins/table/table.htm
@@ -0,0 +1,155 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_table_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/form_utils.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/table.js"></script>
+ <link href="css/table.css" rel="stylesheet" type="text/css" />
+ <base target="_self" />
+</head>
+<body id="table" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+ <form onsubmit="insertTable();return false;" action="#">
+ <div class="tabs">
+ <ul>
+ <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>
+ <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_tab}</a></span></li>
+ </ul>
+ </div>
+
+ <div class="panel_wrapper">
+ <div id="general_panel" class="panel current">
+ <fieldset>
+ <legend>{$lang_table_general_props}</legend>
+
+ <table border="0" cellpadding="4" cellspacing="0" width="100%">
+ <tr>
+ <td><label id="colslabel" for="cols">{$lang_table_cols}</label></td>
+ <td><input id="cols" name="cols" type="text" value="" size="3" maxlength="3" /></td>
+ <td><label id="rowslabel" for="rows">{$lang_table_rows}</label></td>
+ <td><input id="rows" name="rows" type="text" value="" size="3" maxlength="3" /></td>
+ </tr>
+ <tr>
+ <td><label id="cellpaddinglabel" for="cellpadding">{$lang_table_cellpadding}</label></td>
+ <td><input id="cellpadding" name="cellpadding" type="text" value="" size="3" maxlength="3" /></td>
+ <td><label id="cellspacinglabel" for="cellspacing">{$lang_table_cellspacing}</label></td>
+ <td><input id="cellspacing" name="cellspacing" type="text" value="" size="3" maxlength="3" /></td>
+ </tr>
+ <tr>
+ <td><label id="alignlabel" for="align">{$lang_table_align}</label></td>
+ <td><select id="align" name="align">
+ <option value="">{$lang_not_set}</option>
+ <option value="center">{$lang_table_align_middle}</option>
+ <option value="left">{$lang_table_align_left}</option>
+ <option value="right">{$lang_table_align_right}</option>
+ </select></td>
+ <td><label id="borderlabel" for="border">{$lang_table_border}</label></td>
+ <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="changedBorder();" /></td>
+ </tr>
+ <tr>
+ <td><label id="widthlabel" for="width">{$lang_table_width}</label></td>
+ <td><input name="width" type="text" id="width" value="" size="4" maxlength="4" onchange="changedSize();" /></td>
+ <td><label id="heightlabel" for="height">{$lang_table_height}</label></td>
+ <td><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" /></td>
+ </tr>
+ <tr id="styleSelectRow">
+ <td><label id="classlabel" for="class">{$lang_class_name}</label></td>
+ <td colspan="3">
+ <select id="class" name="class">
+ <option value="" selected>{$lang_not_set}</option>
+ </select></td>
+ </tr>
+ </table>
+ </fieldset>
+ </div>
+
+ <div id="advanced_panel" class="panel">
+ <fieldset>
+ <legend>{$lang_table_advanced_props}</legend>
+
+ <table border="0" cellpadding="0" cellspacing="4">
+ <tr>
+ <td class="column1"><label for="id">{$lang_table_id}</label></td>
+ <td><input id="id" name="id" type="text" value="" class="advfield" /></td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="summary">{$lang_table_summary}</label></td>
+ <td><input id="summary" name="summary" type="text" value="" class="advfield" /></td>
+ </tr>
+
+ <tr>
+ <td><label for="style">{$lang_table_style}</label></td>
+ <td><input type="text" id="style" name="style" value="" class="advfield" onchange="changedStyle();" /></td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="dir">{$lang_table_langdir}</label></td>
+ <td>
+ <select id="dir" name="dir" class="advfield">
+ <option value="">{$lang_not_set}</option>
+ <option value="ltr">{$lang_table_ltr}</option>
+ <option value="rtl">{$lang_table_rtl}</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label id="langlabel" for="lang">{$lang_table_langcode}</label></td>
+ <td>
+ <input id="lang" name="lang" type="text" value="" class="advfield" />
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td>
+ <td>
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td><input id="backgroundimage" name="backgroundimage" type="text" value="" class="advfield" onchange="changedBackgroundImage();" /></td>
+ <td id="backgroundimagebrowsercontainer">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="bordercolor">{$lang_table_bordercolor}</label></td>
+ <td>
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>
+ <td id="bordercolor_pickcontainer">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td>
+ <td>
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>
+ <td id="bgcolor_pickcontainer">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </fieldset>
+ </div>
+ </div>
+
+ <div class="mceActionPanel">
+ <div style="float: left">
+ <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertTable();" />
+ </div>
+
+ <div style="float: right">
+ <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+ </div>
+ </div>
+ </form>
+</body>
+</html>
diff --git a/program/js/tiny_mce/themes/advanced/about.htm b/program/js/tiny_mce/themes/advanced/about.htm
new file mode 100644
index 000000000..d15ff3a76
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/about.htm
@@ -0,0 +1,52 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_about_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="jscripts/about.js"></script>
+ <base target="_self" />
+</head>
+<body id="about" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+ <div class="tabs">
+ <ul>
+ <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_about}</a></span></li>
+ <li id="help_tab"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{$lang_help}</a></span></li>
+ <li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{$lang_plugins}</a></span></li>
+ </ul>
+ </div>
+
+ <div class="panel_wrapper">
+ <div id="general_panel" class="panel current">
+ <h3>{$lang_about_title}</h3>
+ <p>Version: {$tinymce_version} ({$tinymce_releasedate})</p>
+ <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>
+ by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p>
+ <p>Copyright &copy; 2003-2006, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p>
+ <p>For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.</p>
+
+ <div id="buttoncontainer"></div>
+ </div>
+
+ <div id="plugins_panel" class="panel">
+ <div id="pluginscontainer">
+ <h3>{$lang_loaded_plugins}</h3>
+
+ <div id="plugintablecontainer">
+ </div>
+
+ <p>&nbsp;</p>
+ </div>
+ </div>
+
+ <div id="help_panel" class="panel noscroll" style="overflow: visible;">
+ <div id="iframecontainer"></div>
+ </div>
+ </div>
+
+ <div class="mceActionPanel">
+ <div style="float: right">
+ <input type="button" id="cancel" name="cancel" value="{$lang_close}" onclick="tinyMCEPopup.close();" />
+ </div>
+ </div>
+</body>
+</html>
diff --git a/program/js/tiny_mce/themes/advanced/anchor.htm b/program/js/tiny_mce/themes/advanced/anchor.htm
new file mode 100644
index 000000000..53d7969f0
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/anchor.htm
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_insert_anchor_title}</title>
+ <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/anchor.js"></script>
+ <base target="_self" />
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+<form onsubmit="insertAnchor();return false;" action="#">
+
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <td colspan="2" class="title">{$lang_insert_anchor_title}</td>
+ </tr>
+ <tr>
+ <td nowrap="nowrap">{$lang_insert_anchor_name}:</td>
+ <td><input name="anchorName" type="text" id="anchorName" value="" style="width: 200px" /></td>
+ </tr>
+ </table>
+
+ <div class="mceActionPanel">
+ <div style="float: left">
+ <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertAnchor();" />
+ </div>
+
+ <div style="float: right">
+ <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+ </div>
+ </div>
+
+</form>
+</body>
+</html>
diff --git a/program/js/tiny_mce/themes/advanced/charmap.htm b/program/js/tiny_mce/themes/advanced/charmap.htm
new file mode 100644
index 000000000..9aed1d4b5
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/charmap.htm
@@ -0,0 +1,53 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_theme_charmap_title}</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+ <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/charmap.js"></script>
+ <base target="_self" />
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+<table align="center" border="0" cellspacing="0" cellpadding="2">
+ <tr>
+ <td colspan="2" class="title">{$lang_theme_charmap_title}</td>
+ </tr>
+ <tr>
+ <td rowspan="2" align="left" valign="top">
+ <script language="javascript" type="text/javascript">renderCharMapHTML();</script>
+ </td>
+ <td width="100" align="center" valign="top">
+ <table border="0" cellpadding="0" cellspacing="0" width="100" style="height: 100px">
+ <tr>
+ <td class="charmapOver" style="font-size: 40px; height:80px;" id="codeV">&nbsp;</td>
+ </tr>
+ <tr>
+ <td style="font-size: 10px; font-family: Arial, Helvetica, sans-serif; text-align:center;" id="codeN">&nbsp;</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td valign="bottom" style="padding-bottom: 3px;">
+ <table width="100" align="center" border="0" cellpadding="2" cellspacing="0">
+ <tr>
+ <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">HTML-Code</td>
+ </tr>
+ <tr>
+ <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>
+ </tr>
+ <tr>
+ <td style="font-size: 1px;">&nbsp;</td>
+ </tr>
+ <tr>
+ <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">NUM-Code</td>
+ </tr>
+ <tr>
+ <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>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
+</body>
+</html>
diff --git a/program/js/tiny_mce/themes/advanced/color_picker.htm b/program/js/tiny_mce/themes/advanced/color_picker.htm
new file mode 100644
index 000000000..3f5a19838
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/color_picker.htm
@@ -0,0 +1,13 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_theme_colorpicker_title}</title>
+ <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/color_picker.js"></script>
+ <base target="_self" />
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="margin: 3px; display: none">
+ <div align="center">
+ <script language="javascript" type="text/javascript">renderColorMap();</script>
+ </div>
+</body>
+</html>
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/about.htm b/program/js/tiny_mce/themes/advanced/docs/en/about.htm
new file mode 100644
index 000000000..a6957a651
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/about.htm
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>About TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+ <tr>
+ <td><span class="title">About TinyMCE</span></td>
+ <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+ </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE is a small WYSIWYG editor control for web browsers such as MSIE or Mozilla
+that enables you to edit HTML contents in a more user friendly way. It has common
+features that are found in most word processors and should not be difficult to
+use.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+ <tr>
+ <td>Go to: <a href="index.htm">Table of contents</a></td>
+ <td align="right"><a href="#">Top</a></td>
+ </tr>
+</table>
+<br>
+</BODY>
+</HTML>
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/common_buttons.htm b/program/js/tiny_mce/themes/advanced/docs/en/common_buttons.htm
new file mode 100644
index 000000000..518b28551
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/common_buttons.htm
@@ -0,0 +1,162 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Common buttons</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+ <tr>
+ <td><span class="title">Common buttons</span></td>
+ <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+ </tr>
+</table>
+<hr noshade>
+<br>
+Below is a short description about each button.
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+ <tr>
+ <td><img src="../../images/bold.gif" width="20" height="20" alt="Bold text icon" /></td>
+ <td>Bold text style (Ctrl+B).</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/italic.gif" width="20" height="20" alt="Italic text icon" /></td>
+ <td>Italic text style (Ctrl+I).</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/underline.gif" width="20" height="20" alt="Underline text icon." /></td>
+ <td>Underline text style (Ctrl+U).</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/strikethrough.gif" width="20" height="20" alt="Strikethrough text icon." /></td>
+ <td>Strikethrough text style.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/justifyleft.gif" width="20" height="20" alt="Align left icon." /></td>
+ <td>Align left.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/justifycenter.gif" width="20" height="20" alt="Align center icon." /></td>
+ <td>Align center.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/justifyright.gif" width="20" height="20" alt="Align right icon." /></td>
+ <td>Align right.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/justifyfull.gif" width="20" height="20" alt="Align full icon." /></td>
+ <td>Align full.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/bullist.gif" width="20" height="20" alt="Unordered list/bullet list icon." /></td>
+ <td>Unordered list/bullet list.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/numlist.gif" width="20" height="20" alt="Ordered list/numbered list icon." /></td>
+ <td>Ordered list/numbered list</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/outdent.gif" width="20" height="20" alt="Outdent/decrease indentation icon." /></td>
+ <td>Outdent/decrease indentation.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/indent.gif" width="20" height="20" alt="Indent/increase indentation icon." /></td>
+ <td>Indent/increase indentation.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/undo.gif" width="20" height="20" alt="Undo the last operation." /></td>
+ <td>Undo the last operation (Ctrl+Z).</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/redo.gif" width="20" height="20" alt="Redo the last operation icon." /></td>
+ <td>Redo the last operation (Ctrl+Y).</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/link.gif" width="20" height="20" alt="Insert a new link icon." /></td>
+ <td>Insert a new link, read more about this function in the <a href="insert_link_button.htm">Insert
+ link section</a>.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/unlink.gif" width="20" height="20" alt="Unlinks the current selection icon." /></td>
+ <td>Unlinks the current selection/removes all selected links.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/anchor.gif" width="20" height="20" alt="Insert a new anchor icon." /></td>
+ <td>Insert a new anchor, read more about this function in the <a href="insert_anchor_button.htm">Insert anchor section.</a></td>
+ </tr>
+ <tr>
+ <td><img src="../../images/image.gif" width="20" height="20" alt="Insert a new image icon." /></td>
+ <td>Insert a new image, read more about this function in the <a href="insert_image_button.htm">Insert
+ image section</a>.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/cleanup.gif" width="20" height="20" alt="Cleanup code icon." /></td>
+ <td>Cleanup code/Removes unwanted formating. This function is useful when
+ you copy contents from for example a office product.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/help.gif" width="20" height="20" alt="Show help icon." /></td>
+ <td>Shows this help window.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/code.gif" width="20" height="20" alt="Source code editor icon." /></td>
+ <td>Opens HTML source code editor. </td>
+ </tr>
+ <tr>
+ <td><img src="../../../../plugins/table/images/table.gif" width="20" height="20" alt="Insert table icon." /></td>
+ <td>Inserts a new table at the current location. </td>
+ </tr>
+ <tr>
+ <td><img src="../../../../plugins/table/images/table_insert_row_before.gif" width="20" height="20" alt="Adds a row above icon." /></td>
+ <td>Adds a row above the current one. </td>
+ </tr>
+ <tr>
+ <td><img src="../../../../plugins/table/images/table_insert_row_after.gif" width="20" height="20" alt="Adds a row under icon." /></td>
+ <td>Adds a row under the current one. </td>
+ </tr>
+ <tr>
+ <td><img src="../../../../plugins/table/images/table_delete_row.gif" width="20" height="20" alt="Remove row icon." /></td>
+ <td>Removes the row. </td>
+ </tr>
+ <tr>
+ <td><img src="../../../../plugins/table/images/table_insert_col_before.gif" width="20" height="20" alt="Add column before icon." /></td>
+ <td>Adds a column before the current one.</td>
+ </tr>
+ <tr>
+ <td><img src="../../../../plugins/table/images/table_insert_col_after.gif" width="20" height="20" alt="Add column after icon." /></td>
+ <td>Adds a column after the current one.</td>
+ </tr>
+ <tr>
+ <td><img src="../../../../plugins/table/images/table_delete_col.gif" width="20" height="20" alt="Remove column icon." /></td>
+ <td>Removes the current column.</td>
+ </tr>
+ <tr>
+ <td><img src="../../images/hr.gif" width="20" height="20" alt="Insert horizontal ruler icon." /></td>
+ <td>Inserts a new horizontal ruler </td>
+ </tr>
+ <tr>
+ <td><img src="../../images/removeformat.gif" width="20" height="20" alt="Remove formatting icon." /></td>
+ <td>Removes formatting from the selection. </td>
+ </tr>
+ <tr>
+ <td><img src="../../images/sub.gif" width="20" height="20" alt="Subscript icon." /></td>
+ <td>Makes the selection to be subscript. </td>
+ </tr>
+ <tr>
+ <td><img src="../../images/sup.gif" width="20" height="20" alt="Superscript icon." /></td>
+ <td>Makes the selection to be superscripted. </td>
+ </tr>
+</table>
+<br>
+<hr noshade="noshade" />
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+ <tr>
+ <td>Go to: <a href="index.htm">Table of contents</a></td>
+ <td align="right"><a href="#">Top</a></td>
+ </tr>
+</table>
+</BODY>
+</HTML>
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm b/program/js/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm
new file mode 100644
index 000000000..f4070a31d
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm
@@ -0,0 +1,45 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert table button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+ <tr>
+ <td><span class="title">Create accessible content</span></td>
+ <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+ </tr>
+</table>
+<hr noshade>
+<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>
+
+<p><strong>Things you can do to make your content accessible:</strong></p>
+<ol>
+<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>
+
+<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>
+
+<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>
+
+<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>
+
+<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>
+
+</ol>
+
+<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 />
+</p>
+
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+ <tr>
+ <td>Go to: <a href="index.htm">Table of contents</a></td>
+ <td align="right"><a href="#">Top</a></td>
+ </tr>
+</table>
+
+<br>
+</BODY>
+</HTML>
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif
new file mode 100644
index 000000000..5b5f528dd
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif
new file mode 100644
index 000000000..cdc617eab
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif
new file mode 100644
index 000000000..7bad7583a
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif
new file mode 100644
index 000000000..6a032c5ae
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/index.htm b/program/js/tiny_mce/themes/advanced/docs/en/index.htm
new file mode 100644
index 000000000..9810a93b0
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/index.htm
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Help Index</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+ <tr>
+ <td><span class="title">Table of contents</span></td>
+ <td align="right">&nbsp;</td>
+ </tr>
+</table>
+<hr noshade>
+<br>
+Click the links below to go to the different help sections.
+<ul class="toc_ul">
+ <li class="toc_li"><a href="about.htm">About TinyMCE</a></li>
+ <li class="toc_li"><a href="common_buttons.htm">Common buttons</a></li>
+ <li class="toc_li"><a href="insert_image_button.htm">Insert image button</a></li>
+ <li class="toc_li"><a href="insert_link_button.htm">Insert link button</a></li>
+ <li class="toc_li"><a href="insert_anchor_button.htm">Insert anchor button</a></li>
+ <li class="toc_li"><a href="insert_table_button.htm">Insert table button</a></li>
+ <li class="toc_li"><a href="create_accessible_content.htm">Create accessible content</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm b/program/js/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm
new file mode 100644
index 000000000..332cbc687
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert anchor button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+ <tr>
+ <td><span class="title">Insert anchor button</span></td>
+ <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+ </tr>
+</table>
+<hr noshade>
+<br>
+This button opens a new window with the insert/edit anchor function.<br>
+<br>
+<img src="images/insert_anchor_window.gif" width="330" height="139" alt="Anchor dialog/window" /><br>
+<br>
+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>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+ <tr>
+ <td>Go to: <a href="index.htm">Table of contents</a></td>
+ <td align="right"><a href="#">Top</a></td>
+ </tr>
+</table>
+<br>
+</BODY>
+</HTML>
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/insert_image_button.htm b/program/js/tiny_mce/themes/advanced/docs/en/insert_image_button.htm
new file mode 100644
index 000000000..1529648d5
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/insert_image_button.htm
@@ -0,0 +1,65 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert image button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+ <tr>
+ <td><span class="title">Insert image button</span></td>
+ <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+ </tr>
+</table>
+<hr noshade>
+<br>
+The insert image button opens the window shown below.<br>
+<br>
+<img src="images/insert_image_window.gif" alt="Insert image dialog/window" /><br>
+<br>
+You simply enter a URL to the image you want to link to and enter a image description,
+this is then displayed as an alternative text descripton of the image on the page.<br>
+<br>
+<strong>Field descriptions:</strong><br>
+<table border="1" cellspacing="0">
+ <tr>
+ <td width="150"><strong>Image URL </strong></td>
+ <td>URL/path to the image.</td>
+ </tr>
+ <tr>
+ <td width="150"><strong>Image description </strong></td>
+ <td>Alternative description of image contents.</td>
+ </tr>
+ <tr>
+ <td><strong>Dimentions</strong></td>
+ <td>Image width/height. </td>
+ </tr>
+ <tr>
+ <td><strong>Alignment</strong></td>
+ <td>Image alignment, useful when wrapping text around images.</td>
+ </tr>
+ <tr>
+ <td><strong>Border</strong></td>
+ <td>Border thickness. </td>
+ </tr>
+ <tr>
+ <td><strong>VSpace</strong></td>
+ <td>Vertical space, useful when wrapping text around images.</td>
+ </tr>
+ <tr>
+ <td><strong>HSpace</strong></td>
+ <td>Horizontal space, useful when wrapping text around images.</td>
+ </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+ <tr>
+ <td>Go to: <a href="index.htm">Table of contents</a></td>
+ <td align="right"><a href="#">Top</a></td>
+ </tr>
+</table>
+<br>
+</BODY>
+</HTML>
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/insert_link_button.htm b/program/js/tiny_mce/themes/advanced/docs/en/insert_link_button.htm
new file mode 100644
index 000000000..4f6445076
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/insert_link_button.htm
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert link button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+ <tr>
+ <td><span class="title">Insert link button</span></td>
+ <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+ </tr>
+</table>
+<hr noshade>
+<br>
+This button opens a new window with the insert/edit link function.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="159" alt="Insert link dialog/window" /><br>
+<br>
+There are two fields in this window the first one &quot;Link URL&quot; is the
+URL of the link. The target enables you to select how the link is to be opened.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+ <tr>
+ <td>Go to: <a href="index.htm">Table of contents</a></td>
+ <td align="right"><a href="#">Top</a></td>
+ </tr>
+</table>
+<br>
+</BODY>
+</HTML>
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/insert_table_button.htm b/program/js/tiny_mce/themes/advanced/docs/en/insert_table_button.htm
new file mode 100644
index 000000000..f352a0516
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/insert_table_button.htm
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert table button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+ <tr>
+ <td><span class="title">Insert table button</span></td>
+ <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+ </tr>
+</table>
+<hr noshade>
+<br>
+The insert table button opens the window shown below. This action enables you to create tables. <br>
+<br>
+<img src="images/insert_table_window.gif" width="340" height="229" alt="Image of table window" /><br>
+<br>
+<strong>Field descriptions:</strong><br>
+<table border="1" cellspacing="0">
+ <tr>
+ <td width="150"><strong>Columns</strong></td>
+ <td>Number of columns in the table. </td>
+ </tr>
+ <tr>
+ <td width="150"><strong>Rows</strong></td>
+ <td>Number of rows in the new table.</td>
+ </tr>
+ <tr>
+ <td><strong>Cellpadding</strong></td>
+ <td>Cellpadding of the table . </td>
+ </tr>
+ <tr>
+ <td><strong>Cellspacing</strong></td>
+ <td>Cellspacing of the table .</td>
+ </tr>
+ <tr>
+ <td><strong>Alignment</strong></td>
+ <td>Table alignment . </td>
+ </tr>
+ <tr>
+ <td><strong>Border</strong></td>
+ <td>Border thinkness of table.</td>
+ </tr>
+ <tr>
+ <td><strong>Width</strong></td>
+ <td>Width in pixels of table .</td>
+ </tr>
+ <tr>
+ <td><strong>Height</strong></td>
+ <td>Height in pixels of table.</td>
+ </tr>
+ <tr>
+ <td><strong>Class</strong></td>
+ <td>Style or CSS class of table.</td>
+ </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+ <tr>
+ <td>Go to: <a href="index.htm">Table of contents</a></td>
+ <td align="right"><a href="#">Top</a></td>
+ </tr>
+</table>
+<br>
+</BODY>
+</HTML>
diff --git a/program/js/tiny_mce/themes/advanced/docs/en/style.css b/program/js/tiny_mce/themes/advanced/docs/en/style.css
new file mode 100644
index 000000000..ebc05380e
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/docs/en/style.css
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
+
+.toc_ul, .toc_li { margin-left: 8px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold }
+
+hr { height: 1px; }
+
diff --git a/program/js/tiny_mce/themes/advanced/editor_template.js b/program/js/tiny_mce/themes/advanced/editor_template.js
new file mode 100644
index 000000000..0292b64cc
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/editor_template.js
@@ -0,0 +1 @@
+tinyMCE.importThemeLanguagePack('advanced');var TinyMCE_AdvancedTheme={_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','mceForeColor',true],['backcolor','backcolor.gif','lang_theme_backcolor_desc','mceBackColor',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',getControlHTML:function(button_name){var i,x;for(i=0;i<TinyMCE_AdvancedTheme._buttons.length;i++){var but=TinyMCE_AdvancedTheme._buttons[i];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" />';case"spacer":return'<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" />';case"rowseparator":return'<br />';}return"";},execCommand:function(editor_id,element,command,user_interface,value){switch(command){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"mceForeColor":var template=new Array();var elm=tinyMCE.selectedInstance.getFocusElement();var inputColor=tinyMCE.getAttrib(elm,"color");if(inputColor=='')inputColor=elm.style.color;if(!inputColor)inputColor="#000000";template['file']='color_picker.htm';template['width']=220;template['height']=190;tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",command:"forecolor",input_color:inputColor});return true;case"mceBackColor":var template=new Array();var elm=tinyMCE.selectedInstance.getFocusElement();var inputColor=elm.style.backgroundColor;if(!inputColor)inputColor="#000000";template['file']='color_picker.htm';template['width']=220;template['height']=190;template['width']+=tinyMCE.getLang('lang_theme_advanced_backcolor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_backcolor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",command:"HiliteColor",input_color:inputColor});return true;case"mceColorPicker":if(user_interface){var template=new Array();var inputColor=value['document'].getElementById(value['element_id']).value;template['file']='color_picker.htm';template['width']=220;template['height']=190;template['close_previous']="no";template['width']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height',0);if(typeof(value['store_selection'])=="undefined")value['store_selection']=true;tinyMCE.lastColorPickerValue=value;tinyMCE.openWindow(template,{editor_id:editor_id,mce_store_selection:value['store_selection'],inline:"yes",command:"mceColorPicker",input_color:inputColor});}else{var savedVal=tinyMCE.lastColorPickerValue;var elm=savedVal['document'].getElementById(savedVal['element_id']);elm.value=value;if(elm.onchange!=null&&elm.onchange!='')eval('elm.onchange();');}return true;case"mceCodeEditor":var template=new Array();template['file']='source_editor.htm';template['width']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_width",720));template['height']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_height",580));tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"no",inline:"yes"});return true;case"mceCharMap":var template=new Array();template['file']='charmap.htm';template['width']=550+(tinyMCE.isOpera?40:0);template['height']=250;template['width']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceInsertAnchor":var template=new Array();template['file']='anchor.htm';template['width']=320;template['height']=90+(tinyMCE.isNS7?30:0);template['width']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceNewDocument":if(confirm(tinyMCE.getLang('lang_newdocument')))tinyMCE.execInstanceCommand(editor_id,'mceSetContent',false,' ');return true;}return false;},getEditorTemplate:function(settings,editorId){function removeFromArray(in_array,remove_array){var outArray=new Array();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}px;height:{$height}px"><tbody>';if(toolbarLocation=="top"){template['html']+='<tr><td class="mceToolbarTop" align="'+toolbarAlign+'" height="1" nowrap="nowrap">'+toolbarHTML+'</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 class="mceToolbarBottom" align="'+toolbarAlign+'" height="1">'+toolbarHTML+'</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);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);template['delta_width']=0;template['delta_height']=deltaHeight;return template;},initInstance:function(inst){if(tinyMCE.getParam("theme_advanced_resizing",false)){if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var w=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_width");var h=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_height");TinyMCE_AdvancedTheme._resizeTo(inst,w,h,tinyMCE.getParam("theme_advanced_resize_horizontal",true));}}inst.addShortcut('ctrl','k','lang_link_desc','mceLink');},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection,setup_content){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;};function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):"";};if(node==null)return;var pathElm=document.getElementById(editor_id+"_path");var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();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=="b"){nodeName="strong";}if(nodeName=="i"){nodeName="em";}if(nodeName=="span"){var cn=tinyMCE.getAttrib(path[i],"class");if(cn!=""&&cn.indexOf('mceItem')==-1)nodeData+="class: "+cn+" ";var st=tinyMCE.getAttrib(path[i],"style");if(st!=""){st=tinyMCE.serializeStyle(tinyMCE.parseStyle(st));nodeData+="style: "+st+" ";}}if(nodeName=="font"){if(tinyMCE.getParam("convert_fonts_to_spans"))nodeName="span";var face=tinyMCE.getAttrib(path[i],"face");if(face!="")nodeData+="font: "+face+" ";var size=tinyMCE.getAttrib(path[i],"size");if(size!="")nodeData+="size: "+size+" ";var color=tinyMCE.getAttrib(path[i],"color");if(color!="")nodeData+="color: "+color+" ";}if(getAttrib(path[i],'id')!=""){nodeData+="id: "+path[i].getAttribute('id')+" ";}var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1)nodeData+="class: "+className+" ";if(getAttrib(path[i],'src')!=""){var src=tinyMCE.getAttrib(path[i],"mce_src");if(src=="")src=tinyMCE.getAttrib(path[i],"src");nodeData+="src: "+src+" ";}if(getAttrib(path[i],'href')!=""){var href=tinyMCE.getAttrib(path[i],"mce_href");if(href=="")href=tinyMCE.getAttrib(path[i],"href");nodeData+="href: "+href+" ";}if(nodeName=="img"&&tinyMCE.getAttrib(path[i],"class").indexOf('mceItemFlash')!=-1){nodeName="flash";nodeData="src: "+path[i].getAttribute('title');}if(nodeName=="a"&&(anchor=tinyMCE.getAttrib(path[i],"name"))!=""){nodeName="a";nodeName+="#"+anchor;nodeData="";}if(getAttrib(path[i],'name').indexOf("mce_")!=0){var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1){nodeName+="."+className;}}var cmd='tinyMCE.execInstanceCommand(\''+editor_id+'\',\'mceSelectNodeDepth\',false,\''+i+'\');';html+='<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(getAttrib(node,'name').indexOf('mce_')!=0){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";}}},_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');}},_insertImage:function(src,alt,border,hspace,vspace,width,height,align,title,onmouseover,onmouseout){tinyMCE.execCommand('mceBeginUndoLevel');if(src=="")return;if(!tinyMCE.imgElement&&tinyMCE.isSafari){var html="";html+='<img src="'+src+'" alt="'+alt+'"';html+=' border="'+border+'" hspace="'+hspace+'"';html+=' vspace="'+vspace+'" width="'+width+'"';html+=' height="'+height+'" align="'+align+'" title="'+title+'" onmouseover="'+onmouseover+'" onmouseout="'+onmouseout+'" />';tinyMCE.execCommand("mceInsertContent",false,html);}else{if(!tinyMCE.imgElement&&tinyMCE.selectedInstance){if(tinyMCE.isSafari)tinyMCE.execCommand("mceInsertContent",false,'<img src="'+tinyMCE.uniqueURL+'" />');else tinyMCE.selectedInstance.contentDocument.execCommand("insertimage",false,tinyMCE.uniqueURL);tinyMCE.imgElement=tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"img","src",tinyMCE.uniqueURL);}}if(tinyMCE.imgElement){var needsRepaint=false;var msrc=src;src=eval(tinyMCE.settings['urlconverter_callback']+"(src, tinyMCE.imgElement);");if(tinyMCE.getParam('convert_urls'))msrc=src;if(onmouseover&&onmouseover!="")onmouseover="this.src='"+eval(tinyMCE.settings['urlconverter_callback']+"(onmouseover, tinyMCE.imgElement);")+"';";if(onmouseout&&onmouseout!="")onmouseout="this.src='"+eval(tinyMCE.settings['urlconverter_callback']+"(onmouseout, tinyMCE.imgElement);")+"';";if(typeof(title)=="undefined")title=alt;if(width!=tinyMCE.imgElement.getAttribute("width")||height!=tinyMCE.imgElement.getAttribute("height")||align!=tinyMCE.imgElement.getAttribute("align"))needsRepaint=true;tinyMCE.setAttrib(tinyMCE.imgElement,'src',src);tinyMCE.setAttrib(tinyMCE.imgElement,'mce_src',msrc);tinyMCE.setAttrib(tinyMCE.imgElement,'alt',alt);tinyMCE.setAttrib(tinyMCE.imgElement,'title',title);tinyMCE.setAttrib(tinyMCE.imgElement,'align',align);tinyMCE.setAttrib(tinyMCE.imgElement,'border',border,true);tinyMCE.setAttrib(tinyMCE.imgElement,'hspace',hspace,true);tinyMCE.setAttrib(tinyMCE.imgElement,'vspace',vspace,true);tinyMCE.setAttrib(tinyMCE.imgElement,'width',width,true);tinyMCE.setAttrib(tinyMCE.imgElement,'height',height,true);tinyMCE.setAttrib(tinyMCE.imgElement,'onmouseover',onmouseover);tinyMCE.setAttrib(tinyMCE.imgElement,'onmouseout',onmouseout);if(width&&width!="")tinyMCE.imgElement.style.pixelWidth=width;if(height&&height!="")tinyMCE.imgElement.style.pixelHeight=height;if(needsRepaint)tinyMCE.selectedInstance.repaint();}tinyMCE.execCommand('mceEndUndoLevel');},_insertLink:function(href,target,title,onclick,style_class){tinyMCE.execCommand('mceBeginUndoLevel');if(tinyMCE.selectedInstance&&tinyMCE.selectedElement&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){var doc=tinyMCE.selectedInstance.getDoc();var linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");var newLink=false;if(!linkElement){linkElement=doc.createElement("a");newLink=true;}var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(linkElement,'href',thref);tinyMCE.setAttrib(linkElement,'mce_href',mhref);tinyMCE.setAttrib(linkElement,'target',target);tinyMCE.setAttrib(linkElement,'title',title);tinyMCE.setAttrib(linkElement,'onclick',onclick);tinyMCE.setAttrib(linkElement,'class',style_class);if(newLink){linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));tinyMCE.selectedElement.parentNode.replaceChild(linkElement,tinyMCE.selectedElement);}return;}if(!tinyMCE.linkElement&&tinyMCE.selectedInstance){if(tinyMCE.isSafari){tinyMCE.execCommand("mceInsertContent",false,'<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/program/js/tiny_mce/themes/advanced/editor_template_src.js b/program/js/tiny_mce/themes/advanced/editor_template_src.js
new file mode 100644
index 000000000..e2ab25f3d
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/editor_template_src.js
@@ -0,0 +1,1411 @@
+/**
+ * $RCSfile: editor_template_src.js,v $
+ * $Revision: 1.96 $
+ * $Date: 2006/04/18 13:32:52 $
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+/* Import theme specific language pack */
+tinyMCE.importThemeLanguagePack('advanced');
+
+var TinyMCE_AdvancedTheme = {
+ // Private theme fields
+ _autoImportCSSClasses : true,
+ _resizer : {},
+ _buttons : [
+ // Control id, button img, button title, command, user_interface, value
+ ['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', 'mceForeColor', true],
+ ['backcolor', 'backcolor.gif', 'lang_theme_backcolor_desc', 'mceBackColor', 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',
+
+ /**
+ * Returns HTML code for the specificed control.
+ */
+ getControlHTML : function(button_name) {
+ var i, x;
+
+ // Lookup button in button list
+ for (i=0; i<TinyMCE_AdvancedTheme._buttons.length; i++) {
+ var but = TinyMCE_AdvancedTheme._buttons[i];
+
+ if (but[0] == button_name)
+ return tinyMCE.getButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null));
+ }
+
+ // Custom controlls other than buttons
+ switch (button_name) {
+ case "formatselect":
+ var html = '<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>';
+
+ // Build format select
+ 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" />';
+
+ case "spacer":
+ return '<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" />';
+
+ case "rowseparator":
+ return '<br />';
+ }
+
+ return "";
+ },
+
+ /**
+ * Theme specific execcommand handling.
+ */
+ execCommand : function(editor_id, element, command, user_interface, value) {
+ switch (command) {
+ case "mceLink":
+ var inst = tinyMCE.getInstanceById(editor_id);
+ var doc = inst.getDoc();
+ var selectedText = "";
+
+ if (tinyMCE.isMSIE) {
+ var rng = doc.selection.createRange();
+ selectedText = rng.text;
+ } else
+ selectedText = inst.getSel().toString();
+
+ if (!tinyMCE.linkElement) {
+ if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0))
+ return true;
+ }
+
+ var href = "", target = "", title = "", onclick = "", action = "insert", style_class = "";
+
+ if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a")
+ tinyMCE.linkElement = tinyMCE.selectedElement;
+
+ // Is anchor not a link
+ if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "")
+ tinyMCE.linkElement = null;
+
+ if (tinyMCE.linkElement) {
+ href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href');
+ target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target');
+ title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title');
+ onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');
+ style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class');
+
+ // Try old onclick to if copy/pasted content
+ if (onclick == "")
+ onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');
+
+ onclick = tinyMCE.cleanupEventStr(onclick);
+
+ href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");
+
+ // Use mce_href if defined
+ mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_href');
+ if (mceRealHref != "") {
+ href = mceRealHref;
+
+ if (tinyMCE.getParam('convert_urls'))
+ href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");
+ }
+
+ action = "update";
+ }
+
+ var template = new Array();
+
+ template['file'] = 'link.htm';
+ template['width'] = 310;
+ template['height'] = 200;
+
+ // Language specific width and height addons
+ template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0);
+
+ if (inst.settings['insertlink_callback']) {
+ var returnVal = eval(inst.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);");
+ if (returnVal && returnVal['href'])
+ TinyMCE_AdvancedTheme._insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']);
+ } else {
+ tinyMCE.openWindow(template, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class, inline : "yes"});
+ }
+
+ return true;
+
+ case "mceImage":
+ var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = "";
+ var title = "", onmouseover = "", onmouseout = "", action = "insert";
+ var img = tinyMCE.imgElement;
+ var inst = tinyMCE.getInstanceById(editor_id);
+
+ if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {
+ img = tinyMCE.selectedElement;
+ tinyMCE.imgElement = img;
+ }
+
+ if (img) {
+ // Is it a internal MCE visual aid image, then skip this one.
+ if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0)
+ return true;
+
+ src = tinyMCE.getAttrib(img, 'src');
+ alt = tinyMCE.getAttrib(img, 'alt');
+
+ // Try polling out the title
+ if (alt == "")
+ alt = tinyMCE.getAttrib(img, 'title');
+
+ // Fix width/height attributes if the styles is specified
+ if (tinyMCE.isGecko) {
+ var w = img.style.width;
+ if (w != null && w != "")
+ img.setAttribute("width", w);
+
+ var h = img.style.height;
+ if (h != null && h != "")
+ img.setAttribute("height", h);
+ }
+
+ border = tinyMCE.getAttrib(img, 'border');
+ hspace = tinyMCE.getAttrib(img, 'hspace');
+ vspace = tinyMCE.getAttrib(img, 'vspace');
+ width = tinyMCE.getAttrib(img, 'width');
+ height = tinyMCE.getAttrib(img, 'height');
+ align = tinyMCE.getAttrib(img, 'align');
+ onmouseover = tinyMCE.getAttrib(img, 'onmouseover');
+ onmouseout = tinyMCE.getAttrib(img, 'onmouseout');
+ title = tinyMCE.getAttrib(img, 'title');
+
+ // Is realy specified?
+ if (tinyMCE.isMSIE) {
+ width = img.attributes['width'].specified ? width : "";
+ height = img.attributes['height'].specified ? height : "";
+ }
+
+ //onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));
+ //onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));
+
+ src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");
+
+ // Use mce_src if defined
+ mceRealSrc = tinyMCE.getAttrib(img, 'mce_src');
+ if (mceRealSrc != "") {
+ src = mceRealSrc;
+
+ if (tinyMCE.getParam('convert_urls'))
+ src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");
+ }
+
+ //if (onmouseover != "")
+ // onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);");
+
+ //if (onmouseout != "")
+ // onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);");
+
+ action = "update";
+ }
+
+ var template = new Array();
+
+ template['file'] = 'image.htm?src={$src}';
+ template['width'] = 355;
+ template['height'] = 265 + (tinyMCE.isMSIE ? 25 : 0);
+
+ // Language specific width and height addons
+ template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0);
+
+ if (inst.settings['insertimage_callback']) {
+ var returnVal = eval(inst.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");
+ if (returnVal && returnVal['src'])
+ TinyMCE_AdvancedTheme._insertImage(returnVal['src'], returnVal['alt'], returnVal['border'], returnVal['hspace'], returnVal['vspace'], returnVal['width'], returnVal['height'], returnVal['align'], returnVal['title'], returnVal['onmouseover'], returnVal['onmouseout']);
+ } else
+ tinyMCE.openWindow(template, {src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align, title : title, onmouseover : onmouseover, onmouseout : onmouseout, action : action, inline : "yes"});
+
+ return true;
+
+ case "mceForeColor":
+ var template = new Array();
+ var elm = tinyMCE.selectedInstance.getFocusElement();
+ var inputColor = tinyMCE.getAttrib(elm, "color");
+
+ if (inputColor == '')
+ inputColor = elm.style.color;
+
+ if (!inputColor)
+ inputColor = "#000000";
+
+ template['file'] = 'color_picker.htm';
+ template['width'] = 220;
+ template['height'] = 190;
+
+ tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", command : "forecolor", input_color : inputColor});
+ return true;
+
+ case "mceBackColor":
+ var template = new Array();
+ var elm = tinyMCE.selectedInstance.getFocusElement();
+ var inputColor = elm.style.backgroundColor;
+
+ if (!inputColor)
+ inputColor = "#000000";
+
+ template['file'] = 'color_picker.htm';
+ template['width'] = 220;
+ template['height'] = 190;
+
+ template['width'] += tinyMCE.getLang('lang_theme_advanced_backcolor_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_theme_advanced_backcolor_delta_height', 0);
+
+ tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", command : "HiliteColor", input_color : inputColor});
+ //mceBackColor
+ return true;
+
+ case "mceColorPicker":
+ if (user_interface) {
+ var template = new Array();
+ var inputColor = value['document'].getElementById(value['element_id']).value;
+
+ template['file'] = 'color_picker.htm';
+ template['width'] = 220;
+ template['height'] = 190;
+ template['close_previous'] = "no";
+
+ template['width'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height', 0);
+
+ if (typeof(value['store_selection']) == "undefined")
+ value['store_selection'] = true;
+
+ tinyMCE.lastColorPickerValue = value;
+ tinyMCE.openWindow(template, {editor_id : editor_id, mce_store_selection : value['store_selection'], inline : "yes", command : "mceColorPicker", input_color : inputColor});
+ } else {
+ var savedVal = tinyMCE.lastColorPickerValue;
+ var elm = savedVal['document'].getElementById(savedVal['element_id']);
+ elm.value = value;
+
+ if (elm.onchange != null && elm.onchange != '')
+ eval('elm.onchange();');
+ }
+ return true;
+
+ case "mceCodeEditor":
+ var template = new Array();
+
+ template['file'] = 'source_editor.htm';
+ template['width'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_width", 720));
+ template['height'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_height", 580));
+
+ tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no", inline : "yes"});
+ return true;
+
+ case "mceCharMap":
+ var template = new Array();
+
+ template['file'] = 'charmap.htm';
+ template['width'] = 550 + (tinyMCE.isOpera ? 40 : 0);
+ template['height'] = 250;
+
+ template['width'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_height', 0);
+
+ tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});
+ return true;
+
+ case "mceInsertAnchor":
+ var template = new Array();
+
+ template['file'] = 'anchor.htm';
+ template['width'] = 320;
+ template['height'] = 90 + (tinyMCE.isNS7 ? 30 : 0);
+
+ template['width'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_width', 0);
+ template['height'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_height', 0);
+
+ tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});
+ return true;
+
+ case "mceNewDocument":
+ if (confirm(tinyMCE.getLang('lang_newdocument')))
+ tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, ' ');
+
+ return true;
+ }
+
+ return false;
+ },
+
+ /**
+ * Editor instance template function.
+ */
+ getEditorTemplate : function(settings, editorId) {
+ function removeFromArray(in_array, remove_array) {
+ var outArray = new Array();
+
+ 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");
+
+ // Setup style select options -- MOVED UP FOR EXTERNAL TOOLBAR COMPATABILITY!
+ 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" : //the default TinyMCE Layout (for backwards compatibility)...
+ var toolbarHTML = "";
+ var toolbarLocation = tinyMCE.getParam("theme_advanced_toolbar_location", "bottom");
+ var toolbarAlign = tinyMCE.getParam("theme_advanced_toolbar_align", "center");
+ var pathLocation = tinyMCE.getParam("theme_advanced_path_location", "none"); // Compatiblity
+ var statusbarLocation = tinyMCE.getParam("theme_advanced_statusbar_location", pathLocation);
+ var defVals = {
+ theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",
+ theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",
+ theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"
+ };
+
+ // Add accessibility control
+ toolbarHTML += '<a href="#" accesskey="q" title="' + tinyMCE.getLang("lang_toolbar_focus") + '"';
+
+ if (!tinyMCE.getParam("accessibility_focus"))
+ toolbarHTML += ' onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"';
+
+ toolbarHTML += '></a>';
+
+ // Render rows
+ 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;
+ }
+ }
+
+ // Add accessibility control
+ toolbarHTML += '<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"></a>';
+
+ // Setup template html
+ template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';
+
+ if (toolbarLocation == "top") {
+ template['html'] += '<tr><td class="mceToolbarTop" align="' + toolbarAlign + '" height="1" nowrap="nowrap">' + toolbarHTML + '</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 class="mceToolbarBottom" align="' + toolbarAlign + '" height="1">' + toolbarHTML + '</td></tr>';
+ }
+
+ // External toolbar changes
+ if (toolbarLocation == "external") {
+ var bod = document.body;
+ var elm = document.createElement ("div");
+
+ toolbarHTML = tinyMCE.replaceVar(toolbarHTML, 'style_select_options', styleSelectHTML);
+ toolbarHTML = tinyMCE.applyTemplate(toolbarHTML, {editor_id : editorId});
+
+ elm.className = "mceToolbarExternal";
+ elm.id = editorId+"_toolbar";
+ elm.innerHTML = '<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';
+ bod.appendChild (elm);
+ // bod.style.marginTop = elm.offsetHeight + "px";
+
+ deltaHeight = 0;
+ tinyMCE.getInstanceById(editorId).toolbarElement = elm;
+
+ //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"];
+ } 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>';
+ //"SimpleLayout"
+ break;
+
+ case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom.
+ 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");
+
+ //Render Containers:
+ for (var i = 0; i < containers.length; i++)
+ {
+ if (containers[i] == "mceEditor") //Exceptions for mceEditor and ...
+ template['html'] += '<tr><td align="center" class="mceEditor_border"><span id="{$editor_id}"></span></td></tr>';
+ else if (containers[i] == "mceElementpath" || containers[i] == "mceStatusbar") // ... mceElementpath:
+ {
+ var pathClass = "mceStatusbar";
+
+ if (i == containers.length-1)
+ {
+ pathClass = "mceStatusbarBottom";
+ }
+ else if (i == 0)
+ {
+ pathClass = "mceStatusbar";
+ }
+ else
+ {
+ deltaHeight-=2;
+ }
+
+ template['html'] += '<tr><td class="' + pathClass + '" height="1">' + statusbarHTML + '</td></tr>';
+ deltaHeight -= 22;
+ } else { // Render normal Container
+ var curContainer = tinyMCE.getParam("theme_advanced_container_"+containers[i], "", true, ',');
+ var curContainerHTML = "";
+ var curAlign = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align", defaultContainerAlign);
+ var curCSS = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class", defaultContainerCSS);
+
+ 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>';
+ //RowLayout
+ break;
+
+ case "CustomLayout" : //User defined layout callback...
+ var customLayout = tinyMCE.getParam("theme_advanced_custom_layout","");
+
+ if (customLayout != "" && eval("typeof(" + customLayout + ")") != "undefined") {
+ template = eval(customLayout + "(template);");
+ }
+ break;
+ }
+
+ if (resizing)
+ template['html'] += '<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';
+
+ template['html'] = tinyMCE.replaceVar(template['html'], 'style_select_options', styleSelectHTML);
+ template['delta_width'] = 0;
+ template['delta_height'] = deltaHeight;
+
+ return template;
+ },
+
+ initInstance : function(inst) {
+ if (tinyMCE.getParam("theme_advanced_resizing", false)) {
+ if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {
+ var w = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_width");
+ var h = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_height");
+
+ TinyMCE_AdvancedTheme._resizeTo(inst, w, h, tinyMCE.getParam("theme_advanced_resize_horizontal", true));
+ }
+ }
+
+ inst.addShortcut('ctrl', 'k', 'lang_link_desc', 'mceLink');
+ },
+
+ /**
+ * Node change handler.
+ */
+ handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection, setup_content) {
+ 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;
+ };
+
+ function getAttrib(elm, name) {
+ return elm.getAttribute(name) ? elm.getAttribute(name) : "";
+ };
+
+ // No node provided
+ if (node == null)
+ return;
+
+ // Update path
+ var pathElm = document.getElementById(editor_id + "_path");
+ var inst = tinyMCE.getInstanceById(editor_id);
+ var doc = inst.getDoc();
+
+ if (pathElm) {
+ // Get node path
+ var parentNode = node;
+ var path = new Array();
+
+ while (parentNode != null) {
+ if (parentNode.nodeName.toUpperCase() == "BODY") {
+ break;
+ }
+
+ // Only append element nodes to path
+ if (parentNode.nodeType == 1 && tinyMCE.getAttrib(parentNode, "class").indexOf('mceItemHidden') == -1) {
+ path[path.length] = parentNode;
+ }
+
+ parentNode = parentNode.parentNode;
+ }
+
+ // Setup HTML
+ var html = "";
+ for (var i=path.length-1; i>=0; i--) {
+ var nodeName = path[i].nodeName.toLowerCase();
+ var nodeData = "";
+
+ if (nodeName == "b") {
+ nodeName = "strong";
+ }
+
+ if (nodeName == "i") {
+ nodeName = "em";
+ }
+
+ if (nodeName == "span") {
+ var cn = tinyMCE.getAttrib(path[i], "class");
+ if (cn != "" && cn.indexOf('mceItem') == -1)
+ nodeData += "class: " + cn + " ";
+
+ var st = tinyMCE.getAttrib(path[i], "style");
+ if (st != "") {
+ st = tinyMCE.serializeStyle(tinyMCE.parseStyle(st));
+ nodeData += "style: " + st + " ";
+ }
+ }
+
+ if (nodeName == "font") {
+ if (tinyMCE.getParam("convert_fonts_to_spans"))
+ nodeName = "span";
+
+ var face = tinyMCE.getAttrib(path[i], "face");
+ if (face != "")
+ nodeData += "font: " + face + " ";
+
+ var size = tinyMCE.getAttrib(path[i], "size");
+ if (size != "")
+ nodeData += "size: " + size + " ";
+
+ var color = tinyMCE.getAttrib(path[i], "color");
+ if (color != "")
+ nodeData += "color: " + color + " ";
+ }
+
+ if (getAttrib(path[i], 'id') != "") {
+ nodeData += "id: " + path[i].getAttribute('id') + " ";
+ }
+
+ var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);
+ if (className != "" && className.indexOf('mceItem') == -1)
+ nodeData += "class: " + className + " ";
+
+ if (getAttrib(path[i], 'src') != "") {
+ var src = tinyMCE.getAttrib(path[i], "mce_src");
+
+ if (src == "")
+ src = tinyMCE.getAttrib(path[i], "src");
+
+ nodeData += "src: " + src + " ";
+ }
+
+ if (getAttrib(path[i], 'href') != "") {
+ var href = tinyMCE.getAttrib(path[i], "mce_href");
+
+ if (href == "")
+ href = tinyMCE.getAttrib(path[i], "href");
+
+ nodeData += "href: " + href + " ";
+ }
+
+ if (nodeName == "img" && tinyMCE.getAttrib(path[i], "class").indexOf('mceItemFlash') != -1) {
+ nodeName = "flash";
+ nodeData = "src: " + path[i].getAttribute('title');
+ }
+
+ if (nodeName == "a" && (anchor = tinyMCE.getAttrib(path[i], "name")) != "") {
+ nodeName = "a";
+ nodeName += "#" + anchor;
+ nodeData = "";
+ }
+
+ if (getAttrib(path[i], 'name').indexOf("mce_") != 0) {
+ var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);
+ if (className != "" && className.indexOf('mceItem') == -1) {
+ nodeName += "." + className;
+ }
+ }
+
+ var cmd = 'tinyMCE.execInstanceCommand(\'' + editor_id + '\',\'mceSelectNodeDepth\',false,\'' + i + '\');';
+ html += '<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;';
+ }
+
+ // Reset old states
+ tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_bold', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_italic', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_underline', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_sub', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_sup', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_link', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_unlink', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_image', 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_hr', 'mceButtonNormal');
+
+ if (node.nodeName == "A" && tinyMCE.getAttrib(node, "class").indexOf('mceItemAnchor') != -1)
+ tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonSelected');
+
+ // Get link
+ var anchorLink = tinyMCE.getParentElement(node, "a", "href");
+
+ if (anchorLink || any_selection) {
+ tinyMCE.switchClass(editor_id + '_link', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal');
+ tinyMCE.switchClass(editor_id + '_unlink', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal');
+ }
+
+ // Handle visual aid
+ tinyMCE.switchClass(editor_id + '_visualaid', visual_aid ? 'mceButtonSelected' : 'mceButtonNormal');
+
+ if (undo_levels != -1) {
+ tinyMCE.switchClass(editor_id + '_undo', 'mceButtonDisabled');
+ tinyMCE.switchClass(editor_id + '_redo', 'mceButtonDisabled');
+ }
+
+ // Within li, blockquote
+ if (tinyMCE.getParentElement(node, "li,blockquote"))
+ tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonNormal');
+
+ // Has redo levels
+ if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0))
+ tinyMCE.switchClass(editor_id + '_redo', 'mceButtonNormal');
+
+ // Has undo levels
+ if (undo_index != -1 && (undo_index > 0 && undo_levels > 0))
+ tinyMCE.switchClass(editor_id + '_undo', 'mceButtonNormal');
+
+ // Select class in select box
+ var selectElm = document.getElementById(editor_id + "_styleSelect");
+
+ if (selectElm) {
+ TinyMCE_AdvancedTheme._setupCSSClasses(editor_id);
+
+ classNode = node;
+ breakOut = false;
+ var index = 0;
+
+ do {
+ if (classNode && classNode.className) {
+ for (var i=0; i<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;
+ }
+
+ // Select formatblock
+ 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, "");
+ }
+
+ // Select fontselect
+ var selectElm = document.getElementById(editor_id + "_fontNameSelect");
+ if (selectElm) {
+ if (!tinyMCE.isSafari && !(tinyMCE.isMSIE && !tinyMCE.isOpera)) {
+ var face = inst.queryCommandValue('FontName');
+
+ face = face == null || face == "" ? "" : face;
+
+ selectByValue(selectElm, face, face != "");
+ } else {
+ var elm = tinyMCE.getParentElement(node, "font", "face");
+
+ if (elm) {
+ var family = tinyMCE.getAttrib(elm, "face");
+
+ if (family == '')
+ family = '' + elm.style.fontFamily;
+
+ if (!selectByValue(selectElm, family, family != ""))
+ selectByValue(selectElm, "");
+ } else
+ selectByValue(selectElm, "");
+ }
+ }
+
+ // Select fontsize
+ var selectElm = document.getElementById(editor_id + "_fontSizeSelect");
+ if (selectElm) {
+ if (!tinyMCE.isSafari && !tinyMCE.isOpera) {
+ var size = inst.queryCommandValue('FontSize');
+ selectByValue(selectElm, size == null || size == "" ? "0" : size);
+ } else {
+ var elm = tinyMCE.getParentElement(node, "font", "size");
+ if (elm) {
+ var size = tinyMCE.getAttrib(elm, "size");
+
+ if (size == '') {
+ var sizes = new Array('', '8px', '10px', '12px', '14px', '18px', '24px', '36px');
+
+ size = '' + elm.style.fontSize;
+
+ for (var i=0; i<sizes.length; i++) {
+ if (('' + sizes[i]) == size) {
+ size = i;
+ break;
+ }
+ }
+ }
+
+ if (!selectByValue(selectElm, size))
+ selectByValue(selectElm, "");
+ } else
+ selectByValue(selectElm, "0");
+ }
+ }
+
+ // Handle align attributes
+ 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);
+
+ // Div justification
+ var div = tinyMCE.getParentElement(node, "div");
+ if (div && div.style.textAlign == "center")
+ tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonSelected');
+
+ // Do special text
+ if (!setup_content) {
+ // , "JustifyLeft", "_justifyleft", "JustifyCenter", "justifycenter", "JustifyRight", "justifyright", "JustifyFull", "justifyfull", "InsertUnorderedList", "bullist", "InsertOrderedList", "numlist", "InsertUnorderedList", "bullist", "Outdent", "outdent", "Indent", "indent", "subscript", "sub"
+ 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');
+ }
+
+ // Handle elements
+ 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 (getAttrib(node, 'name').indexOf('mce_') != 0) {
+ tinyMCE.switchClass(editor_id + '_image', 'mceButtonSelected');
+ }
+ break;
+ }
+ } while ((node = node.parentNode) != null);
+ },
+
+ // Private theme internal functions
+
+ // This function auto imports CSS classes into the class selection droplist
+ _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]);
+ }
+
+ // Only do this once
+ 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";
+
+ // Is it to small, make it bigger again
+ if (set_w) {
+ var tableBodyElm = tableElm.firstChild;
+ var minIframeWidth = tableBodyElm.scrollWidth;
+ if (inst.iframeElement.clientWidth < minIframeWidth) {
+ dx = minIframeWidth - inst.iframeElement.clientWidth;
+
+ inst.iframeElement.style.width = (iw + dx) + "px";
+ }
+ }
+ },
+
+ /**
+ * Handles resizing events.
+ */
+ _resizeEventHandler : function(e) {
+ var resizer = TinyMCE_AdvancedTheme._resizer;
+
+ // Do nothing
+ if (!resizer.resizing)
+ return;
+
+ e = typeof(e) == "undefined" ? window.event : e;
+
+ var dx = e.screenX - resizer.downX;
+ var dy = e.screenY - resizer.downY;
+ var resizeBox = resizer.resizeBox;
+ var editorId = resizer.editorId;
+
+ switch (e.type) {
+ case "mousemove":
+ var w, h;
+
+ w = resizer.width + dx;
+ h = resizer.height + dy;
+
+ w = w < 1 ? 1 : w;
+ h = h < 1 ? 1 : h;
+
+ if (resizer.horizontal)
+ resizeBox.style.width = w + "px";
+
+ resizeBox.style.height = h + "px";
+ break;
+
+ case "mouseup":
+ TinyMCE_AdvancedTheme._setResizing(e, editorId, false);
+ TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId), resizer.width + dx, resizer.height + dy, resizer.horizontal);
+
+ // Expire in a month
+ if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {
+ var expires = new Date();
+ expires.setTime(expires.getTime() + 3600000 * 24 * 30);
+
+ // Set the cookies
+ TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires);
+ TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires);
+ }
+ break;
+ }
+ },
+
+ /**
+ * Starts/stops the editor resizing.
+ */
+ _setResizing : function(e, editor_id, state) {
+ e = typeof(e) == "undefined" ? window.event : e;
+
+ var resizer = TinyMCE_AdvancedTheme._resizer;
+ var editorContainer = document.getElementById(editor_id + '_parent');
+ var editorArea = document.getElementById(editor_id + '_parent').firstChild;
+ var resizeBox = document.getElementById(editor_id + '_resize_box');
+ var inst = tinyMCE.getInstanceById(editor_id);
+
+ if (state) {
+ // Place box over editor area
+ var width = editorArea.clientWidth;
+ var height = editorArea.clientHeight;
+
+ resizeBox.style.width = width + "px";
+ resizeBox.style.height = height + "px";
+
+ resizer.iframeWidth = inst.iframeElement.clientWidth;
+ resizer.iframeHeight = inst.iframeElement.clientHeight;
+
+ // Hide editor and show resize box
+ editorArea.style.display = "none";
+ resizeBox.style.display = "block";
+
+ // Add event handlers, only once
+ if (!resizer.eventHandlers) {
+ if (tinyMCE.isMSIE)
+ tinyMCE.addEvent(document, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);
+ else
+ tinyMCE.addEvent(window, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);
+
+ tinyMCE.addEvent(document, "mouseup", TinyMCE_AdvancedTheme._resizeEventHandler);
+
+ resizer.eventHandlers = true;
+ }
+
+ resizer.resizing = true;
+ resizer.downX = e.screenX;
+ resizer.downY = e.screenY;
+ resizer.width = parseInt(resizeBox.style.width);
+ resizer.height = parseInt(resizeBox.style.height);
+ resizer.editorId = editor_id;
+ resizer.resizeBox = resizeBox;
+ resizer.horizontal = tinyMCE.getParam("theme_advanced_resize_horizontal", true);
+ } else {
+ resizer.resizing = false;
+ resizeBox.style.display = "none";
+ editorArea.style.display = tinyMCE.isMSIE && !tinyMCE.isOpera ? "block" : "table";
+ tinyMCE.execCommand('mceResetDesignMode');
+ }
+ },
+
+ _insertImage : function(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout) {
+ tinyMCE.execCommand('mceBeginUndoLevel');
+
+ if (src == "")
+ return;
+
+ if (!tinyMCE.imgElement && tinyMCE.isSafari) {
+ var html = "";
+
+ html += '<img src="' + src + '" alt="' + alt + '"';
+ html += ' border="' + border + '" hspace="' + hspace + '"';
+ html += ' vspace="' + vspace + '" width="' + width + '"';
+ html += ' height="' + height + '" align="' + align + '" title="' + title + '" onmouseover="' + onmouseover + '" onmouseout="' + onmouseout + '" />';
+
+ tinyMCE.execCommand("mceInsertContent", false, html);
+ } else {
+ if (!tinyMCE.imgElement && tinyMCE.selectedInstance) {
+ if (tinyMCE.isSafari)
+ tinyMCE.execCommand("mceInsertContent", false, '<img src="' + tinyMCE.uniqueURL + '" />');
+ else
+ tinyMCE.selectedInstance.contentDocument.execCommand("insertimage", false, tinyMCE.uniqueURL);
+
+ tinyMCE.imgElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "img", "src", tinyMCE.uniqueURL);
+ }
+ }
+
+ if (tinyMCE.imgElement) {
+ var needsRepaint = false;
+ var msrc = src;
+
+ src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, tinyMCE.imgElement);");
+
+ if (tinyMCE.getParam('convert_urls'))
+ msrc = src;
+
+ if (onmouseover && onmouseover != "")
+ onmouseover = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, tinyMCE.imgElement);") + "';";
+
+ if (onmouseout && onmouseout != "")
+ onmouseout = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, tinyMCE.imgElement);") + "';";
+
+ // Use alt as title if it's undefined
+ if (typeof(title) == "undefined")
+ title = alt;
+
+ if (width != tinyMCE.imgElement.getAttribute("width") || height != tinyMCE.imgElement.getAttribute("height") || align != tinyMCE.imgElement.getAttribute("align"))
+ needsRepaint = true;
+
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'src', src);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'mce_src', msrc);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'alt', alt);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'title', title);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'align', align);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'border', border, true);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'hspace', hspace, true);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'vspace', vspace, true);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'width', width, true);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'height', height, true);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'onmouseover', onmouseover);
+ tinyMCE.setAttrib(tinyMCE.imgElement, 'onmouseout', onmouseout);
+
+ // Fix for bug #989846 - Image resize bug
+ if (width && width != "")
+ tinyMCE.imgElement.style.pixelWidth = width;
+
+ if (height && height != "")
+ tinyMCE.imgElement.style.pixelHeight = height;
+
+ if (needsRepaint)
+ tinyMCE.selectedInstance.repaint();
+ }
+
+ tinyMCE.execCommand('mceEndUndoLevel');
+ },
+
+ _insertLink : function(href, target, title, onclick, style_class) {
+ tinyMCE.execCommand('mceBeginUndoLevel');
+
+ if (tinyMCE.selectedInstance && tinyMCE.selectedElement && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {
+ var doc = tinyMCE.selectedInstance.getDoc();
+ var linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");
+ var newLink = false;
+
+ if (!linkElement) {
+ linkElement = doc.createElement("a");
+ newLink = true;
+ }
+
+ var mhref = href;
+ var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);");
+ mhref = tinyMCE.getParam('convert_urls') ? href : mhref;
+
+ tinyMCE.setAttrib(linkElement, 'href', thref);
+ tinyMCE.setAttrib(linkElement, 'mce_href', mhref);
+ tinyMCE.setAttrib(linkElement, 'target', target);
+ tinyMCE.setAttrib(linkElement, 'title', title);
+ tinyMCE.setAttrib(linkElement, 'onclick', onclick);
+ tinyMCE.setAttrib(linkElement, 'class', style_class);
+
+ if (newLink) {
+ linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));
+ tinyMCE.selectedElement.parentNode.replaceChild(linkElement, tinyMCE.selectedElement);
+ }
+
+ return;
+ }
+
+ if (!tinyMCE.linkElement && tinyMCE.selectedInstance) {
+ if (tinyMCE.isSafari) {
+ tinyMCE.execCommand("mceInsertContent", false, '<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);
+
+// Add default buttons maps for advanced theme and all internal plugins
+tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);
diff --git a/program/js/tiny_mce/themes/advanced/image.htm b/program/js/tiny_mce/themes/advanced/image.htm
new file mode 100644
index 000000000..e971bf916
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/image.htm
@@ -0,0 +1,100 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_insert_image_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/form_utils.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/image.js"></script>
+ <base target="_self" />
+</head>
+<body id="image" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+<form onsubmit="insertImage();return false;" action="#">
+ <div class="tabs">
+ <ul>
+ <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>
+ </ul>
+ </div>
+
+ <div class="panel_wrapper">
+ <div id="general_panel" class="panel current">
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <td nowrap="nowrap"><label for="src">{$lang_insert_image_src}</label></td>
+ <td><table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><input id="src" name="src" type="text" value="" style="width: 200px" onchange="getImageData();"></td>
+ <td id="srcbrowsercontainer">&nbsp;</td>
+ </tr>
+ </table></td>
+ </tr>
+ <!-- Image list -->
+ <script language="javascript">
+ if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {
+ var html = "";
+
+ html += '<tr><td><label for="image_list">{$lang_image_list}</label></td>';
+ html += '<td><select id="image_list" name="image_list" style="width: 200px" onchange="this.form.src.value=this.options[this.selectedIndex].value;resetImageData();getImageData();">';
+ html += '<option value="">---</option>';
+
+ for (var i=0; i<tinyMCEImageList.length; i++)
+ html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[i][0] + '</option>';
+
+ html += '</select></td></tr>';
+
+ document.write(html);
+ }
+ </script>
+ <!-- /Image list -->
+ <tr>
+ <td nowrap="nowrap"><label for="alt">{$lang_insert_image_alt}</label></td>
+ <td><input id="alt" name="alt" type="text" value="" style="width: 200px"></td>
+ </tr>
+ <tr>
+ <td nowrap="nowrap"><label for="align">{$lang_insert_image_align}</label></td>
+ <td><select id="align" name="align">
+ <option value="">{$lang_insert_image_align_default}</option>
+ <option value="baseline">{$lang_insert_image_align_baseline}</option>
+ <option value="top">{$lang_insert_image_align_top}</option>
+ <option value="middle">{$lang_insert_image_align_middle}</option>
+ <option value="bottom">{$lang_insert_image_align_bottom}</option>
+ <option value="texttop">{$lang_insert_image_align_texttop}</option>
+ <option value="absmiddle">{$lang_insert_image_align_absmiddle}</option>
+ <option value="absbottom">{$lang_insert_image_align_absbottom}</option>
+ <option value="left">{$lang_insert_image_align_left}</option>
+ <option value="right">{$lang_insert_image_align_right}</option>
+ </select></td>
+ </tr>
+ <tr>
+ <td nowrap="nowrap"><label for="width">{$lang_insert_image_dimensions}</label></td>
+ <td><input id="width" name="width" type="text" value="" size="3" maxlength="3">
+ x
+ <input id="height" name="height" type="text" value="" size="3" maxlength="3"></td>
+ </tr>
+ <tr>
+ <td nowrap="nowrap"><label for="border">{$lang_insert_image_border}</label></td>
+ <td><input id="border" name="border" type="text" value="" size="3" maxlength="3"></td>
+ </tr>
+ <tr>
+ <td nowrap="nowrap"><label for="vspace">{$lang_insert_image_vspace}</label></td>
+ <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3"></td>
+ </tr>
+ <tr>
+ <td nowrap="nowrap"><label for="hspace">{$lang_insert_image_hspace}</label></td>
+ <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3"></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+
+ <div class="mceActionPanel">
+ <div style="float: left">
+ <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertImage();" />
+ </div>
+
+ <div style="float: right">
+ <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+ </div>
+ </div>
+</form>
+</body>
+</html>
diff --git a/program/js/tiny_mce/themes/advanced/images/anchor.gif b/program/js/tiny_mce/themes/advanced/images/anchor.gif
new file mode 100644
index 000000000..34ab71534
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/anchor.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif b/program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif
new file mode 100644
index 000000000..2eafd7954
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/backcolor.gif b/program/js/tiny_mce/themes/advanced/images/backcolor.gif
new file mode 100644
index 000000000..8a532e5e6
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/backcolor.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold.gif b/program/js/tiny_mce/themes/advanced/images/bold.gif
new file mode 100644
index 000000000..d6a9cc2cd
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/bold.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold_de_se.gif b/program/js/tiny_mce/themes/advanced/images/bold_de_se.gif
new file mode 100644
index 000000000..9b129de25
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/bold_de_se.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold_es.gif b/program/js/tiny_mce/themes/advanced/images/bold_es.gif
new file mode 100644
index 000000000..ea341e608
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/bold_es.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold_fr.gif b/program/js/tiny_mce/themes/advanced/images/bold_fr.gif
new file mode 100644
index 000000000..281645451
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/bold_fr.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold_ru.gif b/program/js/tiny_mce/themes/advanced/images/bold_ru.gif
new file mode 100644
index 000000000..e000d461c
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/bold_ru.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bold_tw.gif b/program/js/tiny_mce/themes/advanced/images/bold_tw.gif
new file mode 100644
index 000000000..82085432c
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/bold_tw.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/browse.gif b/program/js/tiny_mce/themes/advanced/images/browse.gif
new file mode 100644
index 000000000..c786d0b20
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/browse.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/bullist.gif b/program/js/tiny_mce/themes/advanced/images/bullist.gif
new file mode 100644
index 000000000..6e19467c7
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/bullist.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/button_menu.gif b/program/js/tiny_mce/themes/advanced/images/button_menu.gif
new file mode 100644
index 000000000..c3d8fa231
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/button_menu.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/buttons.gif b/program/js/tiny_mce/themes/advanced/images/buttons.gif
new file mode 100644
index 000000000..6196350de
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/buttons.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif b/program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif
new file mode 100644
index 000000000..4b4aeefcb
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/charmap.gif b/program/js/tiny_mce/themes/advanced/images/charmap.gif
new file mode 100644
index 000000000..3cdc4ac91
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/charmap.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/cleanup.gif b/program/js/tiny_mce/themes/advanced/images/cleanup.gif
new file mode 100644
index 000000000..16491f6cf
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/cleanup.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/close.gif b/program/js/tiny_mce/themes/advanced/images/close.gif
new file mode 100644
index 000000000..679ca2aa4
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/close.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/code.gif b/program/js/tiny_mce/themes/advanced/images/code.gif
new file mode 100644
index 000000000..c5d5a6727
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/code.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/color.gif b/program/js/tiny_mce/themes/advanced/images/color.gif
new file mode 100644
index 000000000..1ecd5743b
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/color.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/copy.gif b/program/js/tiny_mce/themes/advanced/images/copy.gif
new file mode 100644
index 000000000..dc146865c
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/copy.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/custom_1.gif b/program/js/tiny_mce/themes/advanced/images/custom_1.gif
new file mode 100644
index 000000000..4cbccdadf
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/custom_1.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/cut.gif b/program/js/tiny_mce/themes/advanced/images/cut.gif
new file mode 100644
index 000000000..4e9a70b6e
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/cut.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/forecolor.gif b/program/js/tiny_mce/themes/advanced/images/forecolor.gif
new file mode 100644
index 000000000..d5e381425
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/forecolor.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/help.gif b/program/js/tiny_mce/themes/advanced/images/help.gif
new file mode 100644
index 000000000..51a1ee420
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/help.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/hr.gif b/program/js/tiny_mce/themes/advanced/images/hr.gif
new file mode 100644
index 000000000..1a1ba2a01
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/hr.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/image.gif b/program/js/tiny_mce/themes/advanced/images/image.gif
new file mode 100644
index 000000000..4b88eddc2
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/image.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/indent.gif b/program/js/tiny_mce/themes/advanced/images/indent.gif
new file mode 100644
index 000000000..acd315bb1
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/indent.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif b/program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif
new file mode 100644
index 000000000..69c131ce2
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic.gif b/program/js/tiny_mce/themes/advanced/images/italic.gif
new file mode 100644
index 000000000..8bb330bd0
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/italic.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic_de_se.gif b/program/js/tiny_mce/themes/advanced/images/italic_de_se.gif
new file mode 100644
index 000000000..feb0309e7
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/italic_de_se.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic_es.gif b/program/js/tiny_mce/themes/advanced/images/italic_es.gif
new file mode 100644
index 000000000..4572cdb1d
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/italic_es.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic_ru.gif b/program/js/tiny_mce/themes/advanced/images/italic_ru.gif
new file mode 100644
index 000000000..a2bb69a72
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/italic_ru.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/italic_tw.gif b/program/js/tiny_mce/themes/advanced/images/italic_tw.gif
new file mode 100644
index 000000000..4f6eeaa2b
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/italic_tw.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifycenter.gif b/program/js/tiny_mce/themes/advanced/images/justifycenter.gif
new file mode 100644
index 000000000..42d609a99
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/justifycenter.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifyfull.gif b/program/js/tiny_mce/themes/advanced/images/justifyfull.gif
new file mode 100644
index 000000000..c8504f626
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/justifyfull.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifyleft.gif b/program/js/tiny_mce/themes/advanced/images/justifyleft.gif
new file mode 100644
index 000000000..e8f7e4276
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/justifyleft.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/justifyright.gif b/program/js/tiny_mce/themes/advanced/images/justifyright.gif
new file mode 100644
index 000000000..e4cea9714
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/justifyright.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/link.gif b/program/js/tiny_mce/themes/advanced/images/link.gif
new file mode 100644
index 000000000..1accf4262
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/link.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/menu_check.gif b/program/js/tiny_mce/themes/advanced/images/menu_check.gif
new file mode 100644
index 000000000..50d6afd50
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/menu_check.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/newdocument.gif b/program/js/tiny_mce/themes/advanced/images/newdocument.gif
new file mode 100644
index 000000000..a9d293842
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/newdocument.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/numlist.gif b/program/js/tiny_mce/themes/advanced/images/numlist.gif
new file mode 100644
index 000000000..a2683522f
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/numlist.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/opacity.png b/program/js/tiny_mce/themes/advanced/images/opacity.png
new file mode 100644
index 000000000..b4217cb21
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/opacity.png
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/outdent.gif b/program/js/tiny_mce/themes/advanced/images/outdent.gif
new file mode 100644
index 000000000..23f6aa408
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/outdent.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/paste.gif b/program/js/tiny_mce/themes/advanced/images/paste.gif
new file mode 100644
index 000000000..1b45000a0
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/paste.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/redo.gif b/program/js/tiny_mce/themes/advanced/images/redo.gif
new file mode 100644
index 000000000..3af90697f
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/redo.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/removeformat.gif b/program/js/tiny_mce/themes/advanced/images/removeformat.gif
new file mode 100644
index 000000000..0fa3cb797
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/removeformat.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/separator.gif b/program/js/tiny_mce/themes/advanced/images/separator.gif
new file mode 100644
index 000000000..4f39b809e
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/separator.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/spacer.gif b/program/js/tiny_mce/themes/advanced/images/spacer.gif
new file mode 100644
index 000000000..388486517
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/spacer.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif b/program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif
new file mode 100644
index 000000000..af89d803f
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/strikethrough.gif b/program/js/tiny_mce/themes/advanced/images/strikethrough.gif
new file mode 100644
index 000000000..326463591
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/strikethrough.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/sub.gif b/program/js/tiny_mce/themes/advanced/images/sub.gif
new file mode 100644
index 000000000..4d7ce30ff
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/sub.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/sup.gif b/program/js/tiny_mce/themes/advanced/images/sup.gif
new file mode 100644
index 000000000..a7145e019
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/sup.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline.gif b/program/js/tiny_mce/themes/advanced/images/underline.gif
new file mode 100644
index 000000000..1dfeb5f6d
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/underline.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline_es.gif b/program/js/tiny_mce/themes/advanced/images/underline_es.gif
new file mode 100644
index 000000000..551d9148d
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/underline_es.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline_fr.gif b/program/js/tiny_mce/themes/advanced/images/underline_fr.gif
new file mode 100644
index 000000000..551d9148d
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/underline_fr.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline_ru.gif b/program/js/tiny_mce/themes/advanced/images/underline_ru.gif
new file mode 100644
index 000000000..b78e2a498
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/underline_ru.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/underline_tw.gif b/program/js/tiny_mce/themes/advanced/images/underline_tw.gif
new file mode 100644
index 000000000..b71539048
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/underline_tw.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/undo.gif b/program/js/tiny_mce/themes/advanced/images/undo.gif
new file mode 100644
index 000000000..520796d69
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/undo.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/unlink.gif b/program/js/tiny_mce/themes/advanced/images/unlink.gif
new file mode 100644
index 000000000..5c8a33db8
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/unlink.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/visualaid.gif b/program/js/tiny_mce/themes/advanced/images/visualaid.gif
new file mode 100644
index 000000000..63caf1807
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/visualaid.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif b/program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif
new file mode 100644
index 000000000..897a01f2b
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif b/program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif
new file mode 100644
index 000000000..aee442beb
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif b/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif
new file mode 100644
index 000000000..9dc8abe1a
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif b/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif
new file mode 100644
index 000000000..616a889d1
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif b/program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif
new file mode 100644
index 000000000..c303f66dd
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif
Binary files differ
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/about.js b/program/js/tiny_mce/themes/advanced/jscripts/about.js
new file mode 100644
index 000000000..4e53c285b
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/jscripts/about.js
@@ -0,0 +1,75 @@
+function init() {
+ var inst;
+
+ tinyMCEPopup.resizeToInnerSize();
+ inst = tinyMCE.selectedInstance;
+
+ // Give FF some time
+ window.setTimeout('insertHelpIFrame();', 10);
+
+ var tcont = document.getElementById('plugintablecontainer');
+ var plugins = tinyMCE.getParam('plugins', '', true, ',');
+ if (plugins.length == 0)
+ document.getElementById('plugins_tab').style.display = 'none';
+
+ var html = "";
+ html += '<table id="plugintable">';
+ html += '<thead>';
+ html += '<tr>';
+ html += '<td>' + tinyMCE.getLang('lang_plugin') + '</td>';
+ html += '<td>' + tinyMCE.getLang('lang_author') + '</td>';
+ html += '<td>' + tinyMCE.getLang('lang_version') + '</td>';
+ html += '</tr>';
+ html += '</thead>';
+ html += '<tbody>';
+
+ for (var i=0; i<inst.plugins.length; i++) {
+ var info = getPluginInfo(inst.plugins[i]);
+
+ html += '<tr>';
+
+ if (info.infourl != null && info.infourl != '')
+ html += '<td width="50%" title="' + plugins[i] + '"><a href="' + info.infourl + '" target="mceplugin">' + info.longname + '</a></td>';
+ else
+ html += '<td width="50%" title="' + plugins[i] + '">' + info.longname + '</td>';
+
+ if (info.authorurl != null && info.authorurl != '')
+ html += '<td width="35%"><a href="' + info.authorurl + '" target="mceplugin">' + info.author + '</a></td>';
+ else
+ html += '<td width="35%">' + info.author + '</td>';
+
+ html += '<td width="15%">' + info.version + '</td>';
+ html += '</tr>';
+ }
+
+ html += '</tbody>';
+ html += '</table>';
+
+ tcont.innerHTML = html;
+}
+
+function getPluginInfo(name) {
+ if (tinyMCE.plugins[name].getInfo)
+ return tinyMCE.plugins[name].getInfo();
+
+ return {
+ longname : name,
+ authorurl : '',
+ infourl : '',
+ author : '--',
+ version : '--'
+ };
+}
+
+function insertHelpIFrame() {
+ var html = '<iframe width="100%" height="300" src="' + tinyMCE.themeURL + "/docs/" + tinyMCE.settings['docs_language'] + "/index.htm" + '"></iframe>';
+
+ document.getElementById('iframecontainer').innerHTML = html;
+
+ html = '';
+ html += '<a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a> ';
+ 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> ';
+ 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> ';
+
+ document.getElementById('buttoncontainer').innerHTML = html;
+}
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/anchor.js b/program/js/tiny_mce/themes/advanced/jscripts/anchor.js
new file mode 100644
index 000000000..e7c1c62c5
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/jscripts/anchor.js
@@ -0,0 +1,74 @@
+var action, element;
+
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+ var anchor = tinyMCE.getParentElement(inst.getFocusElement(), "a", "name");
+ var img = inst.getFocusElement();
+ action = 'insert';
+
+ if (anchor != null) {
+ element = anchor;
+ action = "update";
+ }
+
+ if (tinyMCE.getAttrib(img, "class") == "mceItemAnchor") {
+ element = img;
+ action = "update";
+ }
+
+ if (action == "update")
+ document.forms[0].anchorName.value = element.nodeName == "IMG" ? element.getAttribute("title") : element.getAttribute("name");
+
+ document.forms[0].insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true);
+}
+
+function insertAnchor() {
+ var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+ var name = document.forms[0].anchorName.value, e;
+
+ tinyMCEPopup.execCommand("mceBeginUndoLevel");
+
+ if (action == "update") {
+ if (element.nodeName == "IMG")
+ element.setAttribute("title", name);
+ else
+ element.setAttribute("name", name);
+ } else {
+ var rng = inst.getRng();
+
+ if (rng.collapse)
+ rng.collapse(false);
+
+ name = name.replace(/&/g, '&amp;');
+ name = name.replace(/\"/g, '&quot;');
+ name = name.replace(/</g, '&lt;');
+ name = name.replace(/>/g, '&gt;');
+
+ // Fix for bug #1447335
+ if (tinyMCE.isGecko)
+ html = '<a id="mceNewAnchor" name="' + name + '"></a>';
+ else
+ html = '<a name="' + name + '"></a>';
+
+ tinyMCEPopup.execCommand("mceInsertContent", false, html);
+
+ // Fix for bug #1447335 force cursor after the anchor element
+ if (tinyMCE.isGecko) {
+ e = inst.getDoc().getElementById('mceNewAnchor');
+
+ if (e) {
+ inst.selection.selectNode(e, true, false, false);
+ e.removeAttribute('id');
+ }
+ }
+
+ tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
+ }
+
+ tinyMCEPopup.execCommand("mceEndUndoLevel");
+
+ tinyMCE.triggerNodeChange();
+ tinyMCEPopup.close();
+}
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/charmap.js b/program/js/tiny_mce/themes/advanced/jscripts/charmap.js
new file mode 100644
index 000000000..eaa6a94b6
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/jscripts/charmap.js
@@ -0,0 +1,326 @@
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+}
+
+var charmap = new Array();
+
+// for mor details please see w3c.org
+// now here is the complete list ;)
+
+charmap = [
+ ['&nbsp;', '&#160;', true, 'no-break space'],
+ ['&amp;', '&#38;', true, 'ampersand'],
+ ['&quot;', '&#34;', true, 'quotation mark'],
+// finance
+ ['&cent;', '&#162;', true, 'cent sign'],
+ ['&euro;', '&#8364;', true, 'euro sign'],
+ ['&pound;', '&#163;', true, 'pound sign'],
+ ['&yen;', '&#165;', true, 'yen sign'],
+// signs
+ ['&copy;', '&#169;', true, 'copyright sign'],
+ ['&reg;', '&#174;', true, 'registered sign'],
+ ['&trade;', '&#8482;', true, 'trade mark sign'],
+ ['&permil;', '&#8240;', true, 'per mille sign'],
+ ['&micro;', '&#181;', true, 'micro sign'],
+ ['&middot;', '&#183;', true, 'middle dot'],
+ ['&bull;', '&#8226;', true, 'bullet'],
+ ['&hellip;', '&#8230;', true, 'three dot leader'],
+ ['&prime;', '&#8242;', true, 'minutes / feet'],
+ ['&Prime;', '&#8243;', true, 'seconds / inches'],
+ ['&sect;', '&#167;', true, 'section sign'],
+ ['&para;', '&#182;', true, 'paragraph sign'],
+ ['&szlig;', '&#223;', true, 'sharp s / ess-zed'],
+// quotations
+ ['&lsaquo;', '&#8249;', true, 'single left-pointing angle quotation mark'],
+ ['&rsaquo;', '&#8250;', true, 'single right-pointing angle quotation mark'],
+ ['&laquo;', '&#171;', true, 'left pointing guillemet'],
+ ['&raquo;', '&#187;', true, 'right pointing guillemet'],
+ ['&lsquo;', '&#8216;', true, 'left single quotation mark'],
+ ['&rsquo;', '&#8217;', true, 'right single quotation mark'],
+ ['&ldquo;', '&#8220;', true, 'left double quotation mark'],
+ ['&rdquo;', '&#8221;', true, 'right double quotation mark'],
+ ['&sbquo;', '&#8218;', true, 'single low-9 quotation mark'],
+ ['&bdquo;', '&#8222;', true, 'double low-9 quotation mark'],
+ ['&lt;', '&#60;', true, 'less-than sign'],
+ ['&gt;', '&#62;', true, 'greater-than sign'],
+ ['&le;', '&#8804;', true, 'less-than or equal to'],
+ ['&ge;', '&#8805;', true, 'greater-than or equal to'],
+ ['&ndash;', '&#8211;', true, 'en dash'],
+ ['&mdash;', '&#8212;', true, 'em dash'],
+ ['&macr;', '&#175;', true, 'macron'],
+ ['&oline;', '&#8254;', true, 'overline'],
+ ['&curren;', '&#164;', true, 'currency sign'],
+ ['&brvbar;', '&#166;', true, 'broken bar'],
+ ['&uml;', '&#168;', true, 'diaeresis'],
+ ['&iexcl;', '&#161;', true, 'inverted exclamation mark'],
+ ['&iquest;', '&#191;', true, 'turned question mark'],
+ ['&circ;', '&#710;', true, 'circumflex accent'],
+ ['&tilde;', '&#732;', true, 'small tilde'],
+ ['&deg;', '&#176;', true, 'degree sign'],
+ ['&minus;', '&#8722;', true, 'minus sign'],
+ ['&plusmn;', '&#177;', true, 'plus-minus sign'],
+ ['&divide;', '&#247;', true, 'division sign'],
+ ['&frasl;', '&#8260;', true, 'fraction slash'],
+ ['&times;', '&#215;', true, 'multiplication sign'],
+ ['&sup1;', '&#185;', true, 'superscript one'],
+ ['&sup2;', '&#178;', true, 'superscript two'],
+ ['&sup3;', '&#179;', true, 'superscript three'],
+ ['&frac14;', '&#188;', true, 'fraction one quarter'],
+ ['&frac12;', '&#189;', true, 'fraction one half'],
+ ['&frac34;', '&#190;', true, 'fraction three quarters'],
+// math / logical
+ ['&fnof;', '&#402;', true, 'function / florin'],
+ ['&int;', '&#8747;', true, 'integral'],
+ ['&sum;', '&#8721;', true, 'n-ary sumation'],
+ ['&infin;', '&#8734;', true, 'infinity'],
+ ['&radic;', '&#8730;', true, 'square root'],
+ ['&sim;', '&#8764;', false,'similar to'],
+ ['&cong;', '&#8773;', false,'approximately equal to'],
+ ['&asymp;', '&#8776;', true, 'almost equal to'],
+ ['&ne;', '&#8800;', true, 'not equal to'],
+ ['&equiv;', '&#8801;', true, 'identical to'],
+ ['&isin;', '&#8712;', false,'element of'],
+ ['&notin;', '&#8713;', false,'not an element of'],
+ ['&ni;', '&#8715;', false,'contains as member'],
+ ['&prod;', '&#8719;', true, 'n-ary product'],
+ ['&and;', '&#8743;', false,'logical and'],
+ ['&or;', '&#8744;', false,'logical or'],
+ ['&not;', '&#172;', true, 'not sign'],
+ ['&cap;', '&#8745;', true, 'intersection'],
+ ['&cup;', '&#8746;', false,'union'],
+ ['&part;', '&#8706;', true, 'partial differential'],
+ ['&forall;', '&#8704;', false,'for all'],
+ ['&exist;', '&#8707;', false,'there exists'],
+ ['&empty;', '&#8709;', false,'diameter'],
+ ['&nabla;', '&#8711;', false,'backward difference'],
+ ['&lowast;', '&#8727;', false,'asterisk operator'],
+ ['&prop;', '&#8733;', false,'proportional to'],
+ ['&ang;', '&#8736;', false,'angle'],
+// undefined
+ ['&acute;', '&#180;', true, 'acute accent'],
+ ['&cedil;', '&#184;', true, 'cedilla'],
+ ['&ordf;', '&#170;', true, 'feminine ordinal indicator'],
+ ['&ordm;', '&#186;', true, 'masculine ordinal indicator'],
+ ['&dagger;', '&#8224;', true, 'dagger'],
+ ['&Dagger;', '&#8225;', true, 'double dagger'],
+// alphabetical special chars
+ ['&Agrave;', '&#192;', true, 'A - grave'],
+ ['&Aacute;', '&#193;', true, 'A - acute'],
+ ['&Acirc;', '&#194;', true, 'A - circumflex'],
+ ['&Atilde;', '&#195;', true, 'A - tilde'],
+ ['&Auml;', '&#196;', true, 'A - diaeresis'],
+ ['&Aring;', '&#197;', true, 'A - ring above'],
+ ['&AElig;', '&#198;', true, 'ligature AE'],
+ ['&Ccedil;', '&#199;', true, 'C - cedilla'],
+ ['&Egrave;', '&#200;', true, 'E - grave'],
+ ['&Eacute;', '&#201;', true, 'E - acute'],
+ ['&Ecirc;', '&#202;', true, 'E - circumflex'],
+ ['&Euml;', '&#203;', true, 'E - diaeresis'],
+ ['&Igrave;', '&#204;', true, 'I - grave'],
+ ['&Iacute;', '&#205;', true, 'I - acute'],
+ ['&Icirc;', '&#206;', true, 'I - circumflex'],
+ ['&Iuml;', '&#207;', true, 'I - diaeresis'],
+ ['&ETH;', '&#208;', true, 'ETH'],
+ ['&Ntilde;', '&#209;', true, 'N - tilde'],
+ ['&Ograve;', '&#210;', true, 'O - grave'],
+ ['&Oacute;', '&#211;', true, 'O - acute'],
+ ['&Ocirc;', '&#212;', true, 'O - circumflex'],
+ ['&Otilde;', '&#213;', true, 'O - tilde'],
+ ['&Ouml;', '&#214;', true, 'O - diaeresis'],
+ ['&Oslash;', '&#216;', true, 'O - slash'],
+ ['&OElig;', '&#338;', true, 'ligature OE'],
+ ['&Scaron;', '&#352;', true, 'S - caron'],
+ ['&Ugrave;', '&#217;', true, 'U - grave'],
+ ['&Uacute;', '&#218;', true, 'U - acute'],
+ ['&Ucirc;', '&#219;', true, 'U - circumflex'],
+ ['&Uuml;', '&#220;', true, 'U - diaeresis'],
+ ['&Yacute;', '&#221;', true, 'Y - acute'],
+ ['&Yuml;', '&#376;', true, 'Y - diaeresis'],
+ ['&THORN;', '&#222;', true, 'THORN'],
+ ['&agrave;', '&#224;', true, 'a - grave'],
+ ['&aacute;', '&#225;', true, 'a - acute'],
+ ['&acirc;', '&#226;', true, 'a - circumflex'],
+ ['&atilde;', '&#227;', true, 'a - tilde'],
+ ['&auml;', '&#228;', true, 'a - diaeresis'],
+ ['&aring;', '&#229;', true, 'a - ring above'],
+ ['&aelig;', '&#230;', true, 'ligature ae'],
+ ['&ccedil;', '&#231;', true, 'c - cedilla'],
+ ['&egrave;', '&#232;', true, 'e - grave'],
+ ['&eacute;', '&#233;', true, 'e - acute'],
+ ['&ecirc;', '&#234;', true, 'e - circumflex'],
+ ['&euml;', '&#235;', true, 'e - diaeresis'],
+ ['&igrave;', '&#236;', true, 'i - grave'],
+ ['&iacute;', '&#237;', true, 'i - acute'],
+ ['&icirc;', '&#238;', true, 'i - circumflex'],
+ ['&iuml;', '&#239;', true, 'i - diaeresis'],
+ ['&eth;', '&#240;', true, 'eth'],
+ ['&ntilde;', '&#241;', true, 'n - tilde'],
+ ['&ograve;', '&#242;', true, 'o - grave'],
+ ['&oacute;', '&#243;', true, 'o - acute'],
+ ['&ocirc;', '&#244;', true, 'o - circumflex'],
+ ['&otilde;', '&#245;', true, 'o - tilde'],
+ ['&ouml;', '&#246;', true, 'o - diaeresis'],
+ ['&oslash;', '&#248;', true, 'o slash'],
+ ['&oelig;', '&#339;', true, 'ligature oe'],
+ ['&scaron;', '&#353;', true, 's - caron'],
+ ['&ugrave;', '&#249;', true, 'u - grave'],
+ ['&uacute;', '&#250;', true, 'u - acute'],
+ ['&ucirc;', '&#251;', true, 'u - circumflex'],
+ ['&uuml;', '&#252;', true, 'u - diaeresis'],
+ ['&yacute;', '&#253;', true, 'y - acute'],
+ ['&thorn;', '&#254;', true, 'thorn'],
+ ['&yuml;', '&#255;', true, 'y - diaeresis'],
+ ['&Alpha;', '&#913;', true, 'Alpha'],
+ ['&Beta;', '&#914;', true, 'Beta'],
+ ['&Gamma;', '&#915;', true, 'Gamma'],
+ ['&Delta;', '&#916;', true, 'Delta'],
+ ['&Epsilon;', '&#917;', true, 'Epsilon'],
+ ['&Zeta;', '&#918;', true, 'Zeta'],
+ ['&Eta;', '&#919;', true, 'Eta'],
+ ['&Theta;', '&#920;', true, 'Theta'],
+ ['&Iota;', '&#921;', true, 'Iota'],
+ ['&Kappa;', '&#922;', true, 'Kappa'],
+ ['&Lambda;', '&#923;', true, 'Lambda'],
+ ['&Mu;', '&#924;', true, 'Mu'],
+ ['&Nu;', '&#925;', true, 'Nu'],
+ ['&Xi;', '&#926;', true, 'Xi'],
+ ['&Omicron;', '&#927;', true, 'Omicron'],
+ ['&Pi;', '&#928;', true, 'Pi'],
+ ['&Rho;', '&#929;', true, 'Rho'],
+ ['&Sigma;', '&#931;', true, 'Sigma'],
+ ['&Tau;', '&#932;', true, 'Tau'],
+ ['&Upsilon;', '&#933;', true, 'Upsilon'],
+ ['&Phi;', '&#934;', true, 'Phi'],
+ ['&Chi;', '&#935;', true, 'Chi'],
+ ['&Psi;', '&#936;', true, 'Psi'],
+ ['&Omega;', '&#937;', true, 'Omega'],
+ ['&alpha;', '&#945;', true, 'alpha'],
+ ['&beta;', '&#946;', true, 'beta'],
+ ['&gamma;', '&#947;', true, 'gamma'],
+ ['&delta;', '&#948;', true, 'delta'],
+ ['&epsilon;', '&#949;', true, 'epsilon'],
+ ['&zeta;', '&#950;', true, 'zeta'],
+ ['&eta;', '&#951;', true, 'eta'],
+ ['&theta;', '&#952;', true, 'theta'],
+ ['&iota;', '&#953;', true, 'iota'],
+ ['&kappa;', '&#954;', true, 'kappa'],
+ ['&lambda;', '&#955;', true, 'lambda'],
+ ['&mu;', '&#956;', true, 'mu'],
+ ['&nu;', '&#957;', true, 'nu'],
+ ['&xi;', '&#958;', true, 'xi'],
+ ['&omicron;', '&#959;', true, 'omicron'],
+ ['&pi;', '&#960;', true, 'pi'],
+ ['&rho;', '&#961;', true, 'rho'],
+ ['&sigmaf;', '&#962;', true, 'final sigma'],
+ ['&sigma;', '&#963;', true, 'sigma'],
+ ['&tau;', '&#964;', true, 'tau'],
+ ['&upsilon;', '&#965;', true, 'upsilon'],
+ ['&phi;', '&#966;', true, 'phi'],
+ ['&chi;', '&#967;', true, 'chi'],
+ ['&psi;', '&#968;', true, 'psi'],
+ ['&omega;', '&#969;', true, 'omega'],
+// symbols
+ ['&alefsym;', '&#8501;', false,'alef symbol'],
+ ['&piv;', '&#982;', false,'pi symbol'],
+ ['&real;', '&#8476;', false,'real part symbol'],
+ ['&thetasym;','&#977;', false,'theta symbol'],
+ ['&upsih;', '&#978;', false,'upsilon - hook symbol'],
+ ['&weierp;', '&#8472;', false,'Weierstrass p'],
+ ['&image;', '&#8465;', false,'imaginary part'],
+// arrows
+ ['&larr;', '&#8592;', true, 'leftwards arrow'],
+ ['&uarr;', '&#8593;', true, 'upwards arrow'],
+ ['&rarr;', '&#8594;', true, 'rightwards arrow'],
+ ['&darr;', '&#8595;', true, 'downwards arrow'],
+ ['&harr;', '&#8596;', true, 'left right arrow'],
+ ['&crarr;', '&#8629;', false,'carriage return'],
+ ['&lArr;', '&#8656;', false,'leftwards double arrow'],
+ ['&uArr;', '&#8657;', false,'upwards double arrow'],
+ ['&rArr;', '&#8658;', false,'rightwards double arrow'],
+ ['&dArr;', '&#8659;', false,'downwards double arrow'],
+ ['&hArr;', '&#8660;', false,'left right double arrow'],
+ ['&there4;', '&#8756;', false,'therefore'],
+ ['&sub;', '&#8834;', false,'subset of'],
+ ['&sup;', '&#8835;', false,'superset of'],
+ ['&nsub;', '&#8836;', false,'not a subset of'],
+ ['&sube;', '&#8838;', false,'subset of or equal to'],
+ ['&supe;', '&#8839;', false,'superset of or equal to'],
+ ['&oplus;', '&#8853;', false,'circled plus'],
+ ['&otimes;', '&#8855;', false,'circled times'],
+ ['&perp;', '&#8869;', false,'perpendicular'],
+ ['&sdot;', '&#8901;', false,'dot operator'],
+ ['&lceil;', '&#8968;', false,'left ceiling'],
+ ['&rceil;', '&#8969;', false,'right ceiling'],
+ ['&lfloor;', '&#8970;', false,'left floor'],
+ ['&rfloor;', '&#8971;', false,'right floor'],
+ ['&lang;', '&#9001;', false,'left-pointing angle bracket'],
+ ['&rang;', '&#9002;', false,'right-pointing angle bracket'],
+ ['&loz;', '&#9674;', true,'lozenge'],
+ ['&spades;', '&#9824;', false,'black spade suit'],
+ ['&clubs;', '&#9827;', true, 'black club suit'],
+ ['&hearts;', '&#9829;', true, 'black heart suit'],
+ ['&diams;', '&#9830;', true, 'black diamond suit'],
+ ['&ensp;', '&#8194;', false,'en space'],
+ ['&emsp;', '&#8195;', false,'em space'],
+ ['&thinsp;', '&#8201;', false,'thin space'],
+ ['&zwnj;', '&#8204;', false,'zero width non-joiner'],
+ ['&zwj;', '&#8205;', false,'zero width joiner'],
+ ['&lrm;', '&#8206;', false,'left-to-right mark'],
+ ['&rlm;', '&#8207;', false,'right-to-left mark'],
+ ['&shy;', '&#173;', false,'soft hyphen']
+];
+
+function renderCharMapHTML() {
+ var charsPerRow = 20, tdWidth=20, tdHeight=20;
+ var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">';
+ var cols=-1;
+ for (var i=0; i<charmap.length; i++) {
+ if (charmap[i][2]==true) {
+ cols++;
+ html += ''
+ + '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap"'
+ + ' onmouseover="this.className=\'charmapOver\';'
+ + 'previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');"'
+ + ' onmouseout="this.className=\'charmap\';"'
+ + ' 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] + '">'
+ + charmap[i][1]
+ + '</a></td>';
+ if ((cols+1) % charsPerRow == 0)
+ html += '</tr><tr height="' + tdHeight + '">';
+ }
+ }
+ if (cols % charsPerRow > 0) {
+ var padd = charsPerRow - (cols % charsPerRow);
+ for (var i=0; i<padd-1; i++)
+ html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>';
+ }
+ html += '</tr></table>';
+ document.write(html);
+}
+
+function insertChar(chr) {
+ tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';');
+
+ // Refocus in window
+ if (tinyMCEPopup.isWindow)
+ window.focus();
+
+ tinyMCEPopup.close();
+}
+
+function previewChar(codeA, codeB, codeN) {
+ var elmA = document.getElementById('codeA');
+ var elmB = document.getElementById('codeB');
+ var elmV = document.getElementById('codeV');
+ var elmN = document.getElementById('codeN');
+
+ if (codeA=='#160;') {
+ elmV.innerHTML = '__';
+ } else {
+ elmV.innerHTML = '&' + codeA;
+ }
+
+ elmB.innerHTML = '&amp;' + codeA;
+ elmA.innerHTML = '&amp;' + codeB;
+ elmN.innerHTML = codeN;
+}
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/color_picker.js b/program/js/tiny_mce/themes/advanced/jscripts/color_picker.js
new file mode 100644
index 000000000..68b5db2d6
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/jscripts/color_picker.js
@@ -0,0 +1,108 @@
+function init() {
+ if (tinyMCE.isMSIE)
+ tinyMCEPopup.resizeToInnerSize();
+}
+
+function selectColor() {
+ var color = document.getElementById("selectedColorBox").value;
+
+ tinyMCEPopup.execCommand(tinyMCE.getWindowArg('command'), false, color);
+ tinyMCEPopup.close();
+}
+
+function showColor(color) {
+ document.getElementById("selectedColor").style.backgroundColor = color;
+ document.getElementById("selectedColorBox").value = color;
+}
+
+var colors = new Array(
+ "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",
+ "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",
+ "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",
+ "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",
+ "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",
+ "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",
+ "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",
+ "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",
+ "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",
+ "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",
+ "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",
+ "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",
+ "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",
+ "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",
+ "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",
+ "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",
+ "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",
+ "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",
+ "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",
+ "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",
+ "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",
+ "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",
+ "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",
+ "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",
+ "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",
+ "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",
+ "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"
+);
+
+function convertRGBToHex(col) {
+ var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
+
+ var rgb = col.replace(re, "$1,$2,$3").split(',');
+ if (rgb.length == 3) {
+ r = parseInt(rgb[0]).toString(16);
+ g = parseInt(rgb[1]).toString(16);
+ b = parseInt(rgb[2]).toString(16);
+
+ r = r.length == 1 ? '0' + r : r;
+ g = g.length == 1 ? '0' + g : g;
+ b = b.length == 1 ? '0' + b : b;
+
+ return "#" + r + g + b;
+ }
+
+ return col;
+}
+
+function convertHexToRGB(col) {
+ if (col.indexOf('#') != -1) {
+ col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');
+
+ r = parseInt(col.substring(0, 2), 16);
+ g = parseInt(col.substring(2, 4), 16);
+ b = parseInt(col.substring(4, 6), 16);
+
+ return "rgb(" + r + "," + g + "," + b + ")";
+ }
+
+ return col;
+}
+
+function renderColorMap() {
+ var html = "";
+ var inputColor = convertRGBToHex(tinyMCE.getWindowArg('input_color'));
+
+ html += '<table border="0" cellspacing="1" cellpadding="0">'
+ + '<tr>';
+ for (var i=0; i<colors.length; i++) {
+ html += '<td bgcolor="' + colors[i] + '">'
+ + '<a href="javascript:selectColor();" onfocus="showColor(\'' + colors[i] + '\');" onmouseover="showColor(\'' + colors[i] + '\');">'
+ + '<img border="0" src="images/spacer.gif" width="10" height="10" title="' + colors[i] + '" alt="' + colors[i] + '" /></a></td>';
+ if ((i+1) % 18 == 0)
+ html += '</tr><tr>';
+ }
+ html += '<tr><td colspan="18">'
+ + '<table width="100%" border="0" cellspacing="0" cellpadding="0">'
+ + '<tr><td>'
+ + '<img id="selectedColor" style="background-color:' + tinyMCE.getWindowArg('input_color') + '" border="0" src="images/spacer.gif" width="80" height="16" />'
+ + '</td><td align="right">'
+ + '<input id="selectedColorBox" name="selectedColorBox" type="text" size="7" maxlength="7" style="width:65px" value="' + inputColor + '" />'
+ + '</td></tr>'
+ + '</table>'
+ + '<div style="float: left"><input type="button" id="insert" name="insert" value="{$lang_theme_colorpicker_apply}" style="margin-top:3px" onclick="selectColor();"></div>'
+ + '<div style="float: right"><input type="button" name="cancel" value="{$lang_cancel}" style="margin-top:3px" onclick="tinyMCEPopup.close();" id="cancel" /></div>'
+ + '</td></tr>'
+ + '</table>';
+
+ document.write(html);
+} \ No newline at end of file
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/image.js b/program/js/tiny_mce/themes/advanced/jscripts/image.js
new file mode 100644
index 000000000..a52bfad6a
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/jscripts/image.js
@@ -0,0 +1,81 @@
+var url = tinyMCE.getParam("external_image_list_url");
+if (url != null) {
+ // Fix relative
+ if (url.charAt(0) != '/' && url.indexOf('://') == -1)
+ url = tinyMCE.documentBasePath + "/" + url;
+
+ document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
+}
+
+function insertImage() {
+ var src = document.forms[0].src.value;
+ var alt = document.forms[0].alt.value;
+ var border = document.forms[0].border.value;
+ var vspace = document.forms[0].vspace.value;
+ var hspace = document.forms[0].hspace.value;
+ var width = document.forms[0].width.value;
+ var height = document.forms[0].height.value;
+ var align = document.forms[0].align.options[document.forms[0].align.selectedIndex].value;
+
+ tinyMCEPopup.restoreSelection();
+ tinyMCE.themes['advanced']._insertImage(src, alt, border, hspace, vspace, width, height, align);
+ tinyMCEPopup.close();
+}
+
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
+
+ var formObj = document.forms[0];
+
+ for (var i=0; i<document.forms[0].align.options.length; i++) {
+ if (document.forms[0].align.options[i].value == tinyMCE.getWindowArg('align'))
+ document.forms[0].align.options.selectedIndex = i;
+ }
+
+ formObj.src.value = tinyMCE.getWindowArg('src');
+ formObj.alt.value = tinyMCE.getWindowArg('alt');
+ formObj.border.value = tinyMCE.getWindowArg('border');
+ formObj.vspace.value = tinyMCE.getWindowArg('vspace');
+ formObj.hspace.value = tinyMCE.getWindowArg('hspace');
+ formObj.width.value = tinyMCE.getWindowArg('width');
+ formObj.height.value = tinyMCE.getWindowArg('height');
+ formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true);
+
+ // Handle file browser
+ if (isVisible('srcbrowser'))
+ document.getElementById('src').style.width = '180px';
+
+ // Auto select image in list
+ if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {
+ for (var i=0; i<formObj.image_list.length; i++) {
+ if (formObj.image_list.options[i].value == tinyMCE.getWindowArg('src'))
+ formObj.image_list.options[i].selected = true;
+ }
+ }
+}
+
+var preloadImg = new Image();
+
+function resetImageData() {
+ var formObj = document.forms[0];
+ formObj.width.value = formObj.height.value = "";
+}
+
+function updateImageData() {
+ var formObj = document.forms[0];
+
+ if (formObj.width.value == "")
+ formObj.width.value = preloadImg.width;
+
+ if (formObj.height.value == "")
+ formObj.height.value = preloadImg.height;
+}
+
+function getImageData() {
+ preloadImg = new Image();
+ tinyMCE.addEvent(preloadImg, "load", updateImageData);
+ tinyMCE.addEvent(preloadImg, "error", function () {var formObj = document.forms[0];formObj.width.value = formObj.height.value = "";});
+ preloadImg.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], document.forms[0].src.value);
+}
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/link.js b/program/js/tiny_mce/themes/advanced/jscripts/link.js
new file mode 100644
index 000000000..57290040d
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/jscripts/link.js
@@ -0,0 +1,70 @@
+var url = tinyMCE.getParam("external_link_list_url");
+if (url != null) {
+ // Fix relative
+ if (url.charAt(0) != '/' && url.indexOf('://') == -1)
+ url = tinyMCE.documentBasePath + "/" + url;
+
+ document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
+}
+
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','theme_advanced_link');
+
+ // Handle file browser
+ if (isVisible('hrefbrowser'))
+ document.getElementById('href').style.width = '180px';
+
+ var formObj = document.forms[0];
+
+ for (var i=0; i<document.forms[0].target.options.length; i++) {
+ var option = document.forms[0].target.options[i];
+
+ if (option.value == tinyMCE.getWindowArg('target'))
+ option.selected = true;
+ }
+
+ document.forms[0].href.value = tinyMCE.getWindowArg('href');
+ document.forms[0].linktitle.value = tinyMCE.getWindowArg('title');
+ document.forms[0].insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true);
+
+ addClassesToList('styleSelect', 'theme_advanced_link_styles');
+ selectByValue(formObj, 'styleSelect', tinyMCE.getWindowArg('className'), true);
+
+ // Hide css select row if no CSS classes
+ if (formObj.styleSelect && formObj.styleSelect.options.length <= 1) {
+ var sr = document.getElementById('styleSelectRow');
+ sr.style.display = 'none';
+ sr.parentNode.removeChild(sr);
+ }
+
+ // Auto select link in list
+ if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {
+ var formObj = document.forms[0];
+
+ for (var i=0; i<formObj.link_list.length; i++) {
+ if (formObj.link_list.options[i].value == tinyMCE.getWindowArg('href'))
+ formObj.link_list.options[i].selected = true;
+ }
+ }
+}
+
+function insertLink() {
+ var href = document.forms[0].href.value;
+ var target = document.forms[0].target.options[document.forms[0].target.selectedIndex].value;
+ var title = document.forms[0].linktitle.value;
+ var style_class = document.forms[0].styleSelect ? document.forms[0].styleSelect.value : "";
+ var dummy;
+
+ // Make anchors absolute
+ if (href.charAt(0) == '#')
+ href = tinyMCE.settings['document_base_url'] + href;
+
+ if (target == '_self')
+ target = '';
+
+ tinyMCEPopup.restoreSelection();
+ tinyMCE.themes['advanced']._insertLink(href, target, title, dummy, style_class);
+ tinyMCEPopup.close();
+}
diff --git a/program/js/tiny_mce/themes/advanced/jscripts/source_editor.js b/program/js/tiny_mce/themes/advanced/jscripts/source_editor.js
new file mode 100644
index 000000000..1c1acaab7
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/jscripts/source_editor.js
@@ -0,0 +1,66 @@
+function saveContent() {
+ tinyMCE.setContent(document.getElementById('htmlSource').value);
+ tinyMCE.closeWindow(window);
+}
+
+// Fixes some charcode issues
+function fixContent(html) {
+/* html = html.replace(new RegExp('<(p|hr|table|tr|td|ol|ul|object|embed|li|blockquote)', 'gi'),'\n<$1');
+ html = html.replace(new RegExp('<\/(p|ol|ul|li|table|tr|td|blockquote|object)>', 'gi'),'</$1>\n');
+ html = tinyMCE.regexpReplace(html, '<br />','<br />\n','gi');
+ html = tinyMCE.regexpReplace(html, '\n\n','\n','gi');*/
+ return html;
+}
+
+function onLoadInit() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ document.forms[0].htmlSource.value = fixContent(tinyMCE.getContent(tinyMCE.getWindowArg('editor_id')));
+ resizeInputs();
+
+ if (tinyMCE.getParam("theme_advanced_source_editor_wrap", true)) {
+ setWrap('soft');
+ document.forms[0].wraped.checked = true;
+ }
+}
+
+function setWrap(val) {
+ var s = document.forms[0].htmlSource;
+
+ s.wrap = val;
+
+ if (tinyMCE.isGecko) {
+ var v = s.value;
+ var n = s.cloneNode(false);
+ n.setAttribute("wrap", val);
+ s.parentNode.replaceChild(n, s);
+ n.value = v;
+ }
+}
+
+function toggleWordWrap(elm) {
+ if (elm.checked)
+ setWrap('soft');
+ else
+ setWrap('off');
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function resizeInputs() {
+ if (!tinyMCE.isMSIE) {
+ wHeight = self.innerHeight-80;
+ wWidth = self.innerWidth-16;
+ } else {
+ wHeight = document.body.clientHeight - 80;
+ wWidth = document.body.clientWidth - 16;
+ }
+
+ document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px';
+ document.forms[0].htmlSource.style.width = Math.abs(wWidth) + 'px';
+}
+
+function renderWordWrap() {
+ if (tinyMCE.isMSIE || tinyMCE.isGecko)
+ document.write('<input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{$lang_theme_code_wordwrap}</label>');
+}
diff --git a/program/js/tiny_mce/themes/advanced/langs/en.js b/program/js/tiny_mce/themes/advanced/langs/en.js
new file mode 100644
index 000000000..685382e3d
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/langs/en.js
@@ -0,0 +1,81 @@
+// UK lang variables
+
+tinyMCE.addToLang('',{
+theme_style_select : '-- Styles --',
+theme_code_desc : 'Edit HTML Source',
+theme_code_title : 'HTML Source Editor',
+theme_code_wordwrap : 'Word wrap',
+theme_sub_desc : 'Subscript',
+theme_sup_desc : 'Superscript',
+theme_hr_desc : 'Insert horizontal ruler',
+theme_removeformat_desc : 'Remove formatting',
+theme_custom1_desc : 'Your custom description here',
+insert_image_border : 'Border',
+insert_image_dimensions : 'Dimensions',
+insert_image_vspace : 'Vertical space',
+insert_image_hspace : 'Horizontal space',
+insert_image_align : 'Alignment',
+insert_image_align_default : '-- Not set --',
+insert_image_align_baseline : 'Baseline',
+insert_image_align_top : 'Top',
+insert_image_align_middle : 'Middle',
+insert_image_align_bottom : 'Bottom',
+insert_image_align_texttop : 'TextTop',
+insert_image_align_absmiddle : 'Absolute Middle',
+insert_image_align_absbottom : 'Absolute Bottom',
+insert_image_align_left : 'Left',
+insert_image_align_right : 'Right',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : 'Paragraph',
+theme_div : 'Div',
+theme_address : 'Address',
+theme_pre : 'Preformatted',
+theme_h1 : 'Heading 1',
+theme_h2 : 'Heading 2',
+theme_h3 : 'Heading 3',
+theme_h4 : 'Heading 4',
+theme_h5 : 'Heading 5',
+theme_h6 : 'Heading 6',
+theme_blockquote : 'Blockquote',
+theme_code : 'Code',
+theme_samp : 'Code sample',
+theme_dt : 'Definition term ',
+theme_dd : 'Definition description',
+theme_colorpicker_title : 'Select a color',
+theme_colorpicker_apply : 'Apply',
+theme_forecolor_desc : 'Select text color',
+theme_backcolor_desc : 'Select background color',
+theme_charmap_title : 'Select custom character',
+theme_charmap_desc : 'Insert custom character',
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',
+insert_anchor_title : 'Insert/edit anchor',
+insert_anchor_name : 'Anchor name',
+theme_anchor_desc : 'Insert/edit anchor',
+theme_insert_link_titlefield : 'Title',
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+class_name : 'Class',
+newdocument : 'Are you sure you want clear all contents?',
+about_title : 'About TinyMCE',
+about : 'About',
+license : 'License',
+plugins : 'Plugins',
+plugin : 'Plugin',
+author : 'Author',
+version : 'Version',
+loaded_plugins : 'Loaded plugins',
+help : 'Help',
+not_set : '-- Not set --',
+close : 'Close',
+toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X'
+});
diff --git a/program/js/tiny_mce/themes/advanced/link.htm b/program/js/tiny_mce/themes/advanced/link.htm
new file mode 100644
index 000000000..4e72eaad5
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/link.htm
@@ -0,0 +1,100 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>{$lang_insert_link_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/form_utils.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/link.js"></script>
+ <base target="_self" />
+</head>
+<body id="link" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+<form onsubmit="insertLink();return false;" action="#">
+ <div class="tabs">
+ <ul>
+ <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>
+ </ul>
+ </div>
+
+ <div class="panel_wrapper">
+ <div id="general_panel" class="panel current">
+
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <td nowrap="nowrap"><label for="href">{$lang_insert_link_url}</label></td>
+ <td><table border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <td><input id="href" name="href" type="text" value="" style="width: 200px" /></td>
+ <td id="hrefbrowsercontainer">&nbsp;</td>
+ </tr>
+ </table></td>
+ </tr>
+ <!-- Link list -->
+ <script language="javascript">
+ if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {
+ var html = "";
+
+ html += '<tr><td><label for="link_list">{$lang_link_list}</label></td>';
+ html += '<td><select id="link_list" name="link_list" style="width: 200px" onchange="this.form.href.value=this.options[this.selectedIndex].value;">';
+ html += '<option value="">---</option>';
+
+ for (var i=0; i<tinyMCELinkList.length; i++)
+ html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';
+
+ html += '</select></td></tr>';
+
+ document.write(html);
+ }
+ </script>
+ <!-- /Link list -->
+ <tr>
+ <td nowrap="nowrap"><label for="target">{$lang_insert_link_target}</label></td>
+ <td><select id="target" name="target" style="width: 200px">
+ <option value="_self">{$lang_insert_link_target_same}</option>
+ <option value="_blank">{$lang_insert_link_target_blank}</option>
+ <script language="javascript">
+ var html = "";
+ var targets = tinyMCE.getParam('theme_advanced_link_targets', '').split(';');
+
+ for (var i=0; i<targets.length; i++) {
+ var key, value;
+
+ if (targets[i] == "")
+ continue;
+
+ key = targets[i].split('=')[0];
+ value = targets[i].split('=')[1];
+
+ html += '<option value="' + value + '">' + key + '</option>';
+ }
+
+ document.write(html);
+ </script>
+ </select></td>
+ </tr>
+ <tr>
+ <td nowrap="nowrap"><label for="linktitle">{$lang_theme_insert_link_titlefield}</label></td>
+ <td><input id="linktitle" name="linktitle" type="text" value="" style="width: 200px"></td>
+ </tr>
+ <tr id="styleSelectRow">
+ <td><label for="styleSelect">{$lang_class_name}</label></td>
+ <td>
+ <select id="styleSelect" name="styleSelect">
+ <option value="" selected>{$lang_theme_style_select}</option>
+ </select></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+
+ <div class="mceActionPanel">
+ <div style="float: left">
+ <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertLink();" />
+ </div>
+
+ <div style="float: right">
+ <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+ </div>
+ </div>
+</form>
+</body>
+</html>
diff --git a/program/js/tiny_mce/themes/advanced/source_editor.htm b/program/js/tiny_mce/themes/advanced/source_editor.htm
new file mode 100644
index 000000000..7cb4d7466
--- /dev/null
+++ b/program/js/tiny_mce/themes/advanced/source_editor.htm
@@ -0,0 +1,30 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+ <title>{$lang_theme_code_title}</title>
+ <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+ <script language="javascript" type="text/javascript" src="jscripts/source_editor.js"></script>
+ <base target="_self" />
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');" onresize="resizeInputs();" style="display: none">
+ <form name="source" onsubmit="saveContent();" action="#">
+ <div style="float: left" class="title">{$lang_theme_code_title}</div>
+
+ <div style="float: right">
+ <script language="javascript" type="text/javascript">renderWordWrap();</script>
+ </div>
+
+ <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="off"></textarea>
+
+ <div class="mceActionPanel">
+ <div style="float: left">
+ <input type="button" name="insert" value="{$lang_update}" onclick="saveContent();" id="insert" />
+ </div>
+
+ <div style="float: right">
+ <input type="button" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" id="cancel" />
+ </div>
+ </div>
+ </form>
+</body>
+</html>
diff --git a/program/js/tiny_mce/tiny_mce.js b/program/js/tiny_mce/tiny_mce.js
new file mode 100644
index 000000000..f68fb4347
--- /dev/null
+++ b/program/js/tiny_mce/tiny_mce.js
@@ -0,0 +1 @@
+function TinyMCE_Engine(){this.majorVersion="2";this.minorVersion="0.6.1";this.releaseDate="2006-05-04";this.instances=new Array();this.switchClassCache=new Array();this.windowArgs=new Array();this.loadedFiles=new Array();this.pendingFiles=new Array();this.loadingIndex=0;this.configs=new Array();this.currentConfig=0;this.eventHandlers=new Array();var 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.isGecko=ua.indexOf('Gecko')!=-1;this.isSafari=ua.indexOf('Safari')!=-1;this.isOpera=ua.indexOf('Opera')!=-1;this.isMac=ua.indexOf('Mac')!=-1;this.isNS7=ua.indexOf('Netscape/7')!=-1;this.isNS71=ua.indexOf('Netscape/7.1')!=-1;this.dialogCounter=0;this.plugins=new Array();this.themes=new Array();this.menus=new Array();this.loadedPlugins=new Array();this.buttonMap=new Array();this.isLoaded=false;if(this.isOpera){this.isMSIE=true;this.isGecko=false;this.isSafari=false;}this.idCounter=0;};TinyMCE_Engine.prototype={init:function(settings){var theme;this.settings=settings;if(typeof(document.execCommand)=='undefined')return;if(!tinyMCE.baseURL){var elements=document.getElementsByTagName('script');for(var 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)){var 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':'';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]");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("debug",false);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("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",false);this._def("fix_table_elements",false);this._def("strict_loading_mode",document.contentType=='application/xhtml+xml');this._def("hidden_tab_class",'');this._def("display_tab_class",'');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;var baseHREF=tinyMCE.settings['document_base_url'];var h=document.location.href;var p=h.indexOf('://');if(p>0&&document.location.protocol!="file:"){p=h.indexOf('/',p+3);h=h.substring(0,p);if(baseHREF.indexOf('://')==-1)baseHREF=h+baseHREF;tinyMCE.settings['document_base_url']=baseHREF;tinyMCE.settings['document_base_prefix']=h;}if(baseHREF.indexOf('?')!=-1)baseHREF=baseHREF.substring(0,baseHREF.indexOf('?'));this.settings['base_href']=baseHREF.substring(0,baseHREF.lastIndexOf('/'))+"/";theme=this.settings['theme'];this.blockRegExp=new RegExp("^(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|blockquote|center|dl|dt|dd|dir|fieldset|form|noscript|noframes|menu|isindex|samp)$","i");this.posKeyCodes=new Array(13,45,36,35,33,34,37,38,39,40);this.uniqueURL='javascript:TINYMCE_UNIQUEURL();';this.uniqueTag='<div id="mceTMPElement" style="display: none">TMP</div>';this.callbacks=new Array('onInit','getInfo','getEditorTemplate','setupContent','onChange','onPageLoad','handleNodeChange','initInstance','execCommand','getControlHTML','handleEvent','cleanup');this.settings['theme_href']=tinyMCE.baseURL+"/themes/"+theme;if(!tinyMCE.isMSIE)this.settings['force_br_newlines']=false;if(tinyMCE.getParam("popups_css",false)){var cssPath=tinyMCE.getParam("popups_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['popups_css']=this.documentBasePath+"/"+cssPath;else this.settings['popups_css']=cssPath;}else this.settings['popups_css']=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_popup.css";if(tinyMCE.getParam("editor_css",false)){var cssPath=tinyMCE.getParam("editor_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['editor_css']=this.documentBasePath+"/"+cssPath;else this.settings['editor_css']=cssPath;}else this.settings['editor_css']=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_ui.css";if(tinyMCE.settings['debug']){var msg="Debug: \n";msg+="baseURL: "+this.baseURL+"\n";msg+="documentBasePath: "+this.documentBasePath+"\n";msg+="content_css: "+this.settings['content_css']+"\n";msg+="popups_css: "+this.settings['popups_css']+"\n";msg+="editor_css: "+this.settings['editor_css']+"\n";alert(msg);}if(this.configs.length==0){if(this.isSafari&&this.getParam('safari_warning',false))alert("Safari support is very limited and should be considered experimental.\nSo there is no need to even submit bugreports on this early version.\nYou can disable this message by setting: safari_warning option to false");if(typeof(TinyMCECompressed)=="undefined"){tinyMCE.addEvent(window,"DOMContentLoaded",TinyMCE_Engine.prototype.onLoad);if(tinyMCE.isMSIE&&!tinyMCE.isOpera){if(document.body)tinyMCE.addEvent(document.body,"readystatechange",TinyMCE_Engine.prototype.onLoad);else tinyMCE.addEvent(document,"readystatechange",TinyMCE_Engine.prototype.onLoad);}tinyMCE.addEvent(window,"load",TinyMCE_Engine.prototype.onLoad);tinyMCE._addUnloadEvents();}}this.loadScript(tinyMCE.baseURL+'/themes/'+this.settings['theme']+'/editor_template'+tinyMCE.srcMode+'.js');this.loadScript(tinyMCE.baseURL+'/langs/'+this.settings['language']+'.js');this.loadCSS(this.settings['editor_css']);var p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(var i=0;i<p.length;i++){if(p[i].charAt(0)!='-')this.loadScript(tinyMCE.baseURL+'/plugins/'+p[i]+'/editor_plugin'+tinyMCE.srcMode+'.js');}}settings['cleanup_entities']=new Array();var entities=tinyMCE.getParam('entities','',true,',');for(var 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();},_addUnloadEvents:function(){if(tinyMCE.isMSIE){if(tinyMCE.settings['add_unload_trigger']){tinyMCE.addEvent(window,"unload",TinyMCE_Engine.prototype.unloadHandler);tinyMCE.addEvent(window.document,"beforeunload",TinyMCE_Engine.prototype.unloadHandler);}}else{if(tinyMCE.settings['add_unload_trigger'])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;var skip=false;var x=0,i=0,nl,le;for(x=0,csslen=ar.length;x<csslen;x++){ignore_css=false;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.isMSIE?event.srcElement:e.target;var elementId=elm.name?elm.name:elm.id;tinyMCE.settings=settings;if(tinyMCE.settings['convert_on_click']||(!elm.getAttribute('mce_noask')&&confirm(tinyMCELang['lang_edit_confirm'])))tinyMCE.addMCEControl(elm,elementId);elm.setAttribute('mce_noask','true');},updateContent:function(form_element_name){var formElement=document.getElementById(form_element_name);for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();if(inst.formElement==formElement){var doc=inst.getDoc();tinyMCE._setHTML(doc,inst.formElement.value);if(!tinyMCE.isMSIE)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);},removeMCEControl:function(editor_id){var inst=tinyMCE.getInstanceById(editor_id);if(inst){inst.switchSettings();editor_id=inst.editorId;var html=tinyMCE.getContent(editor_id);var tmpInstances=new Array();for(var instanceName in tinyMCE.instances){var instance=tinyMCE.instances[instanceName];if(!tinyMCE.isInstance(instance))continue;if(instanceName!=editor_id)tmpInstances[instanceName]=instance;}tinyMCE.instances=tmpInstances;tinyMCE.selectedElement=null;tinyMCE.selectedInstance=null;var replaceElement=document.getElementById(editor_id+"_parent");var oldTargetElement=inst.oldTargetElement;var targetName=oldTargetElement.nodeName.toLowerCase();if(targetName=="textarea"||targetName=="input"){replaceElement.parentNode.removeChild(replaceElement);oldTargetElement.style.display="inline";oldTargetElement.value=html;}else{oldTargetElement.innerHTML=html;oldTargetElement.style.display='block';replaceElement.parentNode.insertBefore(oldTargetElement,replaceElement);replaceElement.parentNode.removeChild(replaceElement);}}},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);if(inst){if(typeof(focus)=="undefined")focus=true;if(focus)inst.contentWindow.focus();inst.autoResetDesignMode();this.selectedElement=inst.getFocusElement();this.selectedInstance=inst;tinyMCE.execCommand(command,user_interface,value);if(tinyMCE.isMSIE&&window.event!=null)tinyMCE.cancelEvent(window.event);}},execCommand:function(command,user_interface,value){user_interface=user_interface?user_interface:false;value=value?value:null;if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();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;case'mceFocus':var inst=tinyMCE.getInstanceById(value);if(inst)inst.contentWindow.focus();return;case"mceAddControl":case"mceAddEditor":tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case"mceAddFrameControl":tinyMCE.addMCEControl(tinyMCE._getElementById(value['element'],value['document']),value['element'],value['document']);return;case"mceRemoveControl":case"mceRemoveEditor":tinyMCE.removeMCEControl(value);return;case"mceResetDesignMode":if(!tinyMCE.isMSIE){for(var n in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[n]))continue;try{tinyMCE.instances[n].getDoc().designMode="on";}catch(e){}}}return;}if(this.selectedInstance){this.selectedInstance.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=aw<0?300:aw;aw=aw+"px";}if(ah.indexOf('%')==-1){ah=parseInt(ah);ah=ah<0?240:ah;ah=ah+"px";}iframe.setAttribute("id",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.isMSIE&&!tinyMCE.isOpera)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.isMSIE&&!tinyMCE.isOpera)replace_element.outerHTML=iframe.outerHTML;else replace_element.parentNode.replaceChild(iframe,replace_element);if(tinyMCE.isMSIE&&!tinyMCE.isOpera)return win.frames[id];else return iframe;},setupContent:function(editor_id){var inst=tinyMCE.instances[editor_id];var doc=inst.getDoc();var head=doc.getElementsByTagName('head').item(0);var content=inst.startContent;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,'&');}inst.switchSettings();if(!tinyMCE.isMSIE&&tinyMCE.getParam("setupcontent_reload",false)&&doc.title!="blank_page"){try{doc.location.href=tinyMCE.baseURL+"/blank.htm";}catch(ex){}window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",1000);return;}if(!head){window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",10);return;}tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/themes/"+inst.settings['theme']+"/css/editor_content.css");tinyMCE.importCSS(inst.getDoc(),inst.settings['content_css']);tinyMCE.dispatchCallback(inst,'init_instance_callback','initInstance',inst);if(tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')){inst.addShortcut('ctrl','z','lang_undo_desc','Undo');inst.addShortcut('ctrl','y','lang_redo_desc','Redo');}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.getDoc().body.setAttribute('id','mceSpanFonts');if(tinyMCE.settings['nowrap'])doc.body.style.whiteSpace="nowrap";doc.body.dir=this.settings['directionality'];doc.editorId=editor_id;if(!tinyMCE.isMSIE)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.isMSIE){window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["'+editor_id+'"].getDoc(), "'+editor_id+'");}catch(e){}',500);if(tinyMCE.settings["force_br_newlines"])doc.styleSheets[0].addRule("p","margin: 0;");var body=inst.getBody();body.editorId=editor_id;}content=tinyMCE.cleanupHTMLCode(content);if(!tinyMCE.isMSIE){var contentElement=inst.getDoc().createElement("body");var doc=inst.getDoc();contentElement.innerHTML=content;if(tinyMCE.isGecko&&tinyMCE.settings['remove_lt_gt'])content=content.replace(new RegExp('&lt;&gt;','g'),"");if(tinyMCE.settings['cleanup_on_startup'])tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,doc,this.settings,contentElement));else{content=tinyMCE.regexpReplace(content,"<strong","<b","gi");content=tinyMCE.regexpReplace(content,"<em(/?)>","<i$1>","gi");content=tinyMCE.regexpReplace(content,"<em ","<i ","gi");content=tinyMCE.regexpReplace(content,"</strong>","</b>","gi");content=tinyMCE.regexpReplace(content,"</em>","</i>","gi");tinyMCE.setInnerHTML(inst.getBody(),content);}tinyMCE.convertAllRelativeURLs(inst.getBody());}else{if(tinyMCE.settings['cleanup_on_startup']){tinyMCE._setHTML(inst.getDoc(),content);eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}');}else tinyMCE._setHTML(inst.getDoc(),content);}var parentElm=inst.targetDoc.getElementById(inst.editorId+'_parent');inst.formElement=tinyMCE.isGecko?parentElm.previousSibling:parentElm.nextSibling;tinyMCE.handleVisualAid(inst.getBody(),true,tinyMCE.settings['visual'],inst);tinyMCE.dispatchCallback(inst,'setupcontent_callback','setupContent',editor_id,inst.getBody(),inst.getDoc());if(!tinyMCE.isMSIE)tinyMCE.addEventHandlers(inst);if(tinyMCE.isMSIE){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);}}tinyMCE.selectedInstance=inst;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('\\smce_src=\"[^\"]*\"','gi'),"");n.nodeValue=n.nodeValue.replace(new RegExp('\\smce_href=\"[^\"]*\"','gi'),"");}return false;});}tinyMCE._removeInternal(inst.getBody());tinyMCE.selectedInstance=inst;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('\\smce_src=\"[^\"]*\"','gi'),"");n.nodeValue=n.nodeValue.replace(new RegExp('\\smce_href=\"[^\"]*\"','gi'),"");}return false;});}},removeTinyMCEFormElements:function(form_obj){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(var i=0;i<form_obj.elements.length;i++){var 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;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.isMSIE&&!tinyMCE.isOpera){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.removeTinyMCEFormElements(tinyMCE.isMSIE?window.event.srcElement:e.target);tinyMCE.triggerSave();tinyMCE.isNotDirty=true;return;case"reset":var formObj=tinyMCE.isMSIE?window.event.srcElement:e.target;for(var 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.selectedInstance=tinyMCE.instances[e.target.editorId];}else{if(e.target.ownerDocument.editorId)tinyMCE.selectedInstance=tinyMCE.instances[e.target.ownerDocument.editorId];}if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();if(tinyMCE.isGecko&&tinyMCE.settings['force_p_newlines']&&e.keyCode==13&&!e.shiftKey){if(TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance,e)){tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.cancelEvent(e);return false;}}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");tinyMCE.cancelEvent(e);return false;}}if(tinyMCE.isMSIE&&tinyMCE.settings['force_br_newlines']&&e.keyCode==13){if(e.target.editorId)tinyMCE.selectedInstance=tinyMCE.instances[e.target.editorId];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;break;case"keyup":case"keydown":tinyMCE.hideMenus();tinyMCE.hasMouseMoved=false;if(inst&&inst.handleShortcut(e))return false;if(e.target.editorId)tinyMCE.selectedInstance=tinyMCE.instances[e.target.editorId];else return;if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();var inst=tinyMCE.selectedInstance;if(tinyMCE.isGecko&&tinyMCE.settings['force_p_newlines']&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance,e.type)){tinyMCE.execCommand("mceAddUndoLevel");e.preventDefault();return false;}}tinyMCE.selectedElement=null;tinyMCE.selectedNode=null;var elm=tinyMCE.selectedInstance.getFocusElement();tinyMCE.linkElement=tinyMCE.getParentElement(elm,"a");tinyMCE.imgElement=tinyMCE.getParentElement(elm,"img");tinyMCE.selectedElement=elm;if(tinyMCE.isGecko&&e.type=="keyup"&&e.keyCode==9)tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(),true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);if(tinyMCE.isMSIE&&e.type=="keydown"&&e.keyCode==13)tinyMCE.enterKeyElement=tinyMCE.selectedInstance.getFocusElement();if(tinyMCE.isMSIE&&e.type=="keyup"&&e.keyCode==13){var elm=tinyMCE.enterKeyElement;if(elm){var re=new RegExp('^HR|IMG|BR$','g');var dre=new RegExp('^H[1-6]$','g');if(!elm.hasChildNodes()&&!re.test(elm.nodeName)){if(dre.test(elm.nodeName))elm.innerHTML="&nbsp;&nbsp;";else elm.innerHTML="&nbsp;";}}}var keys=tinyMCE.posKeyCodes;var posKey=false;for(var i=0;i<keys.length;i++){if(keys[i]==e.keyCode){posKey=true;break;}}if(tinyMCE.isMSIE&&tinyMCE.settings['custom_undo_redo']){var keys=new Array(8,46);for(var 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(!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.isMSIE&&e.ctrlKey)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);break;case"mousedown":case"mouseup":case"click":case"focus":tinyMCE.hideMenus();if(tinyMCE.selectedInstance){tinyMCE.selectedInstance.switchSettings();tinyMCE.selectedInstance.isFocused=true;}var targetBody=tinyMCE.getParentElement(e.target,"body");for(var instanceName in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[instanceName]))continue;var inst=tinyMCE.instances[instanceName];inst.autoResetDesignMode();if(inst.getBody()==targetBody){tinyMCE.selectedInstance=inst;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)tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark=tinyMCE.selectedInstance.selection.getBookmark();if(tinyMCE.isSafari){tinyMCE.selectedInstance.lastSafariSelection=tinyMCE.selectedInstance.selection.getBookmark();tinyMCE.selectedInstance.lastSafariSelectedElement=tinyMCE.selectedElement;var lnk=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");if(lnk&&e.type=="mousedown"){lnk.setAttribute("mce_real_href",lnk.getAttribute("href"));lnk.setAttribute("href","javascript:void(0);");}if(lnk&&e.type=="click"){window.setTimeout(function(){lnk.setAttribute("href",lnk.getAttribute("mce_real_href"));lnk.removeAttribute("mce_real_href");},10);}}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.selectedInstance=tinyMCE.instances[e.target.editorId];return false;break;}},getButtonHTML:function(id,lang,img,cmd,ui,val){var h='',m,x;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.isMSIE||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;" class="mceTiledButton mceButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="background-position: '+x+'px 0" title="{$'+lang+'}" />';h+='</a>';}else{h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceButtonNormal" target="_self">';h+='<img src="'+img+'" title="{$'+lang+'}" />';h+='</a>';}return h;},addButtonMap:function(m){var i,a=m.replace(/\s+/,'').split(',');for(i=0;i<a.length;i++)this.buttonMap[a[i]]=i;},submitPatch:function(){tinyMCE.removeTinyMCEFormElements(this);tinyMCE.triggerSave();this.mceOldSubmit();tinyMCE.isNotDirty=true;},onLoad:function(){if(tinyMCE.settings.strict_loading_mode&&this.loadingIndex!=-1){window.setTimeout('tinyMCE.onLoad();',1);return;}if(tinyMCE.isMSIE&&!tinyMCE.isOpera&&window.event.type=="readystatechange"&&document.readyState!="complete")return true;if(tinyMCE.isLoaded)return true;tinyMCE.isLoaded=true;tinyMCE.dispatchCallback(null,'onpageload','onPageLoad');for(var c=0;c<tinyMCE.configs.length;c++){tinyMCE.settings=tinyMCE.configs[c];var selector=tinyMCE.getParam("editor_selector");var deselector=tinyMCE.getParam("editor_deselector");var elementRefAr=new Array();if(document.forms&&tinyMCE.settings['add_form_submit_trigger']&&!tinyMCE.submitTriggers){for(var i=0;i<document.forms.length;i++){var 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){}}}}var mode=tinyMCE.settings['mode'];switch(mode){case"exact":var elements=tinyMCE.getParam('elements','',true,',');for(var i=0;i<elements.length;i++){var element=tinyMCE._getElementById(elements[i]);var trigger=element?element.getAttribute(tinyMCE.settings['textarea_trigger']):"";if(tinyMCE.getAttrib(element,"class").indexOf(deselector)!=-1)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]);else if(tinyMCE.settings['debug'])alert("Error: Could not find element by id or name: "+elements[i]);}break;case"specific_textareas":case"textareas":var nodeList=document.getElementsByTagName("textarea");for(var i=0;i<nodeList.length;i++){var elm=nodeList.item(i);var trigger=elm.getAttribute(tinyMCE.settings['textarea_trigger']);if(selector!=''&&tinyMCE.getAttrib(elm,"class").indexOf(selector)==-1)continue;if(selector!='')trigger=selector!=""?"true":"";if(tinyMCE.getAttrib(elm,"class").indexOf(deselector)!=-1)continue;if((mode=="specific_textareas"&&trigger=="true")||(mode=="textareas"&&trigger!="false"))elementRefAr[elementRefAr.length]=elm;}break;}for(var i=0;i<elementRefAr.length;i++){var element=elementRefAr[i];var elementId=element.name?element.name:element.id;if(tinyMCE.settings['ask']||tinyMCE.settings['convert_on_click']){if(tinyMCE.isGecko){var 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{var 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();},10);}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 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);var outArray=new Array();for(var 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.innerHTML;},addToLang:function(prefix,ar){for(var key in ar){if(typeof(ar[key])=='function')continue;tinyMCELang[(key.indexOf('lang_')==-1?'lang_':'')+(prefix!=''?(prefix+"_"):'')+key]=ar[key];}this.loadNextScript();},triggerNodeChange:function(focus,setup_content){if(tinyMCE.selectedInstance){var inst=tinyMCE.selectedInstance;var editorId=inst.editorId;var elm=(typeof(setup_content)!="undefined"&&setup_content)?tinyMCE.selectedElement:inst.getFocusElement();var undoIndex=-1;var undoLevels=-1;var anySelection=false;var selectedText=inst.selection.getSelectedText();if(setup_content&&tinyMCE.isGecko&&inst.isHidden())elm=inst.getBody();inst.switchSettings();if(tinyMCE.settings["auto_resize"]){var doc=inst.getDoc();inst.iframeElement.style.width=doc.body.offsetWidth+"px";inst.iframeElement.style.height=doc.body.offsetHeight+"px";}if(tinyMCE.selectedElement)anySelection=(tinyMCE.selectedElement.nodeName.toLowerCase()=="img")||(selectedText&&selectedText.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;var customCleanup=tinyMCE.settings['cleanup_callback'];if(customCleanup!=""&&eval("typeof("+customCleanup+")")!="undefined")content=eval(customCleanup+"(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,valid_languages){var lang="en",b=tinyMCE.baseURL+'/plugins/'+name;valid_languages=valid_languages.split(',');for(var i=0;i<valid_languages.length;i++){if(tinyMCE.settings['language']==valid_languages[i])lang=tinyMCE.settings['language'];}if(this.plugins[name])b=this.plugins[name].baseURL;tinyMCE.loadScript(b+'/langs/'+lang+'.js');},applyTemplate:function(h,as){var i,s,ar=h.match(new RegExp('\\{\\$[a-z0-9_]+\\}','gi'));if(ar&&ar.length>0){for(i=ar.length-1;i>=0;i--){s=ar[i].substring(2,ar[i].length-1);if(s.indexOf('lang_')==0&&tinyMCELang[s])h=tinyMCE.replaceVar(h,s,tinyMCELang[s]);else if(as&&as[s])h=tinyMCE.replaceVar(h,s,as[s]);else if(tinyMCE.settings[s])h=tinyMCE.replaceVar(h,s,tinyMCE.settings[s]);}}h=tinyMCE.replaceVar(h,"themeurl",tinyMCE.themeURL);return h;},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;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.isMSIE)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(var 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);var 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.isMSIE&&!tinyMCE.isOpera)&&resizable!='yes'&&tinyMCE.settings["dialog_type"]=="modal"){height+=10;var features="resizable:"+resizable+";scroll:"+scrollbars+";status:yes;center:yes;help:no;dialogWidth:"+width+"px;dialogHeight:"+height+"px;";window.showModalDialog(url,window,features);}else{var modal=(resizable=="yes")?"no":"yes";if(tinyMCE.isGecko&&tinyMCE.isMac)modal="no";if(template['close_previous']!="no")try{tinyMCE.lastWindow.close();}catch(ex){}var 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;eval('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 aidClass=tinyMCE.settings['visual_table_class'];if(typeof(state)=="undefined")state=tinyMCE.settings['visual'];var classNames=new Array();var ar=class_name.split(' ');for(var 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;var className="";for(var i=0;i<classNames.length;i++){if(i>0)className+=" ";className+=classNames[i];}return className;},handleVisualAid:function(el,deep,state,inst,skip_dispatch){if(!el)return;if(!skip_dispatch)tinyMCE.dispatchCallback(inst,'handle_visual_aid_callback','handleVisualAid',el,deep,state,inst);var tableElement=null;switch(el.nodeName){case"TABLE":var oldW=el.style.width;var oldH=el.style.height;var bo=tinyMCE.getAttrib(el,"border");bo=bo==""||bo=="0"?true:false;tinyMCE.setAttrib(el,"class",tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el,"class"),state&&bo));el.style.width=oldW;el.style.height=oldH;for(var y=0;y<el.rows.length;y++){for(var x=0;x<el.rows[y].cells.length;x++){var 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":var anchorName=tinyMCE.getAttrib(el,"name");if(anchorName!=''&&state){el.title=anchorName;el.className='mceItemAnchor';}else if(anchorName!=''&&!state)el.className='';break;}if(deep&&el.hasChildNodes()){for(var i=0;i<el.childNodes.length;i++)tinyMCE.handleVisualAid(el.childNodes[i],deep,state,inst,true);}},fixGeckoBaseHREFBug:function(m,e,h){var nl,i,a,n,xsrc,xhref,el;if(tinyMCE.isGecko){if(m==1){h=h.replace(/\ssrc=/gi," mce_tsrc=");h=h.replace(/\shref=/gi," mce_thref=");return h;}else{el=new Array('a','img','select','area','iframe','base','input','script','embed','object','link');for(a=0;a<el.length;a++){n=e.getElementsByTagName(el[a]);for(i=0;i<n.length;i++){xsrc=tinyMCE.getAttrib(n[i],"mce_tsrc");xhref=tinyMCE.getAttrib(n[i],"mce_thref");if(xsrc!=""){try{n[i].src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],xsrc);}catch(e){}n[i].removeAttribute("mce_tsrc");}if(xhref!=""){try{n[i].href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],xhref);}catch(e){}n[i].removeAttribute("mce_thref");}}}el=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){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.isMSIE&&tinyMCE.settings['fix_content_duplication']){var paras=doc.getElementsByTagName("P");for(var i=0;i<paras.length;i++){var node=paras[i];while((node=node.parentNode)!=null){if(node.nodeName=="P")node.outerHTML=node.innerHTML;}}var 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];if(!inst){for(var n in tinyMCE.instances){var instance=tinyMCE.instances[n];if(!tinyMCE.isInstance(instance))continue;if(instance.formTargetElementId==editor_id){inst=instance;break;}}}return inst;},queryInstanceCommandValue:function(editor_id,command){var inst=tinyMCE.getInstanceById(editor_id);if(inst)return inst.queryCommandValue(command);return false;},queryInstanceCommandState:function(editor_id,command){var inst=tinyMCE.getInstanceById(editor_id);if(inst)return inst.queryCommandState(command);return null;},setWindowArg:function(n,v){this.windowArgs[n]=v;},getWindowArg:function(n,d){return(typeof(this.windowArgs[n])=="undefined")?d:this.windowArgs[n];},getCSSClasses:function(editor_id,doc){var output=new Array();if(typeof(tinyMCE.cssClasses)!="undefined")return tinyMCE.cssClasses;if(typeof(editor_id)=="undefined"&&typeof(doc)=="undefined"){var instance;for(var instanceName in tinyMCE.instances){instance=tinyMCE.instances[instanceName];if(!tinyMCE.isInstance(instance))continue;break;}doc=instance.getDoc();}if(typeof(doc)=="undefined"){var instance=tinyMCE.getInstanceById(editor_id);doc=instance.getDoc();}if(doc){var styles=doc.styleSheets;if(styles&&styles.length>0){for(var x=0;x<styles.length;x++){var csses=null;eval("try {var csses = tinyMCE.isMSIE ? doc.styleSheets("+x+").rules : styles["+x+"].cssRules;} catch(e) {}");if(!csses)return new Array();for(var i=0;i<csses.length;i++){var selectorText=csses[i].selectorText;if(selectorText){var rules=selectorText.split(',');for(var c=0;c<rules.length;c++){var 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){var cssClass=rule.substring(rule.indexOf('.')+1);var addClass=true;for(var p=0;p<output.length&&addClass;p++){if(output[p]==cssClass)addClass=false;}if(addClass)output[output.length]=cssClass;}}}}}}}if(output.length>0)tinyMCE.cssClasses=output;return output;},regexpReplace:function(in_str,reg_exp,replace_str,opts){if(in_str==null)return in_str;if(typeof(opts)=="undefined")opts='g';var re=new RegExp(reg_exp,opts);return in_str.replace(re,replace_str);},trim:function(s){return s.replace(/^\s*|\s*$/g,"");},cleanupEventStr:function(s){s=""+s;s=s.replace('function anonymous()\n{\n','');s=s.replace('\n}','');s=s.replace(/^return true;/gi,'');return s;},getControlHTML:function(c){var i,l,n,o,v;l=tinyMCE.plugins;for(n in l){o=l[n];if(o.getControlHTML&&(v=o.getControlHTML(c))!='')return tinyMCE.replaceVar(v,"pluginurl",o.baseURL);}o=tinyMCE.themes[tinyMCE.settings['theme']];if(o.getControlHTML&&(v=o.getControlHTML(c))!='')return v;return'';},evalFunc:function(f,idx,a){var s='(',i;for(i=idx;i<a.length;i++){s+='a['+i+']';if(i<a.length-1)s+=',';}s+=');';return eval("f"+s);},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(typeof(l)=="function"?l:eval(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(o[n],3,a))==s&&m>0)return true;}}l=tinyMCE.themes;for(on in l){o=l[on];if(o[n]&&(v=tinyMCE.evalFunc(o[n],3,a))==s&&m>0)return true;}return false;},xmlEncode:function(s){s=""+s;s=s.replace(/&/g,'&amp;');s=s.replace(new RegExp('"','g'),'&quot;');s=s.replace(/\'/g,'&#39;');s=s.replace(/</g,'&lt;');s=s.replace(/>/g,'&gt;');return s;},extend:function(p,np){var o={};o.parent=p;for(n in p)o[n]=p[n];for(n in np)o[n]=np[n];return o;},hideMenus:function(){var e=tinyMCE.lastSelectedMenuBtn;if(tinyMCE.lastMenu){tinyMCE.lastMenu.hide();tinyMCE.lastMenu=null;}if(e){tinyMCE.switchClass(e,tinyMCE.lastMenuBtnClass);tinyMCE.lastSelectedMenuBtn=null;}},explode:function(d,s){var ar=s.split(d),oar=new Array(),i;for(i=0;i<ar.length;i++){if(ar[i]!="")oar[oar.length]=ar[i];}return oar;}};var TinyMCE=TinyMCE_Engine;var tinyMCE=new TinyMCE_Engine();var tinyMCELang={};function TinyMCE_Control(settings){var t,i,to,fu,p,x,fn,fu,pn,s=settings;this.undoRedoLevel=true;this.isTinyMCE_Control=true;this.settings=s;this.settings['theme']=tinyMCE.getParam("theme","default");this.settings['width']=tinyMCE.getParam("width",-1);this.settings['height']=tinyMCE.getParam("height",-1);this.selection=new TinyMCE_Selection(this);this.undoRedo=new TinyMCE_UndoRedo(this);this.cleanup=new TinyMCE_Cleanup();this.shortcuts=new Array();this.hasMouseMoved=false;this.cleanup.init({valid_elements:s.valid_elements,extended_valid_elements:s.extended_valid_elements,entities:s.entities,entity_encoding:s.entity_encoding,debug:s.cleanup_debug,url_converter:'TinyMCE_Cleanup.prototype._urlConverter',indent:s.apply_source_formatting,invalid_elements:s.invalid_elements,verify_html:s.verify_html,fix_content_duplication:s.fix_content_duplication});t=this.settings['theme'];if(!tinyMCE.hasTheme(t)){fn=tinyMCE.callbacks;to={};for(i=0;i<fn.length;i++){if((fu=window['TinyMCE_'+t+"_"+fn[i]]))to[fn[i]]=fu;}tinyMCE.addTheme(t,to);}this.plugins=new Array();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;to={};for(x=0;x<fn.length;x++){if((fu=window['TinyMCE_'+pn+"_"+fn[x]]))to[fn[x]]=fu;}tinyMCE.addPlugin(pn,to);}this.plugins[this.plugins.length]=pn;}}};TinyMCE_Control.prototype={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(){if(tinyMCE.isMSIE&&!tinyMCE.isOpera)return;try{var s=this.selection;var 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'];}},getBody:function(){return this.getDoc().body;},getDoc:function(){return this.contentWindow.document;},getWin:function(){return this.contentWindow;},addShortcut:function(m,k,d,cmd,ui,va){var n=typeof(k)=="number",ie=tinyMCE.isMSIE,c,sc,i;var 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=this.shortcuts,o;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.isMSIE&&this.isHidden()&&tinyMCE.getParam('auto_reset_designmode'))eval('try { this.getDoc().designMode = "On"; } catch(e) {}');},isHidden:function(){if(tinyMCE.isMSIE)return false;var s=this.getSel();return(!s||!s.rangeCount||s.rangeCount==0);},isDirty:function(){return this.startContent!=tinyMCE.trim(this.getBody().innerHTML)&&!tinyMCE.isNotDirty;},_mergeElements:function(scmd,pa,ch,override){if(scmd=="removeformat"){pa.className="";pa.style.cssText="";ch.className="";ch.style.cssText="";return;}var st=tinyMCE.parseStyle(tinyMCE.getAttrib(pa,"style"));var stc=tinyMCE.parseStyle(tinyMCE.getAttrib(ch,"style"));var className=tinyMCE.getAttrib(pa,"class");className+=" "+tinyMCE.getAttrib(ch,"class");if(override){for(var n in st){if(typeof(st[n])=='function')continue;stc[n]=st[n];}}else{for(var 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");},_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 doc=this.getDoc();var win=this.getWin();var focusElm=this.getFocusElement();if(!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel','gi').test(command))this.undoBookmark=null;if(this.lastSafariSelection&&!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel','gi').test(command)){this.selection.moveToBookmark(this.lastSafariSelection);tinyMCE.selectedElement=this.lastSafariSelectedElement;}if(!tinyMCE.isMSIE&&!this.useCSS){this._setUseCSS(false);this.useCSS=true;}this.contentDocument=doc;if(tinyMCE.execCommandCallback(this,'execcommand_callback','execCommand',this.editorId,this.getBody(),command,user_interface,value))return;if(focusElm&&focusElm.nodeName=="IMG"){var align=focusElm.getAttribute('align');var img=command=="JustifyCenter"?focusElm.cloneNode(false):focusElm;switch(command){case"JustifyLeft":if(align=='left')img.removeAttribute('align');else img.setAttribute('align','left');var 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');var 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{var 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');var 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"InsertUnorderedList":case"InsertOrderedList":var tag=(command=="InsertUnorderedList")?"ul":"ol";if(tinyMCE.isSafari)this.execCommand("mceInsertContent",false,"<"+tag+"><li>&nbsp;</li><"+tag+">");else this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"Strikethrough":if(tinyMCE.isSafari)this.execCommand("mceInsertContent",false,"<strike>"+this.selection.getSelectedHTML()+"</strike>");else this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"mceSelectNode":this.selection.selectNode(value);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=value;break;case"FormatBlock":if(value==null||value==""){var elm=tinyMCE.getParentElement(this.getFocusElement(),"p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");if(elm)this.execCommand("mceRemoveNode",false,elm);}else{if(tinyMCE.isGecko&&new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>','gi').test(value))value=value.replace(/[^a-z]/gi,'');if(tinyMCE.isMSIE&&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.isMSIE){value.outerHTML=value.innerHTML;}else{var rng=value.ownerDocument.createRange();rng.setStartBefore(value);rng.setEndAfter(value);rng.deleteContents();rng.insertNode(rng.createContextualFragment(value.innerHTML));}tinyMCE.triggerNodeChange();break;case"mceSelectNodeDepth":var parentNode=this.getFocusElement();for(var i=0;parentNode;i++){if(parentNode.nodeName.toLowerCase()=="body")break;if(parentNode.nodeName.toLowerCase()=="#text"){i--;parentNode=parentNode.parentNode;continue;}if(i==value){this.selection.selectNode(parentNode,false);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=parentNode;return;}parentNode=parentNode.parentNode;}break;case"SetStyleInfo":var rng=this.getRng();var sel=this.getSel();var scmd=value['command'];var sname=value['name'];var svalue=value['value']==null?'':value['value'];var wrapper=value['wrapper']?value['wrapper']:"span";var parentElm=null;var invalidRe=new RegExp("^BODY|HTML$","g");var invalidParentsRe=tinyMCE.settings['merge_styles_invalid_parents']!=''?new RegExp(tinyMCE.settings['merge_styles_invalid_parents'],"gi"):null;if(tinyMCE.isMSIE){if(rng.item)parentElm=rng.item(0);else{var pelm=rng.parentElement();var prng=doc.selection.createRange();prng.moveToElementText(pelm);if(rng.htmlText==prng.htmlText||rng.boundingWidth==0){if(invalidParentsRe==null||!invalidParentsRe.test(pelm.nodeName))parentElm=pelm;}}}else{var felm=this.getFocusElement();if(sel.isCollapsed||(new RegExp('td|tr|tbody|table','gi').test(felm.nodeName)&&sel.anchorNode==felm.parentNode))parentElm=felm;}if(parentElm&&!invalidRe.test(parentElm.nodeName)){if(scmd=="setstyle")tinyMCE.setStyleAttrib(parentElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(parentElm,sname,svalue);if(scmd=="removeformat"){parentElm.style.cssText='';tinyMCE.setAttrib(parentElm,'class','');}var ch=tinyMCE.getNodeTree(parentElm,new Array(),1);for(var z=0;z<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(var 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(var 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,new Array(),1);for(var 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(var 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(var i=nodes.length-1;i>=0;i--){var elm=nodes[i];var isEmpty=true;var tmp=doc.createElement("body");tmp.appendChild(elm.cloneNode(false));tmp.innerHTML=tmp.innerHTML.replace(new RegExp('style=""|class=""','gi'),'');if(new RegExp('<span>','gi').test(tmp.innerHTML)){for(var 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":this.getDoc().execCommand('forecolor',false,value);break;case"HiliteColor":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);tinyMCE._setHTML(doc,value);tinyMCE.setInnerHTML(doc.body,tinyMCE._cleanupHTML(this,doc,tinyMCE.settings,doc.body));tinyMCE.convertAllRelativeURLs(doc.body);tinyMCE._removeInternal(this.getBody());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);tinyMCE.handleVisualAid(doc.body,true,this.visualAid,this);tinyMCE._setEventsEnabled(doc.body,false);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.repaint();this.selection.moveToBookmark(b);tinyMCE.triggerNodeChange();break;case"mceReplaceContent":if(!value)value='';this.getWin().focus();var selectedText="";if(tinyMCE.isMSIE){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);}tinyMCE.triggerNodeChange();break;case"mceSetAttribute":if(typeof(value)=='object'){var targetElms=(typeof(value['targets'])=="undefined")?"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address":value['targets'];var targetNode=tinyMCE.getParentElement(this.getFocusElement(),targetElms);if(targetNode){targetNode.setAttribute(value['name'],value['value']);tinyMCE.triggerNodeChange();}}break;case"mceSetCSSClass":this.execCommand("SetStyleInfo",false,{command:"setattrib",name:"class",value:value});break;case"mceInsertRawHTML":var key='tiny_mce_marker';this.execCommand('mceBeginUndoLevel');this.execCommand('mceInsertContent',false,key);var scrollX=this.getDoc().body.scrollLeft+this.getDoc().documentElement.scrollLeft;var scrollY=this.getDoc().body.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;this.getWin().focus();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.isOpera&&insertHTMLFailed){this.getDoc().execCommand("insertimage",false,tinyMCE.uniqueURL);var ar=tinyMCE.getElementsByAttributeValue(this.getBody(),"img","src",tinyMCE.uniqueURL);ar[0].outerHTML=value;return;}if(!tinyMCE.isMSIE){var isHTML=value.indexOf('<')!=-1;var sel=this.getSel();var rng=this.getRng();if(isHTML){if(tinyMCE.isSafari){var tmpRng=this.getDoc().createRange();tmpRng.setStart(this.getBody(),0);tmpRng.setEnd(this.getBody(),0);value=tmpRng.createContextualFragment(value);}else value=rng.createContextualFragment(value);}else{var el=document.createElement("div");el.innerHTML=value;value=el.firstChild.nodeValue;value=doc.createTextNode(value);}if(tinyMCE.isSafari&&!isHTML){this.execCommand('InsertText',false,value.nodeValue);tinyMCE.triggerNodeChange();return true;}else if(tinyMCE.isSafari&&isHTML){rng.deleteContents();rng.insertNode(value);tinyMCE.triggerNodeChange();return true;}rng.deleteContents();if(rng.startContainer.nodeType==3){var node=rng.startContainer.splitText(rng.startOffset);node.parentNode.insertBefore(value,node);}else rng.insertNode(value);if(!isHTML){sel.selectAllChildren(doc.body);sel.removeAllRanges();var rng=doc.createRange();rng.selectNode(value);rng.collapse(false);sel.addRange(rng);}else rng.collapse(false);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value);}else{var rng=doc.selection.createRange();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.triggerNodeChange();break;case"mceStartTyping":if(tinyMCE.settings['custom_undo_redo']&&this.undoRedo.typingUndoIndex==-1){this.undoRedo.typingUndoIndex=this.undoRedo.undoIndex;this.execCommand('mceAddUndoLevel');}break;case"mceEndTyping":if(tinyMCE.settings['custom_undo_redo']&&this.undoRedo.typingUndoIndex!=-1){this.execCommand('mceAddUndoLevel');this.undoRedo.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.isMSIE){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":var text=this.selection.getSelectedText();if(tinyMCE.isOpera){this.getDoc().execCommand("RemoveFormat",false,null);return;}if(tinyMCE.isMSIE){try{var rng=doc.selection.createRange();rng.execCommand("RemoveFormat",false,null);}catch(e){}this.execCommand("SetStyleInfo",false,{command:"removeformat"});}else{this.getDoc().execCommand(command,user_interface,value);this.execCommand("SetStyleInfo",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);},_onAdd:function(replace_element,form_element_name,target_document){var hc,th,to,editorTemplate;th=this.settings['theme'];to=tinyMCE.themes[th];var 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(to.getEditorTemplate)editorTemplate=to.getEditorTemplate(this.settings,this.editorId);var deltaWidth=editorTemplate['delta_width']?editorTemplate['delta_width']:0;var deltaHeight=editorTemplate['delta_height']?editorTemplate['delta_height']:0;var html='<span id="'+this.editorId+'_parent" class="mceEditorContainer">'+editorTemplate['html'];html=tinyMCE.replaceVar(html,"editor_id",this.editorId);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;if((""+this.settings['width']).indexOf('%')!=-1)this.settings['area_width']="100%";if((""+this.settings['height']).indexOf('%')!=-1)this.settings['area_height']="100%";if((""+replace_element.style.width).indexOf('%')!=-1){this.settings['width']=replace_element.style.width;this.settings['area_width']="100%";}if((""+replace_element.style.height).indexOf('%')!=-1){this.settings['height']=replace_element.style.height;this.settings['area_height']="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;if(tinyMCE.settings['debug']){hc='<textarea wrap="off" id="'+form_element_name+'" name="'+form_element_name+'" cols="100" rows="15"></textarea>';}else{hc='<input type="hidden" id="'+form_element_name+'" name="'+form_element_name+'" />';this.oldTargetElement.style.display="none";}html+='</span>';if(tinyMCE.isGecko)html=hc+html;else html+=hc;if(tinyMCE.isGecko){var rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);var fragment=rng.createContextualFragment(html);tinyMCE.insertAfter(fragment,replace_element);}else replace_element.insertAdjacentHTML("beforeBegin",html);}else{html+='</span>';this.oldTargetElement=replace_element;if(!tinyMCE.settings['debug'])this.oldTargetElement.style.display="none";if(tinyMCE.isGecko){var rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);var fragment=rng.createContextualFragment(html);tinyMCE.insertAfter(fragment,replace_element);}else replace_element.insertAdjacentHTML("beforeBegin",html);}var dynamicIFrame=false;var tElm=targetDoc.getElementById(this.editorId);if(!tinyMCE.isMSIE){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";}var doc=this.contentDocument;if(dynamicIFrame){var 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.isMSIE)window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\""+this.editorId+"\"]);",1);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);}},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=new Array(),i,s;this.switchSettings();s=tinyMCE.settings;if(tinyMCE.isMSIE&&!tinyMCE.isOpera){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);var 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']!="")var content=eval(tinyMCE.settings['save_callback']+"(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_Engine.prototype.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.isMSIE)s=s.replace(new RegExp('<p><hr \\/><\\/p>','gi'),"<hr>");if(tinyMCE.getParam('convert_urls'))s=s.replace(new RegExp('(href=\"{0,1})(\\s*#)','gi'),'$1'+tinyMCE.settings['document_base_url']+"#");return s;};TinyMCE_Engine.prototype.parseStyle=function(str){var ar=new Array();if(str==null)return ar;var st=str.split(';');tinyMCE.clearArray(ar);for(var i=0;i<st.length;i++){if(st[i]=='')continue;var re=new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');var pa=st[i].replace(re,'$1||$2').split('||');if(pa.length==2)ar[pa[0].toLowerCase()]=pa[1];}return ar;};TinyMCE_Engine.prototype.compressStyle=function(ar,pr,sf,res){var box=new Array();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(var i=0;i<box.length;i++){if(box[i]==null)return;for(var 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;};TinyMCE_Engine.prototype.serializeStyle=function(ar){var str="";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(var key in ar){var 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')){var 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);if(val!="url('')")str+=key.toLowerCase()+": "+val+"; ";}}if(new RegExp('; $').test(str))str=str.substring(0,str.length-2);return str;};TinyMCE_Engine.prototype.convertRGBToHex=function(s,k){if(s.toLowerCase().indexOf('rgb')!=-1){var re=new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)","gi");var 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;};TinyMCE_Engine.prototype.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;};TinyMCE_Engine.prototype.convertSpansToFonts=function(doc){var sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');var h=doc.body.innerHTML;h=h.replace(/<span/gi,'<font');h=h.replace(/<\/span/gi,'</font');doc.body.innerHTML=h;var s=doc.getElementsByTagName("font");for(var i=0;i<s.length;i++){var size=tinyMCE.trim(s[i].style.fontSize).toLowerCase();var fSize=0;for(var 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='';}var fFace=s[i].style.fontFamily;if(fFace!=null&&fFace!=""){tinyMCE.setAttrib(s[i],'face',fFace);s[i].style.fontFamily='';}var fColor=s[i].style.color;if(fColor!=null&&fColor!=""){tinyMCE.setAttrib(s[i],'color',tinyMCE.convertRGBToHex(fColor));s[i].style.color='';}}};TinyMCE_Engine.prototype.convertFontsToSpans=function(doc){var sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');var h=doc.body.innerHTML;h=h.replace(/<font/gi,'<span');h=h.replace(/<\/font/gi,'</span');doc.body.innerHTML=h;var fsClasses=tinyMCE.getParam('font_size_classes');if(fsClasses!='')fsClasses=fsClasses.replace(/\s+/,'').split(',');else fsClasses=null;var s=doc.getElementsByTagName("span");for(var i=0;i<s.length;i++){var fSize,fFace,fColor;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');}}};TinyMCE_Engine.prototype.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]);}}};TinyMCE_Engine.prototype.getContent=function(editor_id){var h;if(typeof(editor_id)!="undefined")tinyMCE.selectedInstance=tinyMCE.getInstanceById(editor_id);if(tinyMCE.selectedInstance){h=tinyMCE._cleanupHTML(this.selectedInstance,this.selectedInstance.getDoc(),tinyMCE.settings,this.selectedInstance.getBody(),false,true);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(this.selectedInstance.getDoc());return h;}return null;};TinyMCE_Engine.prototype._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);}}}};TinyMCE_Engine.prototype._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,div,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);}}};TinyMCE_Engine.prototype._cleanupHTML=function(inst,doc,config,elm,visual,on_save,on_submit){var h,d,t1,t2,t3,t4,t5,c,s;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();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++;c.serializedNodes=new Array();c.sourceIndex=-1;if(s.cleanup_serializer=="xml")h=c.serializeNodeAsXML(elm);else h=c.serializeNodeAsHTML(elm);if(d)t3=new Date().getTime();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>&nbsp;</td>');h=h.replace(/<p>\s*<br \/>\s*<\/p>/g,'<p>&nbsp;</p>');h=h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g,'<p>&nbsp;</p>');h=h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g,'<p>&nbsp;</p>');h=h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g,'<p>&nbsp;</p>');h=h.replace(new RegExp('<a>(.*?)<\\/a>','g'),'$1');h=h.replace(/<p([^>]*)>\s*<\/p>/g,'<p$1>&nbsp;</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(/<o:p _moz-userdefined="" \/>/g,'');h=h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g,'<td$1>&nbsp;</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.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.rules=tinyMCE.clearArray(new Array());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(new Array());this.vElementsRe='';this.closeElementsRe=/^(IMG|BR|HR|LINK|META|BASE|INPUT|BUTTON|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','<(\\/?)(',')([^>]*)>');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;},addRuleStr:function(s){var r=this.parseRuleStr(s);var n;for(n in r){if(r[n])this.rules[n]=r[n];}this.vElements=tinyMCE.clearArray(new Array());for(n in this.rules){if(this.rules[n])this.vElements[this.vElements.length]=this.rules[n].tag;}this.vElementsRe=this._arrayToRe(this.vElements,'');},parseRuleStr:function(s){var ta,p,r,a,i,x,px,t,tn,y,av,or=tinyMCE.clearArray(new Array()),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];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(new Array());r.forceAttribs[t.toLowerCase()]=av[0].substring(1);}else if(av[0].charAt(0)=='='){if(!r.defaultAttribs)r.defaultAttribs=tinyMCE.clearArray(new Array());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(new Array());r.validAttribValues[t.toLowerCase()]=this._arrayToRe(this.split('?',av[0].substring(1)),'');}}r.vAttribsRe+=''+t.toLowerCase()+(i!=a.length-1?'|':'');a[i]=t.toLowerCase();}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(new Array());r.vAttribsReIsWild=false;}or[r.tag]=r;}}return or;},serializeNodeAsXML:function(n){var s,b;if(!this.xmlDoc){if(this.isMSIE){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.isMSIE)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(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){var en,no,h='',i,l,r,cn,va=false,f=false,at,hc;this._setupRules();if(this._isDuplicate(n))return'';switch(n.nodeType){case 1:hc=n.hasChildNodes();if((tinyMCE.isMSIE&&!tinyMCE.isOpera)&&n.nodeName.indexOf('/')!=-1)break;if(this.vElementsRe.test(n.nodeName)&&(!this.iveRe||!this.iveRe.test(n.nodeName))){va=true;r=this.rules[n.nodeName];if(!r){at=this.rules;for(no in at){if(at[no]&&at[no].validRe.test(n.nodeName)){r=at[no];break;}}}en=r.isWild?n.nodeName.toLowerCase():r.oTagName;f=r.fill;if(r.removeEmpty&&!hc)return"";h+='<'+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))h+=this._serializeAttribute(n,r,no.nodeName);}}else{for(i=r.vAttribs.length-1;i>-1;i--)h+=this._serializeAttribute(n,r,r.vAttribs[i]);}if(!this.settings.on_save){at=this.mceAttribs;for(no in at){if(at[no])h+=this._serializeAttribute(n,r,at[no]);}}if(this.closeElementsRe.test(n.nodeName))return h+' />';h+='>';if(this.isMSIE&&this.codeElementsRe.test(n.nodeName))h+=n.innerHTML;}break;case 3:if(n.parentNode&&this.codeElementsRe.test(n.parentNode.nodeName))return this.isMSIE?'':n.nodeValue;return this.xmlEncode(n.nodeValue);case 8: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(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&&this.settings.url_converter.length!=0&&/^(src|href|longdesc)$/.test(an))av=eval(this.settings.url_converter+'(this, n, av)');if(av.length!=0&&r.validAttribValues&&r.validAttribValues[an]&&!r.validAttribValues[an].test(av))return"";if(av.length!=0&&av=="{$uid}")av="uid_"+(this.idCount++);if(av.length!=0)return" "+an+"="+'"'+this.xmlEncode(av)+'"';return"";},formatHTML:function(h){var s=this.settings,p='',i=0,li=0,o='',l;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 i,l,e,o='',c;this._setupEntities();switch(this.settings.entity_encoding){case"raw":return tinyMCE.xmlEncode(s);case"named":for(i=0,l=s.length;i<l;i++){c=s.charCodeAt(i);e=this.entities[c];if(e&&e!='')o+='&'+e+';';else o+=String.fromCharCode(c);}return o;case"numeric":for(i=0,l=s.length;i<l;i++){c=s.charCodeAt(i);if(c>127||c==60||c==62||c==38||c==39||c==34)o+='&#'+c+";";else o+=String.fromCharCode(c);}return o;}return s;},split:function(re,s){var c=s.split(re);var i,l,o=new Array();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){if(typeof(d)=="undefined")d="";if(!e||e.nodeType!=1)return d;var v=e.getAttribute(n,0);if(n=="class"&&!v)v=e.className;if(this.isMSIE&&n=="http-equiv")v=e.httpEquiv;if(this.isMSIE&&e.nodeName=="FORM"&&n=="enctype"&&v=="application/x-www-form-urlencoded")v="";if(this.isMSIE&&e.nodeName=="INPUT"&&n=="size"&&v=="20")v="";if(this.isMSIE&&e.nodeName=="INPUT"&&n=="maxlength"&&v=="2147483647")v="";if(n=="style"&&!tinyMCE.isOpera)v=e.style.cssText;if(n=='style')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'))return eval(tinyMCE.settings.urlconverter_callback+"(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(!this.entitiesDone){if(s.entity_encoding=="named"){n=tinyMCE.clearArray(new Array());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;if(!this.rulesDone){this.addRuleStr(s.valid_elements);this.addRuleStr(s.extended_valid_elements);this.rulesDone=true;}},_isDuplicate:function(n){var i;if(!this.settings.fix_content_duplication)return false;if(tinyMCE.isMSIE&&!tinyMCE.isOpera&&n.nodeType==1){if(n.mce_serialized==this.serializationId)return true;n.setAttribute('mce_serialized',this.serializationId);}else{for(i=0;i<this.serializedNodes.length;i++){if(this.serializedNodes[i]==n)return true;}this.serializedNodes[this.serializedNodes.length]=n;}return false;}};TinyMCE_Engine.prototype.getElementByAttributeValue=function(n,e,a,v){return(n=this.getElementsByAttributeValue(n,e,a,v)).length==0?null:n[0];};TinyMCE_Engine.prototype.getElementsByAttributeValue=function(n,e,a,v){var i,nl=n.getElementsByTagName(e),o=new Array();for(i=0;i<nl.length;i++){if(tinyMCE.getAttrib(nl[i],a).indexOf(v)!=-1)o[o.length]=nl[i];}return o;};TinyMCE_Engine.prototype.isBlockElement=function(n){return n!=null&&n.nodeType==1&&this.blockRegExp.test(n.nodeName);};TinyMCE_Engine.prototype.getParentBlockElement=function(n){while(n){if(this.isBlockElement(n))return n;n=n.parentNode;}return null;};TinyMCE_Engine.prototype.insertAfter=function(n,r){if(r.nextSibling)r.parentNode.insertBefore(n,r.nextSibling);else r.parentNode.appendChild(n);};TinyMCE_Engine.prototype.setInnerHTML=function(e,h){var i,nl,n;if(tinyMCE.isMSIE&&!tinyMCE.isOpera){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);}};TinyMCE_Engine.prototype.getOuterHTML=function(e){if(tinyMCE.isMSIE)return e.outerHTML;var d=e.ownerDocument.createElement("body");d.appendChild(e);return d.innerHTML;};TinyMCE_Engine.prototype.setOuterHTML=function(e,h){if(tinyMCE.isMSIE){e.outerHTML=h;return;}var d=e.ownerDocument.createElement("body");d.innerHTML=h;e.parentNode.replaceChild(d.firstChild,e);};TinyMCE_Engine.prototype._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;};TinyMCE_Engine.prototype.getNodeTree=function(n,na,t,nn){var i;if(typeof(t)=="undefined"||n.nodeType==t&&(typeof(nn)=="undefined"||n.nodeName==nn))na[na.length]=n;if(n.hasChildNodes()){for(i=0;i<n.childNodes.length;i++)tinyMCE.getNodeTree(n.childNodes[i],na,t,nn);}return na;};TinyMCE_Engine.prototype.getParentElement=function(node,names,attrib_name,attrib_value){if(typeof(names)=="undefined"){if(node.nodeType==1)return node;while((node=node.parentNode)!=null&&node.nodeType!=1);return node;}if(node==null)return null;var namesAr=names.toUpperCase().split(',');do{for(var i=0;i<namesAr.length;i++){if(node.nodeName==namesAr[i]||names=="*"){if(typeof(attrib_name)=="undefined")return node;else if(node.getAttribute(attrib_name)){if(typeof(attrib_value)=="undefined"){if(node.getAttribute(attrib_name)!="")return node;}else if(node.getAttribute(attrib_name)==attrib_value)return node;}}}}while((node=node.parentNode)!=null);return null;};TinyMCE_Engine.prototype.getParentNode=function(n,f){while(n){if(f(n))return n;n=n.parentNode;}return null;};TinyMCE_Engine.prototype.getAttrib=function(elm,name,default_value){if(typeof(default_value)=="undefined")default_value="";if(!elm||elm.nodeType!=1)return default_value;var v=elm.getAttribute(name);if(name=="class"&&!v)v=elm.className;if(tinyMCE.isGecko&&name=="src"&&elm.src!=null&&elm.src!="")v=elm.src;if(tinyMCE.isGecko&&name=="href"&&elm.href!=null&&elm.href!="")v=elm.href;if(name=="http-equiv"&&tinyMCE.isMSIE)v=elm.httpEquiv;if(name=="style"&&!tinyMCE.isOpera)v=elm.style.cssText;return(v&&v!="")?v:default_value;};TinyMCE_Engine.prototype.setAttrib=function(element,name,value,fix_value){if(typeof(value)=="number"&&value!=null)value=""+value;if(fix_value){if(value==null)value="";var re=new RegExp('[^0-9%]','g');value=value.replace(re,'');}if(name=="style")element.style.cssText=value;if(name=="class")element.className=value;if(value!=null&&value!=""&&value!=-1)element.setAttribute(name,value);else element.removeAttribute(name);};TinyMCE_Engine.prototype.setStyleAttrib=function(elm,name,value){eval('elm.style.'+name+'=value;');if(tinyMCE.isMSIE&&value==null||value==''){var str=tinyMCE.serializeStyle(tinyMCE.parseStyle(elm.style.cssText));elm.style.cssText=str;elm.setAttribute("style",str);}};TinyMCE_Engine.prototype.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;}};TinyMCE_Engine.prototype.getAbsPosition=function(n){var p={absLeft:0,absTop:0};while(n){p.absLeft+=n.offsetLeft;p.absTop+=n.offsetTop;n=n.offsetParent;}return p;};TinyMCE_Engine.prototype.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;};TinyMCE_Engine.prototype.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;};TinyMCE_Engine.prototype.selectNodes=function(n,f,a){var i;if(!a)a=new Array();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;};TinyMCE_Engine.prototype.addCSSClass=function(e,c,b){var o=this.removeCSSClass(e,c);return e.className=b?c+(o!=''?(' '+o):''):(o!=''?(o+' '):'')+c;};TinyMCE_Engine.prototype.removeCSSClass=function(e,c){var a=this.explode(' ',e.className),i;for(i=0;i<a.length;i++){if(a[i]==c)a[i]='';}return e.className=a.join(' ');};TinyMCE_Engine.prototype.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);}};TinyMCE_Engine.prototype.parseURL=function(url_str){var urlParts=new Array();if(url_str){var pos,lastPos;pos=url_str.indexOf('://');if(pos!=-1){urlParts['protocol']=url_str.substring(0,pos);lastPos=pos+3;}for(var i=lastPos;i<url_str.length;i++){var 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;};TinyMCE_Engine.prototype.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;};TinyMCE_Engine.prototype.convertAbsoluteURLToRelativeURL=function(base_url,url_to_relative){var baseURL=this.parseURL(base_url);var targetURL=this.parseURL(url_to_relative);var strTok1;var strTok2;var breakPoint=0;var outPath="";var forceSlash=false;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(var i=0;i<strTok1.length;i++){if(i>=strTok2.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break;}}}if(strTok1.length<strTok2.length){for(var 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(var i=0;i<(strTok1.length-(breakPoint-1));i++)outPath+="../";for(var 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;var fileName=baseURL.path;var pos;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);};TinyMCE_Engine.prototype.convertRelativeToAbsoluteURL=function(base_url,relative_url){var baseURL=this.parseURL(base_url);var relURL=this.parseURL(relative_url);if(relative_url==""||relative_url.charAt(0)=='/'||relative_url.indexOf('://')!=-1||relative_url.indexOf('mailto:')!=-1||relative_url.indexOf('javascript:')!=-1)return relative_url;baseURLParts=baseURL['path'].split('/');relURLParts=relURL['path'].split('/');var newBaseURLParts=new Array();for(var i=baseURLParts.length-1;i>=0;i--){if(baseURLParts[i].length==0)continue;newBaseURLParts[newBaseURLParts.length]=baseURLParts[i];}baseURLParts=newBaseURLParts.reverse();var newRelURLParts=new Array();var numBack=0;for(var i=relURLParts.length-1;i>=0;i--){if(relURLParts[i].length==0||relURLParts[i]==".")continue;if(relURLParts[i]=='..'){numBack++;continue;}if(numBack>0){numBack--;continue;}newRelURLParts[newRelURLParts.length]=relURLParts[i];}relURLParts=newRelURLParts.reverse();var len=baseURLParts.length-numBack;var absPath=(len<=0?"":"/")+baseURLParts.slice(0,len).join('/')+"/"+relURLParts.join('/');var start="",end="";relURL.protocol=baseURL.protocol;relURL.host=baseURL.host;relURL.port=baseURL.port;if(relURL.path.charAt(relURL.path.length-1)=="/")absPath+="/";relURL.path=absPath;return this.serializeURL(relURL);};TinyMCE_Engine.prototype.convertURL=function(url,node,on_save){var prot=document.location.protocol;var host=document.location.hostname;var port=document.location.port;if(prot=="file:")return url;url=tinyMCE.regexpReplace(url,'(http|https):///','/');if(url.indexOf('mailto:')!=-1||url.indexOf('javascript:')!=-1||tinyMCE.regexpReplace(url,'[ \t\r\n\+]|%20','').charAt(0)=="#")return url;if(!tinyMCE.isMSIE&&!on_save&&url.indexOf("://")==-1&&url.charAt(0)!='/')return tinyMCE.settings['base_href']+url;if(on_save&&tinyMCE.getParam('relative_urls')){var curl=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],url);if(curl.charAt(0)=='/')curl=tinyMCE.settings['document_base_prefix']+curl;var urlParts=tinyMCE.parseURL(curl);var tmpUrlParts=tinyMCE.parseURL(tinyMCE.settings['document_base_url']);if(urlParts['host']==tmpUrlParts['host']&&(urlParts['port']==tmpUrlParts['port']))return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings['document_base_url'],curl);}if(!tinyMCE.getParam('relative_urls')){var urlParts=tinyMCE.parseURL(url);var baseUrlParts=tinyMCE.parseURL(tinyMCE.settings['base_href']);url=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],url);if(urlParts['anchor']&&urlParts['path']==baseUrlParts['path'])return"#"+urlParts['anchor'];}if(tinyMCE.getParam('remove_script_host')){var start="",portPart="";if(port!="")portPart=":"+port;start=prot+"//"+host+portPart+"/";if(url.indexOf(start)==0)url=url.substring(start.length-1);}return url;};TinyMCE_Engine.prototype.convertAllRelativeURLs=function(body){var elms=body.getElementsByTagName("img");for(var i=0;i<elms.length;i++){var src=tinyMCE.getAttrib(elms[i],'src');var 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);}}var elms=body.getElementsByTagName("a");for(var i=0;i<elms.length;i++){var href=tinyMCE.getAttrib(elms[i],'href');var 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_Engine.prototype.clearArray=function(a){for(var k in a)a[k]=null;return a;};TinyMCE_Engine.prototype._setEventsEnabled=function(node,state){var events=new Array('onfocus','onblur','onclick','ondblclick','onmousedown','onmouseup','onmouseover','onmousemove','onmouseout','onkeypress','onkeydown','onkeydown','onkeyup');var evs=tinyMCE.settings['event_elements'].split(',');for(var y=0;y<evs.length;y++){var elms=node.getElementsByTagName(evs[y]);for(var i=0;i<elms.length;i++){var event="";for(var 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);}}}}};TinyMCE_Engine.prototype._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;tinyMCE.selectedInstance=inst;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){}};TinyMCE_Engine.prototype.unloadHandler=function(){tinyMCE.triggerSave(true,true);};TinyMCE_Engine.prototype.addEventHandlers=function(inst){var doc=inst.getDoc();inst.switchSettings();if(tinyMCE.isMSIE){tinyMCE.addEvent(doc,"keypress",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(doc,"keyup",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(doc,"keydown",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(doc,"mouseup",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(doc,"mousedown",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(doc,"click",TinyMCE_Engine.prototype._eventPatch);}else{tinyMCE.addEvent(doc,"keypress",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"keydown",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"keyup",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"click",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"mouseup",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"mousedown",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"focus",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"blur",tinyMCE.handleEvent);eval('try { doc.designMode = "On"; } catch(e) {}');}};TinyMCE_Engine.prototype.onMouseMove=function(){var inst;if(!tinyMCE.hasMouseMoved){inst=tinyMCE.selectedInstance;if(inst.isFocused){inst.undoBookmark=inst.selection.getBookmark();tinyMCE.hasMouseMoved=true;}}};TinyMCE_Engine.prototype.cancelEvent=function(e){if(tinyMCE.isMSIE){e.returnValue=false;e.cancelBubble=true;}else e.preventDefault();};TinyMCE_Engine.prototype.addEvent=function(o,n,h){if(o.attachEvent)o.attachEvent("on"+n,h);else o.addEventListener(n,h,false);};TinyMCE_Engine.prototype.addSelectAccessibility=function(e,s,w){if(!s._isAccessible){s.onkeydown=tinyMCE.accessibleEventHandler;s.onblur=tinyMCE.accessibleEventHandler;s._isAccessible=true;s._win=w;}return false;};TinyMCE_Engine.prototype.accessibleEventHandler=function(e){var win=this._win;e=tinyMCE.isMSIE?win.event:e;var elm=tinyMCE.isMSIE?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;};TinyMCE_Engine.prototype._resetIframeHeight=function(){var ife;if(tinyMCE.isMSIE&&!tinyMCE.isOpera){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;var e,r=this.getRng(),h;if(tinyMCE.isSafari){return r.toString();}e=document.createElement("body");if(tinyMCE.isGecko)e.appendChild(r.cloneContents());else e.innerHTML=r.item?r.item(0).outerHTML:r.htmlText;h=tinyMCE._cleanupHTML(inst,inst.contentDocument,inst.settings,e,e,false,true,false);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(inst.getDoc());return h;},getSelectedText:function(){var inst=this.instance;var d,r,s,t;if(tinyMCE.isMSIE){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 rng=this.getRng();var doc=this.instance.getDoc();var sp,le,s,e,nl,i,si,ei;var trng,sx,sy,xx=-999999999;if(tinyMCE.isOpera)return null;sx=doc.body.scrollLeft+doc.documentElement.scrollLeft;sy=doc.body.scrollTop+doc.documentElement.scrollTop;if(tinyMCE.isSafari||tinyMCE.isGecko)return{rng:rng,scrollX:sx,scrollY:sy};if(tinyMCE.isMSIE){if(simple)return{rng:rng};if(rng.item){e=rng.item(0);nl=doc.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=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,length:le,scrollX:sx,scrollY:sy};}}if(tinyMCE.isGecko){s=tinyMCE.getParentElement(rng.startContainer);for(si=0;si<s.childNodes.length&&s.childNodes[si]!=rng.startContainer;si++);nl=doc.getElementsByTagName(s.nodeName);for(i=0;i<nl.length;i++){if(s==nl[i]){sp=i;break;}}e=tinyMCE.getParentElement(rng.endContainer);for(ei=0;ei<e.childNodes.length&&e.childNodes[ei]!=rng.endContainer;ei++);nl=doc.getElementsByTagName(e.nodeName);for(i=0;i<nl.length;i++){if(e==nl[i]){le=i;break;}}return{startTag:s.nodeName,start:sp,startIndex:si,endTag:e.nodeName,end:le,endIndex:ei,startOffset:rng.startOffset,endOffset:rng.endOffset,scrollX:sx,scrollY:sy};}return null;},moveToBookmark:function(bookmark){var rng,nl,i;var inst=this.instance;var doc=inst.getDoc();var win=inst.getWin();var sel=this.getSel();if(!bookmark)return false;if(tinyMCE.isSafari){sel.setBaseAndExtent(bookmark.startContainer,bookmark.startOffset,bookmark.endContainer,bookmark.endOffset);return true;}if(tinyMCE.isMSIE){if(bookmark.rng){bookmark.rng.select();return true;}win.focus();if(bookmark.tag){rng=inst.getBody().createControlRange();nl=doc.getElementsByTagName(bookmark.tag);if(nl.length>bookmark.index){try{rng.addElement(nl[bookmark.index]);}catch(ex){}}}else{rng=inst.getSel().createRange();rng.moveToElementText(inst.getBody());rng.collapse(true);rng.moveStart('character',bookmark.start);rng.moveEnd('character',bookmark.length);}rng.select();win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true;}if(tinyMCE.isGecko&&bookmark.rng){sel.removeAllRanges();sel.addRange(bookmark.rng);win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true;}if(tinyMCE.isGecko){rng=doc.createRange();nl=doc.getElementsByTagName(bookmark.startTag);if(nl.length>bookmark.start)rng.setStart(nl[bookmark.start].childNodes[bookmark.startIndex],bookmark.startOffset);nl=doc.getElementsByTagName(bookmark.endTag);if(nl.length>bookmark.end)rng.setEnd(nl[bookmark.end].childNodes[bookmark.endIndex],bookmark.endOffset);sel.removeAllRanges();sel.addRange(rng);win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true;}return false;},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(tinyMCE.isMSIE){rng=inst.getBody().createTextRange();try{rng.moveToElementText(node);if(collapse)rng.collapse(to_start);rng.select();}catch(e){}}else{sel=this.getSel();if(!sel)return;if(tinyMCE.isSafari){sel.setBaseAndExtent(node,0,node,node.innerText.length);if(collapse){if(to_start)sel.collapseToStart();else sel.collapseToEnd();}this.scrollToNode(node);return;}rng=inst.getDoc().createRange();if(select_text_node){nodes=tinyMCE.getNodeTree(node,new Array(),3);if(nodes.length>0)rng.selectNodeContents(nodes[0]);else rng.selectNodeContents(node);}else rng.selectNode(node);if(collapse){if(!to_start&&node.nodeType==3){rng.setStart(node,node.nodeValue.length);rng.setEnd(node,node.nodeValue.length);}else rng.collapse(to_start);}sel.removeAllRanges();sel.addRange(rng);}this.scrollToNode(node);tinyMCE.selectedElement=null;if(node.nodeType==1)tinyMCE.selectedElement=node;},scrollToNode:function(node){var inst=this.instance;var pos,doc,scrollX,scrollY,height;pos=tinyMCE.getAbsPosition(node);doc=inst.getDoc();scrollX=doc.body.scrollLeft+doc.documentElement.scrollLeft;scrollY=doc.body.scrollTop+doc.documentElement.scrollTop;height=tinyMCE.isMSIE?document.getElementById(inst.editorId).style.pixelHeight:inst.targetElement.clientHeight;if(!tinyMCE.settings['auto_resize']&&!(pos.absTop>scrollY&&pos.absTop<(scrollY-25+height)))inst.contentWindow.scrollTo(pos.absLeft,pos.absTop-height+25);},getSel:function(){var inst=this.instance;if(tinyMCE.isMSIE&&!tinyMCE.isOpera)return inst.getDoc().selection;return inst.contentWindow.getSelection();},getRng:function(){var inst=this.instance;var sel=this.getSel();if(sel==null)return null;if(tinyMCE.isMSIE&&!tinyMCE.isOpera)return sel.createRange();if(tinyMCE.isSafari&&!sel.getRangeAt)return''+window.getSelection();return sel.getRangeAt(0);},getFocusElement:function(){var inst=this.instance;if(tinyMCE.isMSIE&&!tinyMCE.isOpera){var doc=inst.getDoc();var rng=doc.selection.createRange();var elm=rng.item?rng.item(0):rng.parentElement();}else{if(inst.isHidden())return inst.getBody();var sel=this.getSel();var rng=this.getRng();if(!sel||!rng)return null;var elm=rng.commonAncestorContainer;if(!rng.collapsed){if(rng.startContainer==rng.endContainer){if(rng.startOffset-rng.endOffset<2){if(rng.startContainer.hasChildNodes())elm=rng.startContainer.childNodes[rng.startOffset];}}}elm=tinyMCE.getParentElement(elm);}return elm;}};function TinyMCE_UndoRedo(inst){this.instance=inst;this.undoLevels=new Array();this.undoIndex=0;this.typingUndoIndex=-1;this.undoRedo=true;};TinyMCE_UndoRedo.prototype={add:function(l){var b;if(l){this.undoLevels[this.undoLevels.length]=l;return true;}var inst=this.instance;if(this.typingUndoIndex!=-1){this.undoIndex=this.typingUndoIndex;}var newHTML=tinyMCE.trim(inst.getBody().innerHTML);if(this.undoLevels[this.undoIndex]&&newHTML!=this.undoLevels[this.undoIndex].content){tinyMCE.dispatchCallback(inst,'onchange_callback','onChange',inst);var customUndoLevels=tinyMCE.settings['custom_undo_redo_levels'];if(customUndoLevels!=-1&&this.undoLevels.length>customUndoLevels){for(var 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};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){function isEmpty(para){function isEmptyHTML(html){return html.replace(new RegExp('[ \t\r\n]+','g'),'').toLowerCase()=="";}if(para.getElementsByTagName("img").length>0)return false;if(para.getElementsByTagName("table").length>0)return false;if(para.getElementsByTagName("hr").length>0)return false;var nodes=tinyMCE.getNodeTree(para,new Array(),3);for(var i=0;i<nodes.length;i++){if(!isEmptyHTML(nodes[i].nodeValue))return false;}return true;}var doc=inst.getDoc();var sel=inst.getSel();var win=inst.contentWindow;var rng=sel.getRangeAt(0);var body=doc.body;var rootElm=doc.documentElement;var blockName="P";var rngBefore=doc.createRange();rngBefore.setStart(sel.anchorNode,sel.anchorOffset);rngBefore.collapse(true);var rngAfter=doc.createRange();rngAfter.setStart(sel.focusNode,sel.focusOffset);rngAfter.collapse(true);var direct=rngBefore.compareBoundaryPoints(rngBefore.START_TO_END,rngAfter)<0;var startNode=direct?sel.anchorNode:sel.focusNode;var startOffset=direct?sel.anchorOffset:sel.focusOffset;var endNode=direct?sel.focusNode:sel.anchorNode;var endOffset=direct?sel.focusOffset:sel.anchorOffset;startNode=startNode.nodeName=="BODY"?startNode.firstChild:startNode;endNode=endNode.nodeName=="BODY"?endNode.firstChild:endNode;var startBlock=tinyMCE.getParentBlockElement(startNode);var endBlock=tinyMCE.getParentBlockElement(endNode);if(startBlock&&new RegExp('absolute|relative|static','gi').test(startBlock.style.position))startBlock=null;if(endBlock&&new RegExp('absolute|relative|static','gi').test(endBlock.style.position))endBlock=null;if(startBlock!=null){blockName=startBlock.nodeName;if(blockName=="TD"||blockName=="TABLE"||(blockName=="DIV"&&new RegExp('left|right','gi').test(startBlock.style.cssFloat)))blockName="P";}if(tinyMCE.getParentElement(startBlock,"OL,UL")!=null)return false;if((startBlock!=null&&startBlock.nodeName=="TABLE")||(endBlock!=null&&endBlock.nodeName=="TABLE"))startBlock=endBlock=null;var paraBefore=(startBlock!=null&&startBlock.nodeName==blockName)?startBlock.cloneNode(false):doc.createElement(blockName);var paraAfter=(endBlock!=null&&endBlock.nodeName==blockName)?endBlock.cloneNode(false):doc.createElement(blockName);if(/^(H[1-6])$/.test(blockName))paraAfter=doc.createElement("p");var startChop=startNode;var 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();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);var 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();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.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);var 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;";var 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();rng.insertNode(paraAfter);rng.insertNode(paraBefore);paraAfter.normalize();paraBefore.normalize();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"){nv=sn.nodeValue;if(nv!=null&&nv.length>=r.startOffset&&nv.charAt(r.startOffset-1)==' ')s=true;if(nv!=null&&r.startOffset==nv.length)sn.nextSibling.parentNode.removeChild(sn.nextSibling);}return s;}};function TinyMCE_Layer(id,bm){this.id=id;this.blockerElement=null;this.events=false;this.element=null;this.blockMode=typeof(bm)!='undefined'?bm:true;this.doc=document;};TinyMCE_Layer.prototype={moveRelativeTo:function(re,p){var rep=this.getAbsPosition(re);var w=parseInt(re.offsetWidth);var h=parseInt(re.offsetHeight);var e=this.getElement();var ew=parseInt(e.offsetWidth);var eh=parseInt(e.offsetHeight);var x,y;switch(p){case"tl":x=rep.absLeft;y=rep.absTop;break;case"tr":x=rep.absLeft+w;y=rep.absTop;break;case"bl":x=rep.absLeft;y=rep.absTop+h;break;case"br":x=rep.absLeft+w;y=rep.absTop+h;break;case"cc":x=rep.absLeft+(w/2)-(ew/2);y=rep.absTop+(h/2)-(eh/2);break;}this.moveTo(x,y);},moveBy:function(x,y){var e=this.getElement();this.moveTo(parseInt(e.style.left)+x,parseInt(e.style.top)+y);},moveTo:function(x,y){var e=this.getElement();e.style.left=x+"px";e.style.top=y+"px";this.updateBlocker();},resizeBy:function(w,h){var e=this.getElement();this.resizeTo(parseInt(e.style.width)+w,parseInt(e.style.height)+h);},resizeTo:function(w,h){var e=this.getElement();if(w!=null)e.style.width=w+"px";if(h!=null)e.style.height=h+"px";this.updateBlocker();},show:function(){this.getElement().style.display='block';this.updateBlocker();},hide:function(){this.getElement().style.display='none';this.updateBlocker();},isVisible:function(){return this.getElement().style.display=='block';},getElement:function(){if(!this.element)this.element=this.doc.getElementById(this.id);return this.element;},setBlockMode:function(s){this.blockMode=s;},updateBlocker:function(){var e,b,x,y,w,h;b=this.getBlocker();if(b){if(this.blockMode){e=this.getElement();x=this.parseInt(e.style.left);y=this.parseInt(e.style.top);w=this.parseInt(e.offsetWidth);h=this.parseInt(e.offsetHeight);b.style.left=x+'px';b.style.top=y+'px';b.style.width=w+'px';b.style.height=h+'px';b.style.display=e.style.display;}else b.style.display='none';}},getBlocker:function(){var d,b;if(!this.blockerElement&&this.blockMode){d=this.doc;b=d.createElement("iframe");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){var d=this.doc,e=d.createElement(n);e.setAttribute('id',this.id);if(c)e.className=c;if(!p)p=d.body;p.appendChild(e);return this.element=e;},parseInt:function(s){if(s==null||s=='')return 0;return parseInt(s);}};function TinyMCE_Menu(){var id;if(typeof(tinyMCE.menuCounter)=="undefined")tinyMCE.menuCounter=0;id="mc_menu_"+tinyMCE.menuCounter++;TinyMCE_Layer.call(this,id,true);this.id=id;this.items=new Array();this.needsUpdate=true;};TinyMCE_Menu.prototype=tinyMCE.extend(TinyMCE_Layer.prototype,{init:function(s){var n;this.settings={separator_class:'mceMenuSeparator',title_class:'mceMenuTitle',disabled_class:'mceMenuDisabled',menu_class:'mceMenu',drop_menu:true};for(n in s)this.settings[n]=s[n];this.create('div',this.settings.menu_class);},clear:function(){this.items=new Array();},addTitle:function(t){this.add({type:'title',text:t});},addDisabled:function(t){this.add({type:'disabled',text:t});},addSeparator:function(){this.add({type:'separator'});},addItem:function(t,js){this.add({text:t,js:js});},add:function(mi){this.items[this.items.length]=mi;this.needsUpdate=true;},update:function(){var e=this.getElement(),h='',i,t,m=this.items,s=this.settings;if(this.settings.drop_menu)h+='<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="javascript:void(0);" onmousedown="'+tinyMCE.xmlEncode(m[i].js)+';return false;"><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_Engine.prototype.debug=function(){var m="",e,a,i;e=document.getElementById("tinymce_debug");if(!e){var d=document.createElement("div");d.setAttribute("className","debugger");d.className="debugger";d.innerHTML='Debug output:<textarea id="tinymce_debug" style="width: 100%; height: 300px" wrap="nowrap" mce_editable="false"></textarea>';document.body.appendChild(d);e=document.getElementById("tinymce_debug");}a=this.debug.arguments;for(i=0;i<a.length;i++){m+=a[i];if(i<a.length-1)m+=', ';}e.value+=m+"\n";}; \ No newline at end of file
diff --git a/program/js/tiny_mce/tiny_mce_popup.js b/program/js/tiny_mce/tiny_mce_popup.js
new file mode 100644
index 000000000..ff9ef49ef
--- /dev/null
+++ b/program/js/tiny_mce/tiny_mce_popup.js
@@ -0,0 +1,272 @@
+
+
+// Some global instances, this will be filled later
+var tinyMCE = null, tinyMCELang = null;
+
+
+function TinyMCE_Popup() {
+};
+
+
+TinyMCE_Popup.prototype.init = function() {
+ var win = window.opener ? window.opener : window.dialogArguments;
+ var inst;
+
+ if (!win) {
+ // Try parent
+ win = parent.parent;
+
+ // Try top
+ if (typeof(win.tinyMCE) == "undefined")
+ win = top;
+ }
+
+ window.opener = win;
+ this.windowOpener = win;
+ this.onLoadEval = "";
+
+ // Setup parent references
+ tinyMCE = win.tinyMCE;
+ tinyMCELang = win.tinyMCELang;
+
+ if (!tinyMCE) {
+ alert("tinyMCE object reference not found from popup.");
+ return;
+ }
+
+ inst = tinyMCE.selectedInstance;
+ this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;
+ this.storeSelection = (tinyMCE.isMSIE && !tinyMCE.isOpera) && !this.isWindow && tinyMCE.getWindowArg('mce_store_selection', true);
+
+ if (this.isWindow)
+ window.focus();
+
+ // Store selection
+ if (this.storeSelection)
+ inst.selectionBookmark = inst.selection.getBookmark(true);
+
+ // Setup dir
+ if (tinyMCELang['lang_dir'])
+ document.dir = tinyMCELang['lang_dir'];
+
+ // Setup title
+ var re = new RegExp('{|\\\$|}', 'g');
+ var title = document.title.replace(re, "");
+ if (typeof tinyMCELang[title] != "undefined") {
+ var divElm = document.createElement("div");
+ divElm.innerHTML = tinyMCELang[title];
+ document.title = divElm.innerHTML;
+
+ if (tinyMCE.setWindowTitle != null)
+ tinyMCE.setWindowTitle(window, divElm.innerHTML);
+ }
+
+ // Output Popup CSS class
+ document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');
+
+ tinyMCE.addEvent(window, "load", this.onLoad);
+};
+
+
+TinyMCE_Popup.prototype.onLoad = function() {
+ var dir, i, elms, body = document.body;
+
+ if (tinyMCE.getWindowArg('mce_replacevariables', true))
+ body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);
+
+ dir = tinyMCE.selectedInstance.settings['directionality'];
+ if (dir == "rtl" && document.forms && document.forms.length > 0) {
+ elms = document.forms[0].elements;
+ for (i=0; i<elms.length; i++) {
+ if ((elms[i].type == "text" || elms[i].type == "textarea") && elms[i].getAttribute("dir") != "ltr")
+ elms[i].dir = dir;
+ }
+ }
+
+ if (body.style.display == 'none')
+ body.style.display = 'block';
+
+ // Execute real onload (Opera fix)
+ if (tinyMCEPopup.onLoadEval != "")
+ eval(tinyMCEPopup.onLoadEval);
+};
+
+
+TinyMCE_Popup.prototype.executeOnLoad = function(str) {
+ if (tinyMCE.isOpera)
+ this.onLoadEval = str;
+ else
+ eval(str);
+};
+
+
+TinyMCE_Popup.prototype.resizeToInnerSize = function() {
+ // Netscape 7.1 workaround
+ if (this.isWindow && tinyMCE.isNS71) {
+ window.resizeBy(0, 10);
+ return;
+ }
+
+ if (this.isWindow) {
+ var doc = document;
+ var body = doc.body;
+ var oldMargin, wrapper, iframe, nodes, dx, dy;
+
+ if (body.style.display == 'none')
+ body.style.display = 'block';
+
+ // Remove margin
+ oldMargin = body.style.margin;
+ body.style.margin = '0';
+
+ // Create wrapper
+ wrapper = doc.createElement("div");
+ wrapper.id = 'mcBodyWrapper';
+ wrapper.style.display = 'none';
+ wrapper.style.margin = '0';
+
+ // Wrap body elements
+ nodes = doc.body.childNodes;
+ for (var i=nodes.length-1; i>=0; i--) {
+ if (wrapper.hasChildNodes())
+ wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);
+ else
+ wrapper.appendChild(nodes[i].cloneNode(true));
+
+ nodes[i].parentNode.removeChild(nodes[i]);
+ }
+
+ // Add wrapper
+ doc.body.appendChild(wrapper);
+
+ // Create iframe
+ iframe = document.createElement("iframe");
+ iframe.id = "mcWinIframe";
+ iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings['default_document'];
+ iframe.width = "100%";
+ iframe.height = "100%";
+ iframe.style.margin = '0';
+
+ // Add iframe
+ doc.body.appendChild(iframe);
+
+ // Measure iframe
+ iframe = document.getElementById('mcWinIframe');
+ dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth;
+ dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight;
+
+ // Resize window
+ // tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);
+ window.resizeBy(dx, dy);
+
+ // Hide iframe and show wrapper
+ body.style.margin = oldMargin;
+ iframe.style.display = 'none';
+ wrapper.style.display = 'block';
+ }
+};
+
+
+TinyMCE_Popup.prototype.resizeToContent = function() {
+ var isMSIE = (navigator.appName == "Microsoft Internet Explorer");
+ var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
+
+ if (isOpera)
+ return;
+
+ if (isMSIE) {
+ try { window.resizeTo(10, 10); } catch (e) {}
+
+ var elm = document.body;
+ var width = elm.offsetWidth;
+ var height = elm.offsetHeight;
+ var dx = (elm.scrollWidth - width) + 4;
+ var dy = elm.scrollHeight - height;
+
+ try { window.resizeBy(dx, dy); } catch (e) {}
+ } else {
+ window.scrollBy(1000, 1000);
+ if (window.scrollX > 0 || window.scrollY > 0) {
+ window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);
+ window.sizeToContent();
+ window.scrollTo(0, 0);
+ var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);
+ var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);
+ window.moveTo(x, y);
+ }
+ }
+};
+
+
+TinyMCE_Popup.prototype.getWindowArg = function(name, default_value) {
+ return tinyMCE.getWindowArg(name, default_value);
+};
+
+
+TinyMCE_Popup.prototype.restoreSelection = function() {
+ if (this.storeSelection) {
+ var inst = tinyMCE.selectedInstance;
+
+ inst.getWin().focus();
+
+ if (inst.selectionBookmark)
+ inst.selection.moveToBookmark(inst.selectionBookmark);
+ }
+};
+
+
+TinyMCE_Popup.prototype.execCommand = function(command, user_interface, value) {
+ var inst = tinyMCE.selectedInstance;
+
+ this.restoreSelection();
+ inst.execCommand(command, user_interface, value);
+
+ // Store selection
+ if (this.storeSelection)
+ inst.selectionBookmark = inst.selection.getBookmark(true);
+};
+
+
+TinyMCE_Popup.prototype.close = function() {
+ tinyMCE.closeWindow(window);
+};
+
+
+TinyMCE_Popup.prototype.pickColor = function(e, element_id) {
+ tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {
+ element_id : element_id,
+ document : document,
+ window : window,
+ store_selection : false
+ });
+};
+
+
+TinyMCE_Popup.prototype.openBrowser = function(element_id, type, option) {
+ var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
+ var url = document.getElementById(element_id).value;
+
+ tinyMCE.setWindowArg("window", window);
+ tinyMCE.setWindowArg("document", document);
+
+ // Call to external callback
+ if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")
+ alert("Callback function: " + cb + " could not be found.");
+ else
+ eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");
+};
+
+
+TinyMCE_Popup.prototype.importClass = function(c) {
+ window[c] = function() {};
+
+ for (var n in window.opener[c].prototype)
+ window[c].prototype[n] = window.opener[c].prototype[n];
+
+ window[c].constructor = window.opener[c].constructor;
+};
+
+// Setup global instance
+var tinyMCEPopup = new TinyMCE_Popup();
+
+tinyMCEPopup.init();
diff --git a/program/js/tiny_mce/tiny_mce_src.js b/program/js/tiny_mce/tiny_mce_src.js
new file mode 100644
index 000000000..710a8b67f
--- /dev/null
+++ b/program/js/tiny_mce/tiny_mce_src.js
@@ -0,0 +1,6719 @@
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Engine.class.js */
+
+function TinyMCE_Engine() {
+ this.majorVersion = "2";
+ this.minorVersion = "0.6.1";
+ this.releaseDate = "2006-05-04";
+
+ this.instances = new Array();
+ this.switchClassCache = new Array();
+ this.windowArgs = new Array();
+ this.loadedFiles = new Array();
+ this.pendingFiles = new Array();
+ this.loadingIndex = 0;
+ this.configs = new Array();
+ this.currentConfig = 0;
+ this.eventHandlers = new Array();
+
+ // Browser check
+ var 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.isGecko = ua.indexOf('Gecko') != -1;
+ this.isSafari = ua.indexOf('Safari') != -1;
+ this.isOpera = ua.indexOf('Opera') != -1;
+ this.isMac = ua.indexOf('Mac') != -1;
+ this.isNS7 = ua.indexOf('Netscape/7') != -1;
+ this.isNS71 = ua.indexOf('Netscape/7.1') != -1;
+ this.dialogCounter = 0;
+ this.plugins = new Array();
+ this.themes = new Array();
+ this.menus = new Array();
+ this.loadedPlugins = new Array();
+ this.buttonMap = new Array();
+ this.isLoaded = false;
+
+ // Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those
+ if (this.isOpera) {
+ this.isMSIE = true;
+ this.isGecko = false;
+ this.isSafari = false;
+ }
+
+ // TinyMCE editor id instance counter
+ this.idCounter = 0;
+};
+
+TinyMCE_Engine.prototype = {
+ init : function(settings) {
+ var theme;
+
+ this.settings = settings;
+
+ // Check if valid browser has execcommand support
+ if (typeof(document.execCommand) == 'undefined')
+ return;
+
+ // Get script base path
+ if (!tinyMCE.baseURL) {
+ var elements = document.getElementsByTagName('script');
+
+ for (var 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)) {
+ var 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' : '';
+
+ tinyMCE.baseURL = src;
+ break;
+ }
+ }
+ }
+
+ // Get document base path
+ 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 not HTTP absolute
+ if (tinyMCE.baseURL.indexOf('://') == -1 && tinyMCE.baseURL.charAt(0) != '/') {
+ // If site absolute
+ tinyMCE.baseURL = this.documentBasePath + "/" + tinyMCE.baseURL;
+ }
+
+ // Set default values on settings
+ 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]");
+ 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("debug", false);
+ 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("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", false);
+ this._def("fix_table_elements", false);
+ this._def("strict_loading_mode", document.contentType == 'application/xhtml+xml');
+ this._def("hidden_tab_class", '');
+ this._def("display_tab_class", '');
+
+ // Force strict loading mode to false on non Gecko browsers
+ if (this.isMSIE && !this.isOpera)
+ this.settings.strict_loading_mode = false;
+
+ // Browser check IE
+ if (this.isMSIE && this.settings['browsers'].indexOf('msie') == -1)
+ return;
+
+ // Browser check Gecko
+ if (this.isGecko && this.settings['browsers'].indexOf('gecko') == -1)
+ return;
+
+ // Browser check Safari
+ if (this.isSafari && this.settings['browsers'].indexOf('safari') == -1)
+ return;
+
+ // Browser check Opera
+ if (this.isOpera && this.settings['browsers'].indexOf('opera') == -1)
+ return;
+
+ // If not super absolute make it so
+ var baseHREF = tinyMCE.settings['document_base_url'];
+ var h = document.location.href;
+ var p = h.indexOf('://');
+ if (p > 0 && document.location.protocol != "file:") {
+ p = h.indexOf('/', p + 3);
+ h = h.substring(0, p);
+
+ if (baseHREF.indexOf('://') == -1)
+ baseHREF = h + baseHREF;
+
+ tinyMCE.settings['document_base_url'] = baseHREF;
+ tinyMCE.settings['document_base_prefix'] = h;
+ }
+
+ // Trim away query part
+ if (baseHREF.indexOf('?') != -1)
+ baseHREF = baseHREF.substring(0, baseHREF.indexOf('?'));
+
+ this.settings['base_href'] = baseHREF.substring(0, baseHREF.lastIndexOf('/')) + "/";
+
+ theme = this.settings['theme'];
+ this.blockRegExp = new RegExp("^(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|blockquote|center|dl|dt|dd|dir|fieldset|form|noscript|noframes|menu|isindex|samp)$", "i");
+ this.posKeyCodes = new Array(13,45,36,35,33,34,37,38,39,40);
+ this.uniqueURL = 'javascript:TINYMCE_UNIQUEURL();'; // Make unique URL non real URL
+ this.uniqueTag = '<div id="mceTMPElement" style="display: none">TMP</div>';
+ this.callbacks = new Array('onInit', 'getInfo', 'getEditorTemplate', 'setupContent', 'onChange', 'onPageLoad', 'handleNodeChange', 'initInstance', 'execCommand', 'getControlHTML', 'handleEvent', 'cleanup');
+
+ // Theme url
+ this.settings['theme_href'] = tinyMCE.baseURL + "/themes/" + theme;
+
+ if (!tinyMCE.isMSIE)
+ this.settings['force_br_newlines'] = false;
+
+ if (tinyMCE.getParam("popups_css", false)) {
+ var cssPath = tinyMCE.getParam("popups_css", "");
+
+ // Is relative
+ if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')
+ this.settings['popups_css'] = this.documentBasePath + "/" + cssPath;
+ else
+ this.settings['popups_css'] = cssPath;
+ } else
+ this.settings['popups_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_popup.css";
+
+ if (tinyMCE.getParam("editor_css", false)) {
+ var cssPath = tinyMCE.getParam("editor_css", "");
+
+ // Is relative
+ if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')
+ this.settings['editor_css'] = this.documentBasePath + "/" + cssPath;
+ else
+ this.settings['editor_css'] = cssPath;
+ } else
+ this.settings['editor_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_ui.css";
+
+ if (tinyMCE.settings['debug']) {
+ var msg = "Debug: \n";
+
+ msg += "baseURL: " + this.baseURL + "\n";
+ msg += "documentBasePath: " + this.documentBasePath + "\n";
+ msg += "content_css: " + this.settings['content_css'] + "\n";
+ msg += "popups_css: " + this.settings['popups_css'] + "\n";
+ msg += "editor_css: " + this.settings['editor_css'] + "\n";
+
+ alert(msg);
+ }
+
+ // Only do this once
+ if (this.configs.length == 0) {
+ // Is Safari enabled
+ if (this.isSafari && this.getParam('safari_warning', false))
+ alert("Safari support is very limited and should be considered experimental.\nSo there is no need to even submit bugreports on this early version.\nYou can disable this message by setting: safari_warning option to false");
+
+ if (typeof(TinyMCECompressed) == "undefined") {
+ tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCE_Engine.prototype.onLoad);
+
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+ if (document.body)
+ tinyMCE.addEvent(document.body, "readystatechange", TinyMCE_Engine.prototype.onLoad);
+ else
+ tinyMCE.addEvent(document, "readystatechange", TinyMCE_Engine.prototype.onLoad);
+ }
+
+ tinyMCE.addEvent(window, "load", TinyMCE_Engine.prototype.onLoad);
+ tinyMCE._addUnloadEvents();
+ }
+ }
+
+ this.loadScript(tinyMCE.baseURL + '/themes/' + this.settings['theme'] + '/editor_template' + tinyMCE.srcMode + '.js');
+ this.loadScript(tinyMCE.baseURL + '/langs/' + this.settings['language'] + '.js');
+ this.loadCSS(this.settings['editor_css']);
+
+ // Add plugins
+ var p = tinyMCE.getParam('plugins', '', true, ',');
+ if (p.length > 0) {
+ for (var i=0; i<p.length; i++) {
+ if (p[i].charAt(0) != '-')
+ this.loadScript(tinyMCE.baseURL + '/plugins/' + p[i] + '/editor_plugin' + tinyMCE.srcMode + '.js');
+ }
+ }
+
+ // Setup entities
+ settings['cleanup_entities'] = new Array();
+ var entities = tinyMCE.getParam('entities', '', true, ',');
+ for (var i=0; i<entities.length; i+=2)
+ settings['cleanup_entities']['c' + entities[i]] = entities[i+1];
+
+ // Save away this config
+ settings['index'] = this.configs.length;
+ this.configs[this.configs.length] = settings;
+
+ // Start loading first one in chain
+ this.loadNextScript();
+ },
+
+ _addUnloadEvents : function() {
+ if (tinyMCE.isMSIE) {
+ if (tinyMCE.settings['add_unload_trigger']) {
+ tinyMCE.addEvent(window, "unload", TinyMCE_Engine.prototype.unloadHandler);
+ tinyMCE.addEvent(window.document, "beforeunload", TinyMCE_Engine.prototype.unloadHandler);
+ }
+ } else {
+ if (tinyMCE.settings['add_unload_trigger'])
+ 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];
+
+ // Use the previous plugin object base URL used when loading external plugins
+ 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; // Done with loading
+ },
+
+ loadCSS : function(url) {
+ var ar = url.replace(/\s+/, '').split(',');
+ var lflen = 0, csslen = 0;
+ var skip = false;
+ var x = 0, i = 0, nl, le;
+
+ for (x = 0,csslen = ar.length; x<csslen; x++) {
+ ignore_css = false;
+
+ if (ar[x] != null && ar[x] != 'null' && ar[x].length > 0) {
+ /* Make sure it doesn't exist. */
+ 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) {
+ // Is relative, make absolute
+ if (css_file.indexOf('://') == -1 && css_file.charAt(0) != '/')
+ css_file = this.documentBasePath + "/" + css_file;
+
+ if (typeof(doc.createStyleSheet) == "undefined") {
+ elm = doc.createElement("link");
+
+ elm.rel = "stylesheet";
+ elm.href = css_file;
+
+ if ((headArr = doc.getElementsByTagName("head")) != null && headArr.length > 0)
+ headArr[0].appendChild(elm);
+ } else
+ doc.createStyleSheet(css_file);
+ }
+ }
+ },
+
+ confirmAdd : function(e, settings) {
+ var elm = tinyMCE.isMSIE ? event.srcElement : e.target;
+ var elementId = elm.name ? elm.name : elm.id;
+
+ tinyMCE.settings = settings;
+
+ if (tinyMCE.settings['convert_on_click'] || (!elm.getAttribute('mce_noask') && confirm(tinyMCELang['lang_edit_confirm'])))
+ tinyMCE.addMCEControl(elm, elementId);
+
+ elm.setAttribute('mce_noask', 'true');
+ },
+
+ updateContent : function(form_element_name) {
+ // Find MCE instance linked to given form element and copy it's value
+ var formElement = document.getElementById(form_element_name);
+ for (var n in tinyMCE.instances) {
+ var inst = tinyMCE.instances[n];
+ if (!tinyMCE.isInstance(inst))
+ continue;
+
+ inst.switchSettings();
+
+ if (inst.formElement == formElement) {
+ var doc = inst.getDoc();
+
+ tinyMCE._setHTML(doc, inst.formElement.value);
+
+ if (!tinyMCE.isMSIE)
+ 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);
+ },
+
+ removeMCEControl : function(editor_id) {
+ var inst = tinyMCE.getInstanceById(editor_id);
+
+ if (inst) {
+ inst.switchSettings();
+
+ editor_id = inst.editorId;
+ var html = tinyMCE.getContent(editor_id);
+
+ // Remove editor instance from instances array
+ var tmpInstances = new Array();
+ for (var instanceName in tinyMCE.instances) {
+ var instance = tinyMCE.instances[instanceName];
+ if (!tinyMCE.isInstance(instance))
+ continue;
+
+ if (instanceName != editor_id)
+ tmpInstances[instanceName] = instance;
+ }
+ tinyMCE.instances = tmpInstances;
+
+ tinyMCE.selectedElement = null;
+ tinyMCE.selectedInstance = null;
+
+ // Remove element
+ var replaceElement = document.getElementById(editor_id + "_parent");
+ var oldTargetElement = inst.oldTargetElement;
+ var targetName = oldTargetElement.nodeName.toLowerCase();
+
+ if (targetName == "textarea" || targetName == "input") {
+ // Just show the old text area
+ replaceElement.parentNode.removeChild(replaceElement);
+ oldTargetElement.style.display = "inline";
+ oldTargetElement.value = html;
+ } else {
+ oldTargetElement.innerHTML = html;
+ oldTargetElement.style.display = 'block';
+
+ replaceElement.parentNode.insertBefore(oldTargetElement, replaceElement);
+ replaceElement.parentNode.removeChild(replaceElement);
+ }
+ }
+ },
+
+ triggerSave : function(skip_cleanup, skip_callback) {
+ var inst, n;
+
+ // Default to false
+ if (typeof(skip_cleanup) == "undefined")
+ skip_cleanup = false;
+
+ // Default to false
+ if (typeof(skip_callback) == "undefined")
+ skip_callback = false;
+
+ // Cleanup and set all form fields
+ 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);
+ if (inst) {
+ if (typeof(focus) == "undefined")
+ focus = true;
+
+ if (focus)
+ inst.contentWindow.focus();
+
+ // Reset design mode if lost
+ inst.autoResetDesignMode();
+
+ this.selectedElement = inst.getFocusElement();
+ this.selectedInstance = inst;
+ tinyMCE.execCommand(command, user_interface, value);
+
+ // Cancel event so it doesn't call onbeforeonunlaod
+ if (tinyMCE.isMSIE && window.event != null)
+ tinyMCE.cancelEvent(window.event);
+ }
+ },
+
+ execCommand : function(command, user_interface, value) {
+ // Default input
+ user_interface = user_interface ? user_interface : false;
+ value = value ? value : null;
+
+ if (tinyMCE.selectedInstance)
+ tinyMCE.selectedInstance.switchSettings();
+
+ 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;
+
+ case 'mceFocus':
+ var inst = tinyMCE.getInstanceById(value);
+ if (inst)
+ inst.contentWindow.focus();
+ return;
+
+ case "mceAddControl":
+ case "mceAddEditor":
+ tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);
+ return;
+
+ case "mceAddFrameControl":
+ tinyMCE.addMCEControl(tinyMCE._getElementById(value['element'], value['document']), value['element'], value['document']);
+ return;
+
+ case "mceRemoveControl":
+ case "mceRemoveEditor":
+ tinyMCE.removeMCEControl(value);
+ return;
+
+ case "mceResetDesignMode":
+ // Resets the designmode state of the editors in Gecko
+ if (!tinyMCE.isMSIE) {
+ for (var n in tinyMCE.instances) {
+ if (!tinyMCE.isInstance(tinyMCE.instances[n]))
+ continue;
+
+ try {
+ tinyMCE.instances[n].getDoc().designMode = "on";
+ } catch (e) {
+ // Ignore any errors
+ }
+ }
+ }
+
+ return;
+ }
+
+ if (this.selectedInstance) {
+ this.selectedInstance.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 = aw < 0 ? 300 : aw;
+ aw = aw + "px";
+ }
+
+ if (ah.indexOf('%') == -1) {
+ ah = parseInt(ah);
+ ah = ah < 0 ? 240 : ah;
+ ah = ah + "px";
+ }
+
+ iframe.setAttribute("id", id);
+ iframe.setAttribute("class", "mceEditorIframe");
+ iframe.setAttribute("border", "0");
+ iframe.setAttribute("frameBorder", "0");
+ iframe.setAttribute("marginWidth", "0");
+ iframe.setAttribute("marginHeight", "0");
+ iframe.setAttribute("leftMargin", "0");
+ iframe.setAttribute("topMargin", "0");
+ iframe.setAttribute("width", aw);
+ iframe.setAttribute("height", ah);
+ iframe.setAttribute("allowtransparency", "true");
+ iframe.className = 'mceEditorIframe';
+
+ if (tinyMCE.settings["auto_resize"])
+ iframe.setAttribute("scrolling", "no");
+
+ // Must have a src element in MSIE HTTPs breaks aswell as absoute URLs
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ iframe.setAttribute("src", this.settings['default_document']);
+
+ iframe.style.width = aw;
+ iframe.style.height = ah;
+
+ // Ugly hack for Gecko problem in strict mode
+ if (tinyMCE.settings.strict_loading_mode)
+ iframe.style.marginBottom = '-5px';
+
+ // MSIE 5.0 issue
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ replace_element.outerHTML = iframe.outerHTML;
+ else
+ replace_element.parentNode.replaceChild(iframe, replace_element);
+
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ return win.frames[id];
+ else
+ return iframe;
+ },
+
+ setupContent : function(editor_id) {
+ var inst = tinyMCE.instances[editor_id];
+ var doc = inst.getDoc();
+ var head = doc.getElementsByTagName('head').item(0);
+ var content = inst.startContent;
+
+ // HTML values get XML encoded in strict mode
+ if (tinyMCE.settings.strict_loading_mode) {
+ content = content.replace(/&lt;/g, '<');
+ content = content.replace(/&gt;/g, '>');
+ content = content.replace(/&quot;/g, '"');
+ content = content.replace(/&amp;/g, '&');
+ }
+
+ inst.switchSettings();
+
+ // Not loaded correctly hit it again, Mozilla bug #997860
+ if (!tinyMCE.isMSIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") {
+ // This part will remove the designMode status
+ // Failes first time in Firefox 1.5b2 on Mac
+ try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {}
+ window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000);
+ return;
+ }
+
+ if (!head) {
+ window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10);
+ return;
+ }
+
+ // Import theme specific content CSS the user specific
+ tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/themes/" + inst.settings['theme'] + "/css/editor_content.css");
+ tinyMCE.importCSS(inst.getDoc(), inst.settings['content_css']);
+ tinyMCE.dispatchCallback(inst, 'init_instance_callback', 'initInstance', inst);
+
+ // Setup keyboard shortcuts
+ if (tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')) {
+ inst.addShortcut('ctrl', 'z', 'lang_undo_desc', 'Undo');
+ inst.addShortcut('ctrl', 'y', 'lang_redo_desc', 'Redo');
+ }
+
+ // Add default shortcuts for gecko
+ if (tinyMCE.isGecko) {
+ inst.addShortcut('ctrl', 'b', 'lang_bold_desc', 'Bold');
+ inst.addShortcut('ctrl', 'i', 'lang_italic_desc', 'Italic');
+ inst.addShortcut('ctrl', 'u', 'lang_underline_desc', 'Underline');
+ }
+
+ // Setup span styles
+ if (tinyMCE.getParam("convert_fonts_to_spans"))
+ inst.getDoc().body.setAttribute('id', 'mceSpanFonts');
+
+ if (tinyMCE.settings['nowrap'])
+ doc.body.style.whiteSpace = "nowrap";
+
+ doc.body.dir = this.settings['directionality'];
+ doc.editorId = editor_id;
+
+ // Add on document element in Mozilla
+ if (!tinyMCE.isMSIE)
+ doc.documentElement.editorId = editor_id;
+
+ inst.setBaseHREF(tinyMCE.settings['base_href']);
+
+ // Replace new line characters to BRs
+ if (tinyMCE.settings['convert_newlines_to_brs']) {
+ content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi");
+ content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi");
+ content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi");
+ }
+
+ // Open closed anchors
+ // content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
+
+ // Call custom cleanup code
+ content = tinyMCE.storeAwayURLs(content);
+ content = tinyMCE._customCleanup(inst, "insert_to_editor", content);
+
+ if (tinyMCE.isMSIE) {
+ // Ugly!!!
+ window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["' + editor_id + '"].getDoc(), "' + editor_id + '");}catch(e){}', 500);
+
+ if (tinyMCE.settings["force_br_newlines"])
+ doc.styleSheets[0].addRule("p", "margin: 0;");
+
+ var body = inst.getBody();
+ body.editorId = editor_id;
+ }
+
+ content = tinyMCE.cleanupHTMLCode(content);
+
+ // Fix for bug #958637
+ if (!tinyMCE.isMSIE) {
+ var contentElement = inst.getDoc().createElement("body");
+ var doc = inst.getDoc();
+
+ contentElement.innerHTML = content;
+
+ // Remove weridness!
+ if (tinyMCE.isGecko && tinyMCE.settings['remove_lt_gt'])
+ content = content.replace(new RegExp('&lt;&gt;', 'g'), "");
+
+ if (tinyMCE.settings['cleanup_on_startup'])
+ tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, this.settings, contentElement));
+ else {
+ // Convert all strong/em to b/i
+ content = tinyMCE.regexpReplace(content, "<strong", "<b", "gi");
+ content = tinyMCE.regexpReplace(content, "<em(/?)>", "<i$1>", "gi");
+ content = tinyMCE.regexpReplace(content, "<em ", "<i ", "gi");
+ content = tinyMCE.regexpReplace(content, "</strong>", "</b>", "gi");
+ content = tinyMCE.regexpReplace(content, "</em>", "</i>", "gi");
+ tinyMCE.setInnerHTML(inst.getBody(), content);
+ }
+
+ tinyMCE.convertAllRelativeURLs(inst.getBody());
+ } else {
+ if (tinyMCE.settings['cleanup_on_startup']) {
+ tinyMCE._setHTML(inst.getDoc(), content);
+
+ // Produces permission denied error in MSIE 5.5
+ eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}');
+ } else
+ tinyMCE._setHTML(inst.getDoc(), content);
+ }
+
+ // Fix for bug #957681
+ //inst.getDoc().designMode = inst.getDoc().designMode;
+
+ // Setup element references
+ var parentElm = inst.targetDoc.getElementById(inst.editorId + '_parent');
+ inst.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;
+
+ tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual'], inst);
+ tinyMCE.dispatchCallback(inst, 'setupcontent_callback', 'setupContent', editor_id, inst.getBody(), inst.getDoc());
+
+ // Re-add design mode on mozilla
+ if (!tinyMCE.isMSIE)
+ tinyMCE.addEventHandlers(inst);
+
+ // Add blur handler
+ if (tinyMCE.isMSIE) {
+ tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE_Engine.prototype._eventPatch);
+ tinyMCE.addEvent(inst.getBody(), "beforedeactivate", TinyMCE_Engine.prototype._eventPatch); // Bug #1439953
+
+ // Workaround for drag drop/copy paste base href bug
+ if (!tinyMCE.isOpera) {
+ tinyMCE.addEvent(doc.body, "mousemove", TinyMCE_Engine.prototype.onMouseMove);
+ tinyMCE.addEvent(doc.body, "beforepaste", TinyMCE_Engine.prototype._eventPatch);
+ tinyMCE.addEvent(doc.body, "drop", TinyMCE_Engine.prototype._eventPatch);
+ }
+ }
+
+ // Trigger node change, this call locks buttons for tables and so forth
+ tinyMCE.selectedInstance = inst;
+ tinyMCE.selectedElement = inst.contentWindow.document.body;
+
+ // Call custom DOM cleanup
+ tinyMCE._customCleanup(inst, "insert_to_editor_dom", inst.getBody());
+ tinyMCE._customCleanup(inst, "setup_content_dom", inst.getBody());
+ tinyMCE._setEventsEnabled(inst.getBody(), false);
+ tinyMCE.cleanupAnchors(inst.getDoc());
+
+ if (tinyMCE.getParam("convert_fonts_to_spans"))
+ tinyMCE.convertSpansToFonts(inst.getDoc());
+
+ inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);
+ inst.undoRedo.add({ content : inst.startContent });
+
+ // Cleanup any mess left from storyAwayURLs
+ if (tinyMCE.isGecko) {
+ // Remove mce_src from textnodes and comments
+ tinyMCE.selectNodes(inst.getBody(), function(n) {
+ if (n.nodeType == 3 || n.nodeType == 8) {
+ n.nodeValue = n.nodeValue.replace(new RegExp('\\smce_src=\"[^\"]*\"', 'gi'), "");
+ n.nodeValue = n.nodeValue.replace(new RegExp('\\smce_href=\"[^\"]*\"', 'gi'), "");
+ }
+
+ return false;
+ });
+ }
+
+ // Cleanup any mess left from storyAwayURLs
+ tinyMCE._removeInternal(inst.getBody());
+
+ tinyMCE.selectedInstance = inst;
+ tinyMCE.triggerNodeChange(false, true);
+ },
+
+ storeAwayURLs : function(s) {
+ // Remove all mce_src, mce_href and replace them with new ones
+ // s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
+ // s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
+
+ if (!s.match(/(mce_src|mce_href)/gi, s)) {
+ s = s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'src="$1" mce_src="$1"');
+ s = s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'href="$1" mce_href="$1"');
+ }
+
+ return s;
+ },
+
+ _removeInternal : function(n) {
+ if (tinyMCE.isGecko) {
+ // Remove mce_src from textnodes and comments
+ tinyMCE.selectNodes(n, function(n) {
+ if (n.nodeType == 3 || n.nodeType == 8) {
+ n.nodeValue = n.nodeValue.replace(new RegExp('\\smce_src=\"[^\"]*\"', 'gi'), "");
+ n.nodeValue = n.nodeValue.replace(new RegExp('\\smce_href=\"[^\"]*\"', 'gi'), "");
+ }
+
+ return false;
+ });
+ }
+ },
+
+ removeTinyMCEFormElements : function(form_obj) {
+ // Check if form is valid
+ if (typeof(form_obj) == "undefined" || form_obj == null)
+ return;
+
+ // If not a form, find the form
+ if (form_obj.nodeName != "FORM") {
+ if (form_obj.form)
+ form_obj = form_obj.form;
+ else
+ form_obj = tinyMCE.getParentElement(form_obj, "form");
+ }
+
+ // Still nothing
+ if (form_obj == null)
+ return;
+
+ // Disable all UI form elements that TinyMCE created
+ for (var i=0; i<form_obj.elements.length; i++) {
+ var 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;
+
+ // Remove odd, error
+ if (typeof(tinyMCE) == "undefined")
+ return true;
+
+ //tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));
+
+ if (tinyMCE.executeCallback(tinyMCE.selectedInstance, 'handle_event_callback', 'handleEvent', e))
+ return false;
+
+ switch (e.type) {
+ case "beforedeactivate": // Was added due to bug #1439953
+ case "blur":
+ if (tinyMCE.selectedInstance)
+ tinyMCE.selectedInstance.execCommand('mceEndTyping');
+
+ tinyMCE.hideMenus();
+
+ return;
+
+ // Workaround for drag drop/copy paste base href bug
+ case "drop":
+ case "beforepaste":
+ if (tinyMCE.selectedInstance)
+ tinyMCE.selectedInstance.setBaseHREF(null);
+
+ // Fixes odd MSIE bug where drag/droping elements in a iframe with height 100% breaks
+ // This logic forces the width/height to be in pixels while the user is drag/dropping
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+ var ife = tinyMCE.selectedInstance.iframeElement;
+
+ /*if (ife.style.width.indexOf('%') != -1) {
+ ife._oldWidth = ife.width.height;
+ ife.style.width = ife.clientWidth;
+ }*/
+
+ if (ife.style.height.indexOf('%') != -1) {
+ ife._oldHeight = ife.style.height;
+ ife.style.height = ife.clientHeight;
+ }
+ }
+
+ window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings['base_href']);tinyMCE._resetIframeHeight();", 1);
+ return;
+
+ case "submit":
+ tinyMCE.removeTinyMCEFormElements(tinyMCE.isMSIE ? window.event.srcElement : e.target);
+ tinyMCE.triggerSave();
+ tinyMCE.isNotDirty = true;
+ return;
+
+ case "reset":
+ var formObj = tinyMCE.isMSIE ? window.event.srcElement : e.target;
+
+ for (var 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.selectedInstance = tinyMCE.instances[e.target.editorId];
+ } else {
+ if (e.target.ownerDocument.editorId)
+ tinyMCE.selectedInstance = tinyMCE.instances[e.target.ownerDocument.editorId];
+ }
+
+ if (tinyMCE.selectedInstance)
+ tinyMCE.selectedInstance.switchSettings();
+
+ // Insert P element
+ if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && e.keyCode == 13 && !e.shiftKey) {
+ // Insert P element instead of BR
+ if (TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance, e)) {
+ // Cancel event
+ tinyMCE.execCommand("mceAddUndoLevel");
+ tinyMCE.cancelEvent(e);
+ return false;
+ }
+ }
+
+ // Handle backspace
+ if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
+ // Insert P element instead of BR
+ if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
+ // Cancel event
+ tinyMCE.execCommand("mceAddUndoLevel");
+ tinyMCE.cancelEvent(e);
+ return false;
+ }
+ }
+
+ // Return key pressed
+ if (tinyMCE.isMSIE && tinyMCE.settings['force_br_newlines'] && e.keyCode == 13) {
+ if (e.target.editorId)
+ tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+
+ if (tinyMCE.selectedInstance) {
+ var sel = tinyMCE.selectedInstance.getDoc().selection;
+ var rng = sel.createRange();
+
+ if (tinyMCE.getParentElement(rng.parentElement(), "li") != null)
+ return false;
+
+ // Cancel event
+ e.returnValue = false;
+ e.cancelBubble = true;
+
+ // Insert BR element
+ rng.pasteHTML("<br />");
+ rng.collapse(false);
+ rng.select();
+
+ tinyMCE.execCommand("mceAddUndoLevel");
+ tinyMCE.triggerNodeChange(false);
+ return false;
+ }
+ }
+
+ // Backspace or delete
+ if (e.keyCode == 8 || e.keyCode == 46) {
+ tinyMCE.selectedElement = e.target;
+ tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a");
+ tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img");
+ tinyMCE.triggerNodeChange(false);
+ }
+
+ return false;
+ break;
+
+ case "keyup":
+ case "keydown":
+ tinyMCE.hideMenus();
+ tinyMCE.hasMouseMoved = false;
+
+ if (inst && inst.handleShortcut(e))
+ return false;
+
+ if (e.target.editorId)
+ tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+ else
+ return;
+
+ if (tinyMCE.selectedInstance)
+ tinyMCE.selectedInstance.switchSettings();
+
+ var inst = tinyMCE.selectedInstance;
+
+ // Handle backspace
+ if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
+ // Insert P element instead of BR
+ if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
+ // Cancel event
+ tinyMCE.execCommand("mceAddUndoLevel");
+ e.preventDefault();
+ return false;
+ }
+ }
+
+ tinyMCE.selectedElement = null;
+ tinyMCE.selectedNode = null;
+ var elm = tinyMCE.selectedInstance.getFocusElement();
+ tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a");
+ tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img");
+ tinyMCE.selectedElement = elm;
+
+ // Update visualaids on tabs
+ if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9)
+ tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);
+
+ // Fix empty elements on return/enter, check where enter occured
+ if (tinyMCE.isMSIE && e.type == "keydown" && e.keyCode == 13)
+ tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();
+
+ // Fix empty elements on return/enter
+ if (tinyMCE.isMSIE && e.type == "keyup" && e.keyCode == 13) {
+ var elm = tinyMCE.enterKeyElement;
+ if (elm) {
+ var re = new RegExp('^HR|IMG|BR$','g'); // Skip these
+ var dre = new RegExp('^H[1-6]$','g'); // Add double on these
+
+ if (!elm.hasChildNodes() && !re.test(elm.nodeName)) {
+ if (dre.test(elm.nodeName))
+ elm.innerHTML = "&nbsp;&nbsp;";
+ else
+ elm.innerHTML = "&nbsp;";
+ }
+ }
+ }
+
+ // Check if it's a position key
+ var keys = tinyMCE.posKeyCodes;
+ var posKey = false;
+ for (var i=0; i<keys.length; i++) {
+ if (keys[i] == e.keyCode) {
+ posKey = true;
+ break;
+ }
+ }
+
+ // MSIE custom key handling
+ if (tinyMCE.isMSIE && tinyMCE.settings['custom_undo_redo']) {
+ var keys = new Array(8,46); // Backspace,Delete
+ for (var i=0; i<keys.length; i++) {
+ if (keys[i] == e.keyCode) {
+ if (e.type == "keyup")
+ tinyMCE.triggerNodeChange(false);
+ }
+ }
+ }
+
+ // If Ctrl key
+ if (e.keyCode == 17)
+ return true;
+
+ // Handle Undo/Redo when typing content
+
+ // Start typing (non position key)
+ if (!posKey && e.type == "keyup")
+ tinyMCE.execCommand("mceStartTyping");
+
+ // Store undo bookmark
+ if (e.type == "keydown" && (posKey || e.ctrlKey) && inst)
+ inst.undoBookmark = inst.selection.getBookmark();
+
+ // End typing (position key) or some Ctrl event
+ if (e.type == "keyup" && (posKey || e.ctrlKey))
+ tinyMCE.execCommand("mceEndTyping");
+
+ if (posKey && e.type == "keyup")
+ tinyMCE.triggerNodeChange(false);
+
+ if (tinyMCE.isMSIE && e.ctrlKey)
+ window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
+ break;
+
+ case "mousedown":
+ case "mouseup":
+ case "click":
+ case "focus":
+ tinyMCE.hideMenus();
+
+ if (tinyMCE.selectedInstance) {
+ tinyMCE.selectedInstance.switchSettings();
+ tinyMCE.selectedInstance.isFocused = true;
+ }
+
+ // Check instance event trigged on
+ var targetBody = tinyMCE.getParentElement(e.target, "body");
+ for (var instanceName in tinyMCE.instances) {
+ if (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))
+ continue;
+
+ var inst = tinyMCE.instances[instanceName];
+
+ // Reset design mode if lost (on everything just in case)
+ inst.autoResetDesignMode();
+
+ if (inst.getBody() == targetBody) {
+ tinyMCE.selectedInstance = inst;
+ tinyMCE.selectedElement = e.target;
+ tinyMCE.linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");
+ tinyMCE.imgElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "img");
+ break;
+ }
+ }
+
+ // Add first bookmark location
+ if (!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark)
+ tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark = tinyMCE.selectedInstance.selection.getBookmark();
+
+ if (tinyMCE.isSafari) {
+ tinyMCE.selectedInstance.lastSafariSelection = tinyMCE.selectedInstance.selection.getBookmark();
+ tinyMCE.selectedInstance.lastSafariSelectedElement = tinyMCE.selectedElement;
+
+ var lnk = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");
+
+ // Patch the darned link
+ if (lnk && e.type == "mousedown") {
+ lnk.setAttribute("mce_real_href", lnk.getAttribute("href"));
+ lnk.setAttribute("href", "javascript:void(0);");
+ }
+
+ // Patch back
+ if (lnk && e.type == "click") {
+ window.setTimeout(function() {
+ lnk.setAttribute("href", lnk.getAttribute("mce_real_href"));
+ lnk.removeAttribute("mce_real_href");
+ }, 10);
+ }
+ }
+
+ // Reset selected node
+ if (e.type != "focus")
+ tinyMCE.selectedNode = null;
+
+ tinyMCE.triggerNodeChange(false);
+ tinyMCE.execCommand("mceEndTyping");
+
+ if (e.type == "mouseup")
+ tinyMCE.execCommand("mceAddUndoLevel");
+
+ // Just in case
+ if (!tinyMCE.selectedInstance && e.target.editorId)
+ tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];
+
+ return false;
+ break;
+ }
+ },
+
+ getButtonHTML : function(id, lang, img, cmd, ui, val) {
+ var h = '', m, x;
+
+ cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';
+
+ if (typeof(ui) != "undefined" && ui != null)
+ cmd += ',' + ui;
+
+ if (typeof(val) != "undefined" && val != null)
+ cmd += ",'" + val + "'";
+
+ cmd += ');';
+
+ // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled
+ if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isMSIE || tinyMCE.isOpera) && (m = this.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {
+ // Tiled button
+ 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;" class="mceTiledButton mceButtonNormal" target="_self">';
+ h += '<img src="{$themeurl}/images/spacer.gif" style="background-position: ' + x + 'px 0" title="{$' + lang + '}" />';
+ h += '</a>';
+ } else {
+ // Normal button
+ h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceButtonNormal" target="_self">';
+ h += '<img src="' + img + '" title="{$' + lang + '}" />';
+ h += '</a>';
+ }
+
+ return h;
+ },
+
+ addButtonMap : function(m) {
+ var i, a = m.replace(/\s+/, '').split(',');
+
+ for (i=0; i<a.length; i++)
+ this.buttonMap[a[i]] = i;
+ },
+
+ submitPatch : function() {
+ tinyMCE.removeTinyMCEFormElements(this);
+ tinyMCE.triggerSave();
+ this.mceOldSubmit();
+ tinyMCE.isNotDirty = true;
+ },
+
+ onLoad : function() {
+ // Wait for everything to be loaded first
+ if (tinyMCE.settings.strict_loading_mode && this.loadingIndex != -1) {
+ window.setTimeout('tinyMCE.onLoad();', 1);
+ return;
+ }
+
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera && window.event.type == "readystatechange" && document.readyState != "complete")
+ return true;
+
+ if (tinyMCE.isLoaded)
+ return true;
+
+ tinyMCE.isLoaded = true;
+
+ tinyMCE.dispatchCallback(null, 'onpageload', 'onPageLoad');
+
+ for (var c=0; c<tinyMCE.configs.length; c++) {
+ tinyMCE.settings = tinyMCE.configs[c];
+
+ var selector = tinyMCE.getParam("editor_selector");
+ var deselector = tinyMCE.getParam("editor_deselector");
+ var elementRefAr = new Array();
+
+ // Add submit triggers
+ if (document.forms && tinyMCE.settings['add_form_submit_trigger'] && !tinyMCE.submitTriggers) {
+ for (var i=0; i<document.forms.length; i++) {
+ var form = document.forms[i];
+
+ tinyMCE.addEvent(form, "submit", TinyMCE_Engine.prototype.handleEvent);
+ tinyMCE.addEvent(form, "reset", TinyMCE_Engine.prototype.handleEvent);
+ tinyMCE.submitTriggers = true; // Do it only once
+
+ // Patch the form.submit function
+ if (tinyMCE.settings['submit_patch']) {
+ try {
+ form.mceOldSubmit = form.submit;
+ form.submit = TinyMCE_Engine.prototype.submitPatch;
+ } catch (e) {
+ // Do nothing
+ }
+ }
+ }
+ }
+
+ // Add editor instances based on mode
+ var mode = tinyMCE.settings['mode'];
+ switch (mode) {
+ case "exact":
+ var elements = tinyMCE.getParam('elements', '', true, ',');
+
+ for (var i=0; i<elements.length; i++) {
+ var element = tinyMCE._getElementById(elements[i]);
+ var trigger = element ? element.getAttribute(tinyMCE.settings['textarea_trigger']) : "";
+
+ if (tinyMCE.getAttrib(element, "class").indexOf(deselector) != -1)
+ 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]);
+ else if (tinyMCE.settings['debug'])
+ alert("Error: Could not find element by id or name: " + elements[i]);
+ }
+ break;
+
+ case "specific_textareas":
+ case "textareas":
+ var nodeList = document.getElementsByTagName("textarea");
+
+ for (var i=0; i<nodeList.length; i++) {
+ var elm = nodeList.item(i);
+ var trigger = elm.getAttribute(tinyMCE.settings['textarea_trigger']);
+
+ if (selector != '' && tinyMCE.getAttrib(elm, "class").indexOf(selector) == -1)
+ continue;
+
+ if (selector != '')
+ trigger = selector != "" ? "true" : "";
+
+ if (tinyMCE.getAttrib(elm, "class").indexOf(deselector) != -1)
+ continue;
+
+ if ((mode == "specific_textareas" && trigger == "true") || (mode == "textareas" && trigger != "false"))
+ elementRefAr[elementRefAr.length] = elm;
+ }
+ break;
+ }
+
+ for (var i=0; i<elementRefAr.length; i++) {
+ var element = elementRefAr[i];
+ var elementId = element.name ? element.name : element.id;
+
+ if (tinyMCE.settings['ask'] || tinyMCE.settings['convert_on_click']) {
+ // Focus breaks in Mozilla
+ if (tinyMCE.isGecko) {
+ var 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);});
+ // tinyMCE.addEvent(element, "mouseover", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});
+ } else {
+ var 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); });
+ // tinyMCE.addEvent(element, "mouseenter", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });
+ }
+ } else
+ tinyMCE.addMCEControl(element, elementId);
+ }
+
+ // Handle auto focus
+ 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();
+ }, 10);
+ }
+
+ 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 value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];
+
+ // Fix bool values
+ 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);
+ var outArray = new Array();
+
+ for (var 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.innerHTML;
+ },
+
+ addToLang : function(prefix, ar) {
+ for (var key in ar) {
+ if (typeof(ar[key]) == 'function')
+ continue;
+
+ tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = ar[key];
+ }
+
+ this.loadNextScript();
+
+ // for (var key in ar)
+ // tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = "|" + ar[key] + "|";
+ },
+
+ triggerNodeChange : function(focus, setup_content) {
+ if (tinyMCE.selectedInstance) {
+ var inst = tinyMCE.selectedInstance;
+ var editorId = inst.editorId;
+ var elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();
+ var undoIndex = -1;
+ var undoLevels = -1;
+ var anySelection = false;
+ var selectedText = inst.selection.getSelectedText();
+
+ if (setup_content && tinyMCE.isGecko && inst.isHidden())
+ elm = inst.getBody();
+
+ inst.switchSettings();
+
+ if (tinyMCE.settings["auto_resize"]) {
+ var doc = inst.getDoc();
+
+ inst.iframeElement.style.width = doc.body.offsetWidth + "px";
+ inst.iframeElement.style.height = doc.body.offsetHeight + "px";
+ }
+
+ if (tinyMCE.selectedElement)
+ anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (selectedText && selectedText.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;
+
+ // Call custom cleanup
+ var customCleanup = tinyMCE.settings['cleanup_callback'];
+ if (customCleanup != "" && eval("typeof(" + customCleanup + ")") != "undefined")
+ content = eval(customCleanup + "(type, content, inst);");
+
+ // Trigger plugin cleanups
+ 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, valid_languages) {
+ var lang = "en", b = tinyMCE.baseURL + '/plugins/' + name;
+
+ valid_languages = valid_languages.split(',');
+ for (var i=0; i<valid_languages.length; i++) {
+ if (tinyMCE.settings['language'] == valid_languages[i])
+ lang = tinyMCE.settings['language'];
+ }
+
+ if (this.plugins[name])
+ b = this.plugins[name].baseURL;
+
+ tinyMCE.loadScript(b + '/langs/' + lang + '.js');
+ },
+
+ applyTemplate : function(h, as) {
+ var i, s, ar = h.match(new RegExp('\\{\\$[a-z0-9_]+\\}', 'gi'));
+
+ if (ar && ar.length > 0) {
+ for (i=ar.length-1; i>=0; i--) {
+ s = ar[i].substring(2, ar[i].length-1);
+
+ if (s.indexOf('lang_') == 0 && tinyMCELang[s])
+ h = tinyMCE.replaceVar(h, s, tinyMCELang[s]);
+ else if (as && as[s])
+ h = tinyMCE.replaceVar(h, s, as[s]);
+ else if (tinyMCE.settings[s])
+ h = tinyMCE.replaceVar(h, s, tinyMCE.settings[s]);
+ }
+ }
+
+ h = tinyMCE.replaceVar(h, "themeurl", tinyMCE.themeURL);
+
+ return h;
+ },
+
+ 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;
+
+ 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;
+
+ // Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!
+ if (tinyMCE.isMSIE)
+ 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'];
+
+ // 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]));
+ }
+
+ if (html) {
+ html = tinyMCE.replaceVar(html, "css", this.settings['popups_css']);
+ html = tinyMCE.applyTemplate(html, args);
+
+ var 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.isMSIE && !tinyMCE.isOpera) && resizable != 'yes' && tinyMCE.settings["dialog_type"] == "modal") {
+ height += 10;
+
+ var features = "resizable:" + resizable
+ + ";scroll:"
+ + scrollbars + ";status:yes;center:yes;help:no;dialogWidth:"
+ + width + "px;dialogHeight:" + height + "px;";
+
+ window.showModalDialog(url, window, features);
+ } else {
+ var modal = (resizable == "yes") ? "no" : "yes";
+
+ if (tinyMCE.isGecko && tinyMCE.isMac)
+ modal = "no";
+
+ if (template['close_previous'] != "no")
+ try {tinyMCE.lastWindow.close();} catch (ex) {}
+
+ var 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;
+
+ eval('try { win.resizeTo(width, height); } catch(e) { }');
+
+ // Make it bigger if statusbar is forced
+ 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 aidClass = tinyMCE.settings['visual_table_class'];
+
+ if (typeof(state) == "undefined")
+ state = tinyMCE.settings['visual'];
+
+ // Split
+ var classNames = new Array();
+ var ar = class_name.split(' ');
+ for (var 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;
+
+ // Glue
+ var className = "";
+ for (var i=0; i<classNames.length; i++) {
+ if (i > 0)
+ className += " ";
+
+ className += classNames[i];
+ }
+
+ return className;
+ },
+
+ handleVisualAid : function(el, deep, state, inst, skip_dispatch) {
+ if (!el)
+ return;
+
+ if (!skip_dispatch)
+ tinyMCE.dispatchCallback(inst, 'handle_visual_aid_callback', 'handleVisualAid', el, deep, state, inst);
+
+ var tableElement = null;
+
+ switch (el.nodeName) {
+ case "TABLE":
+ var oldW = el.style.width;
+ var oldH = el.style.height;
+ var bo = tinyMCE.getAttrib(el, "border");
+
+ bo = bo == "" || bo == "0" ? true : false;
+
+ tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo));
+
+ el.style.width = oldW;
+ el.style.height = oldH;
+
+ for (var y=0; y<el.rows.length; y++) {
+ for (var x=0; x<el.rows[y].cells.length; x++) {
+ var 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":
+ var anchorName = tinyMCE.getAttrib(el, "name");
+
+ if (anchorName != '' && state) {
+ el.title = anchorName;
+ el.className = 'mceItemAnchor';
+ } else if (anchorName != '' && !state)
+ el.className = '';
+
+ break;
+ }
+
+ if (deep && el.hasChildNodes()) {
+ for (var i=0; i<el.childNodes.length; i++)
+ tinyMCE.handleVisualAid(el.childNodes[i], deep, state, inst, true);
+ }
+ },
+
+ /*
+ applyClassesToFonts : function(doc, size) {
+ var f = doc.getElementsByTagName("font");
+ for (var i=0; i<f.length; i++) {
+ var s = tinyMCE.getAttrib(f[i], "size");
+
+ if (s != "")
+ tinyMCE.setAttrib(f[i], 'class', "mceItemFont" + s);
+ }
+
+ if (typeof(size) != "undefined") {
+ var css = "";
+
+ for (var x=0; x<doc.styleSheets.length; x++) {
+ for (var i=0; i<doc.styleSheets[x].rules.length; i++) {
+ if (doc.styleSheets[x].rules[i].selectorText == '#mceSpanFonts .mceItemFont' + size) {
+ css = doc.styleSheets[x].rules[i].style.cssText;
+ break;
+ }
+ }
+
+ if (css != "")
+ break;
+ }
+
+ if (doc.styleSheets[0].rules[0].selectorText == "FONT")
+ doc.styleSheets[0].removeRule(0);
+
+ doc.styleSheets[0].addRule("FONT", css, 0);
+ }
+ },
+ */
+
+ fixGeckoBaseHREFBug : function(m, e, h) {
+ var nl, i, a, n, xsrc, xhref, el;
+
+ if (tinyMCE.isGecko) {
+ if (m == 1) {
+ h = h.replace(/\ssrc=/gi, " mce_tsrc=");
+ h = h.replace(/\shref=/gi, " mce_thref=");
+
+ return h;
+ } else {
+ el = new Array('a','img','select','area','iframe','base','input','script','embed','object','link');
+
+ for (a=0; a<el.length; a++) {
+ n = e.getElementsByTagName(el[a]);
+
+ for (i=0; i<n.length; i++) {
+ xsrc = tinyMCE.getAttrib(n[i], "mce_tsrc");
+ xhref = tinyMCE.getAttrib(n[i], "mce_thref");
+
+ if (xsrc != "") {
+ try {
+ n[i].src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xsrc);
+ } catch (e) {
+ // Ignore, Firefox cast exception if local file wasn't found
+ }
+
+ n[i].removeAttribute("mce_tsrc");
+ }
+
+ if (xhref != "") {
+ try {
+ n[i].href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xhref);
+ } catch (e) {
+ // Ignore, Firefox cast exception if local file wasn't found
+ }
+
+ n[i].removeAttribute("mce_thref");
+ }
+ }
+ }
+
+ el = 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) {
+ // Force closed anchors open
+ //html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
+
+ html_content = tinyMCE.cleanupHTMLCode(html_content);
+
+ // Try innerHTML if it fails use pasteHTML in MSIE
+ try {
+ tinyMCE.setInnerHTML(doc.body, html_content);
+ } catch (e) {
+ if (this.isMSIE)
+ doc.body.createTextRange().pasteHTML(html_content);
+ }
+
+ // Content duplication bug fix
+ if (tinyMCE.isMSIE && tinyMCE.settings['fix_content_duplication']) {
+ // Remove P elements in P elements
+ var paras = doc.getElementsByTagName("P");
+ for (var i=0; i<paras.length; i++) {
+ var node = paras[i];
+ while ((node = node.parentNode) != null) {
+ if (node.nodeName == "P")
+ node.outerHTML = node.innerHTML;
+ }
+ }
+
+ // Content duplication bug fix (Seems to be word crap)
+ var html = doc.body.innerHTML;
+/*
+ if (html.indexOf('="mso') != -1) {
+ for (var i=0; i<doc.body.all.length; i++) {
+ var el = doc.body.all[i];
+ el.removeAttribute("className","",0);
+ el.removeAttribute("style","",0);
+ }
+
+ html = doc.body.innerHTML;
+ html = tinyMCE.regexpReplace(html, "<o:p><\/o:p>", "<br />");
+ html = tinyMCE.regexpReplace(html, "<o:p>&nbsp;<\/o:p>", "");
+ html = tinyMCE.regexpReplace(html, "<st1:.*?>", "");
+ html = tinyMCE.regexpReplace(html, "<p><\/p>", "");
+ html = tinyMCE.regexpReplace(html, "<p><\/p>\r\n<p><\/p>", "");
+ html = tinyMCE.regexpReplace(html, "<p>&nbsp;<\/p>", "<br />");
+ html = tinyMCE.regexpReplace(html, "<p>\s*(<p>\s*)?", "<p>");
+ html = tinyMCE.regexpReplace(html, "<\/p>\s*(<\/p>\s*)?", "</p>");
+ }*/
+
+ // Always set the htmlText output
+ tinyMCE.setInnerHTML(doc.body, html);
+ }
+
+ tinyMCE.cleanupAnchors(doc);
+
+ if (tinyMCE.getParam("convert_fonts_to_spans"))
+ tinyMCE.convertSpansToFonts(doc);
+ },
+
+ getEditorId : function(form_element) {
+ var inst = this.getInstanceById(form_element);
+ if (!inst)
+ return null;
+
+ return inst.editorId;
+ },
+
+ getInstanceById : function(editor_id) {
+ var inst = this.instances[editor_id];
+ if (!inst) {
+ for (var n in tinyMCE.instances) {
+ var instance = tinyMCE.instances[n];
+ if (!tinyMCE.isInstance(instance))
+ continue;
+
+ if (instance.formTargetElementId == editor_id) {
+ inst = instance;
+ break;
+ }
+ }
+ }
+
+ return inst;
+ },
+
+ queryInstanceCommandValue : function(editor_id, command) {
+ var inst = tinyMCE.getInstanceById(editor_id);
+ if (inst)
+ return inst.queryCommandValue(command);
+
+ return false;
+ },
+
+ queryInstanceCommandState : function(editor_id, command) {
+ var inst = tinyMCE.getInstanceById(editor_id);
+ if (inst)
+ return inst.queryCommandState(command);
+
+ return null;
+ },
+
+ setWindowArg : function(n, v) {
+ this.windowArgs[n] = v;
+ },
+
+ getWindowArg : function(n, d) {
+ return (typeof(this.windowArgs[n]) == "undefined") ? d : this.windowArgs[n];
+ },
+
+ getCSSClasses : function(editor_id, doc) {
+ var output = new Array();
+
+ // Is cached, use that
+ if (typeof(tinyMCE.cssClasses) != "undefined")
+ return tinyMCE.cssClasses;
+
+ if (typeof(editor_id) == "undefined" && typeof(doc) == "undefined") {
+ var instance;
+
+ for (var instanceName in tinyMCE.instances) {
+ instance = tinyMCE.instances[instanceName];
+ if (!tinyMCE.isInstance(instance))
+ continue;
+
+ break;
+ }
+
+ doc = instance.getDoc();
+ }
+
+ if (typeof(doc) == "undefined") {
+ var instance = tinyMCE.getInstanceById(editor_id);
+ doc = instance.getDoc();
+ }
+
+ if (doc) {
+ var styles = doc.styleSheets;
+
+ if (styles && styles.length > 0) {
+ for (var x=0; x<styles.length; x++) {
+ var csses = null;
+
+ // Just ignore any errors
+ eval("try {var csses = tinyMCE.isMSIE ? doc.styleSheets(" + x + ").rules : styles[" + x + "].cssRules;} catch(e) {}");
+ if (!csses)
+ return new Array();
+
+ for (var i=0; i<csses.length; i++) {
+ var selectorText = csses[i].selectorText;
+
+ // Can be multiple rules per selector
+ if (selectorText) {
+ var rules = selectorText.split(',');
+ for (var c=0; c<rules.length; c++) {
+ var rule = rules[c];
+
+ // Strip spaces between selectors
+ while (rule.indexOf(' ') == 0)
+ rule = rule.substring(1);
+
+ // Invalid rule
+ 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;
+
+ // Is class rule
+ if (rule.indexOf('.') != -1) {
+ var cssClass = rule.substring(rule.indexOf('.') + 1);
+ var addClass = true;
+
+ for (var p=0; p<output.length && addClass; p++) {
+ if (output[p] == cssClass)
+ addClass = false;
+ }
+
+ if (addClass)
+ output[output.length] = cssClass;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Cache em
+ if (output.length > 0)
+ tinyMCE.cssClasses = output;
+
+ return output;
+ },
+
+ regexpReplace : function(in_str, reg_exp, replace_str, opts) {
+ if (in_str == null)
+ return in_str;
+
+ if (typeof(opts) == "undefined")
+ opts = 'g';
+
+ var re = new RegExp(reg_exp, opts);
+ return in_str.replace(re, replace_str);
+ },
+
+ trim : function(s) {
+ return s.replace(/^\s*|\s*$/g, "");
+ },
+
+ cleanupEventStr : function(s) {
+ s = "" + s;
+ s = s.replace('function anonymous()\n{\n', '');
+ s = s.replace('\n}', '');
+ s = s.replace(/^return true;/gi, ''); // Remove event blocker
+
+ return s;
+ },
+
+ getControlHTML : function(c) {
+ var i, l, n, o, v;
+
+ l = tinyMCE.plugins;
+ for (n in l) {
+ o = l[n];
+
+ if (o.getControlHTML && (v = o.getControlHTML(c)) != '')
+ return tinyMCE.replaceVar(v, "pluginurl", o.baseURL);
+ }
+
+ o = tinyMCE.themes[tinyMCE.settings['theme']];
+ if (o.getControlHTML && (v = o.getControlHTML(c)) != '')
+ return v;
+
+ return '';
+ },
+
+ evalFunc : function(f, idx, a) {
+ var s = '(', i;
+
+ for (i=idx; i<a.length; i++) {
+ s += 'a[' + i + ']';
+
+ if (i < a.length-1)
+ s += ',';
+ }
+
+ s += ');';
+
+ return eval("f" + s);
+ },
+
+ 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(typeof(l) == "function" ? l : eval(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(o[n], 3, a)) == s && m > 0)
+ return true;
+ }
+ }
+
+ l = tinyMCE.themes;
+ for (on in l) {
+ o = l[on];
+
+ if (o[n] && (v = tinyMCE.evalFunc(o[n], 3, a)) == s && m > 0)
+ return true;
+ }
+
+ return false;
+ },
+
+ xmlEncode : function(s) {
+ s = "" + s;
+ s = s.replace(/&/g, '&amp;');
+ s = s.replace(new RegExp('"', 'g'), '&quot;');
+ s = s.replace(/\'/g, '&#39;'); // &apos; is not working in MSIE
+ s = s.replace(/</g, '&lt;');
+ s = s.replace(/>/g, '&gt;');
+
+ return s;
+ },
+
+ extend : function(p, np) {
+ var o = {};
+
+ o.parent = p;
+
+ for (n in p)
+ o[n] = p[n];
+
+ for (n in np)
+ o[n] = np[n];
+
+ return o;
+ },
+
+ hideMenus : function() {
+ var e = tinyMCE.lastSelectedMenuBtn;
+
+ if (tinyMCE.lastMenu) {
+ tinyMCE.lastMenu.hide();
+ tinyMCE.lastMenu = null;
+ }
+
+ if (e) {
+ tinyMCE.switchClass(e, tinyMCE.lastMenuBtnClass);
+ tinyMCE.lastSelectedMenuBtn = null;
+ }
+ },
+
+ explode : function(d, s) {
+ var ar = s.split(d), oar = new Array(), i;
+
+ for (i = 0; i<ar.length; i++) {
+ if (ar[i] != "")
+ oar[oar.length] = ar[i];
+ }
+
+ return oar;
+ }
+};
+
+// Global instances
+var TinyMCE = TinyMCE_Engine; // Compatiblity with gzip compressors
+var tinyMCE = new TinyMCE_Engine();
+var tinyMCELang = {};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Control.class.js */
+
+function TinyMCE_Control(settings) {
+ var t, i, to, fu, p, x, fn, fu, pn, s = settings;
+
+ this.undoRedoLevel = true;
+ this.isTinyMCE_Control = true;
+
+ // Default settings
+ this.settings = s;
+ this.settings['theme'] = tinyMCE.getParam("theme", "default");
+ this.settings['width'] = tinyMCE.getParam("width", -1);
+ this.settings['height'] = tinyMCE.getParam("height", -1);
+ this.selection = new TinyMCE_Selection(this);
+ this.undoRedo = new TinyMCE_UndoRedo(this);
+ this.cleanup = new TinyMCE_Cleanup();
+ this.shortcuts = new Array();
+ this.hasMouseMoved = false;
+
+ this.cleanup.init({
+ valid_elements : s.valid_elements,
+ extended_valid_elements : s.extended_valid_elements,
+ entities : s.entities,
+ entity_encoding : s.entity_encoding,
+ debug : s.cleanup_debug,
+ url_converter : 'TinyMCE_Cleanup.prototype._urlConverter',
+ indent : s.apply_source_formatting,
+ invalid_elements : s.invalid_elements,
+ verify_html : s.verify_html,
+ fix_content_duplication : s.fix_content_duplication
+ });
+
+ // Wrap old theme
+ t = this.settings['theme'];
+ if (!tinyMCE.hasTheme(t)) {
+ fn = tinyMCE.callbacks;
+ to = {};
+
+ for (i=0; i<fn.length; i++) {
+ if ((fu = window['TinyMCE_' + t + "_" + fn[i]]))
+ to[fn[i]] = fu;
+ }
+
+ tinyMCE.addTheme(t, to);
+ }
+
+ // Wrap old plugins
+ this.plugins = new Array();
+ 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;
+ to = {};
+
+ for (x=0; x<fn.length; x++) {
+ if ((fu = window['TinyMCE_' + pn + "_" + fn[x]]))
+ to[fn[x]] = fu;
+ }
+
+ tinyMCE.addPlugin(pn, to);
+ }
+
+ this.plugins[this.plugins.length] = pn;
+ }
+ }
+};
+
+TinyMCE_Control.prototype = {
+ 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() {
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ return;
+
+ try {
+ var s = this.selection;
+ var 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) {
+ // Ignore
+ }
+ },
+
+ switchSettings : function() {
+ if (tinyMCE.configs.length > 1 && tinyMCE.currentConfig != this.settings['index']) {
+ tinyMCE.settings = this.settings;
+ tinyMCE.currentConfig = this.settings['index'];
+ }
+ },
+
+ getBody : function() {
+ return this.getDoc().body;
+ },
+
+ getDoc : function() {
+ return this.contentWindow.document;
+ },
+
+ getWin : function() {
+ return this.contentWindow;
+ },
+
+ addShortcut : function(m, k, d, cmd, ui, va) {
+ var n = typeof(k) == "number", ie = tinyMCE.isMSIE, c, sc, i;
+ var 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 = this.shortcuts, o;
+
+ 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() {
+ // Add fix for tab/style.display none/block problems in Gecko
+ if (!tinyMCE.isMSIE && this.isHidden() && tinyMCE.getParam('auto_reset_designmode'))
+ eval('try { this.getDoc().designMode = "On"; } catch(e) {}');
+ },
+
+ isHidden : function() {
+ if (tinyMCE.isMSIE)
+ return false;
+
+ var s = this.getSel();
+
+ // Weird, wheres that cursor selection?
+ return (!s || !s.rangeCount || s.rangeCount == 0);
+ },
+
+ isDirty : function() {
+ // Is content modified and not in a submit procedure
+ return this.startContent != tinyMCE.trim(this.getBody().innerHTML) && !tinyMCE.isNotDirty;
+ },
+
+ _mergeElements : function(scmd, pa, ch, override) {
+ if (scmd == "removeformat") {
+ pa.className = "";
+ pa.style.cssText = "";
+ ch.className = "";
+ ch.style.cssText = "";
+ return;
+ }
+
+ var st = tinyMCE.parseStyle(tinyMCE.getAttrib(pa, "style"));
+ var stc = tinyMCE.parseStyle(tinyMCE.getAttrib(ch, "style"));
+ var className = tinyMCE.getAttrib(pa, "class");
+
+ className += " " + tinyMCE.getAttrib(ch, "class");
+
+ if (override) {
+ for (var n in st) {
+ if (typeof(st[n]) == 'function')
+ continue;
+
+ stc[n] = st[n];
+ }
+ } else {
+ for (var 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");
+ },
+
+ _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 doc = this.getDoc();
+ var win = this.getWin();
+ var focusElm = this.getFocusElement();
+
+ // Is non udno specific command
+ if (!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel', 'gi').test(command))
+ this.undoBookmark = null;
+
+ if (this.lastSafariSelection && !new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel', 'gi').test(command)) {
+ this.selection.moveToBookmark(this.lastSafariSelection);
+ tinyMCE.selectedElement = this.lastSafariSelectedElement;
+ }
+
+ // Mozilla issue
+ if (!tinyMCE.isMSIE && !this.useCSS) {
+ this._setUseCSS(false);
+ this.useCSS = true;
+ }
+
+ //debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);
+ this.contentDocument = doc; // <-- Strange, unless this is applied Mozilla 1.3 breaks
+
+ if (tinyMCE.execCommandCallback(this, 'execcommand_callback', 'execCommand', this.editorId, this.getBody(), command, user_interface, value))
+ return;
+
+ // Fix align on images
+ if (focusElm && focusElm.nodeName == "IMG") {
+ var align = focusElm.getAttribute('align');
+ var img = command == "JustifyCenter" ? focusElm.cloneNode(false) : focusElm;
+
+ switch (command) {
+ case "JustifyLeft":
+ if (align == 'left')
+ img.removeAttribute('align');
+ else
+ img.setAttribute('align', 'left');
+
+ // Remove the div
+ var 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');
+
+ // Is centered
+ var div = tinyMCE.getParentElement(focusElm, "div");
+ if (div && div.style.textAlign == "center") {
+ // Remove div
+ if (div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)
+ div.parentNode.replaceChild(img, div);
+ } else {
+ // Add div
+ var 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');
+
+ // Remove the div
+ var 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 "InsertUnorderedList":
+ case "InsertOrderedList":
+ var tag = (command == "InsertUnorderedList") ? "ul" : "ol";
+
+ if (tinyMCE.isSafari)
+ this.execCommand("mceInsertContent", false, "<" + tag + "><li>&nbsp;</li><" + tag + ">");
+ else
+ this.getDoc().execCommand(command, user_interface, value);
+
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case "Strikethrough":
+ if (tinyMCE.isSafari)
+ this.execCommand("mceInsertContent", false, "<strike>" + this.selection.getSelectedHTML() + "</strike>");
+ else
+ this.getDoc().execCommand(command, user_interface, value);
+
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case "mceSelectNode":
+ this.selection.selectNode(value);
+ tinyMCE.triggerNodeChange();
+ tinyMCE.selectedNode = value;
+ break;
+
+ case "FormatBlock":
+ if (value == null || value == "") {
+ var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");
+
+ if (elm)
+ this.execCommand("mceRemoveNode", false, elm);
+ } else {
+ if (tinyMCE.isGecko && new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>', 'gi').test(value))
+ value = value.replace(/[^a-z]/gi, '');
+
+ if (tinyMCE.isMSIE && 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.isMSIE) {
+ value.outerHTML = value.innerHTML;
+ } else {
+ var rng = value.ownerDocument.createRange();
+ rng.setStartBefore(value);
+ rng.setEndAfter(value);
+ rng.deleteContents();
+ rng.insertNode(rng.createContextualFragment(value.innerHTML));
+ }
+
+ tinyMCE.triggerNodeChange();
+
+ break;
+
+ case "mceSelectNodeDepth":
+ var parentNode = this.getFocusElement();
+ for (var i=0; parentNode; i++) {
+ if (parentNode.nodeName.toLowerCase() == "body")
+ break;
+
+ if (parentNode.nodeName.toLowerCase() == "#text") {
+ i--;
+ parentNode = parentNode.parentNode;
+ continue;
+ }
+
+ if (i == value) {
+ this.selection.selectNode(parentNode, false);
+ tinyMCE.triggerNodeChange();
+ tinyMCE.selectedNode = parentNode;
+ return;
+ }
+
+ parentNode = parentNode.parentNode;
+ }
+
+ break;
+
+ case "SetStyleInfo":
+ var rng = this.getRng();
+ var sel = this.getSel();
+ var scmd = value['command'];
+ var sname = value['name'];
+ var svalue = value['value'] == null ? '' : value['value'];
+ //var svalue = value['value'] == null ? '' : value['value'];
+ var wrapper = value['wrapper'] ? value['wrapper'] : "span";
+ var parentElm = null;
+ var invalidRe = new RegExp("^BODY|HTML$", "g");
+ var invalidParentsRe = tinyMCE.settings['merge_styles_invalid_parents'] != '' ? new RegExp(tinyMCE.settings['merge_styles_invalid_parents'], "gi") : null;
+
+ // Whole element selected check
+ if (tinyMCE.isMSIE) {
+ // Control range
+ if (rng.item)
+ parentElm = rng.item(0);
+ else {
+ var pelm = rng.parentElement();
+ var prng = doc.selection.createRange();
+ prng.moveToElementText(pelm);
+
+ if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) {
+ if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName))
+ parentElm = pelm;
+ }
+ }
+ } else {
+ var felm = this.getFocusElement();
+ if (sel.isCollapsed || (new RegExp('td|tr|tbody|table', 'gi').test(felm.nodeName) && sel.anchorNode == felm.parentNode))
+ parentElm = felm;
+ }
+
+ // Whole element selected
+ if (parentElm && !invalidRe.test(parentElm.nodeName)) {
+ if (scmd == "setstyle")
+ tinyMCE.setStyleAttrib(parentElm, sname, svalue);
+
+ if (scmd == "setattrib")
+ tinyMCE.setAttrib(parentElm, sname, svalue);
+
+ if (scmd == "removeformat") {
+ parentElm.style.cssText = '';
+ tinyMCE.setAttrib(parentElm, 'class', '');
+ }
+
+ // Remove style/attribs from all children
+ var ch = tinyMCE.getNodeTree(parentElm, new Array(), 1);
+ for (var z=0; z<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); // Bug in FF when running in fullscreen
+ doc.execCommand("FontName", false, "#mce_temp_font#");
+ var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#");
+
+ // Change them all
+ for (var 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 (var i=0; i<elm.childNodes.length; i++)
+ spanElm.appendChild(elm.childNodes[i].cloneNode(true));
+ }
+
+ spanElm.setAttribute("mce_new", "true");
+ elm.parentNode.replaceChild(spanElm, elm);
+
+ // Remove style/attribs from all children
+ var ch = tinyMCE.getNodeTree(spanElm, new Array(), 1);
+ for (var 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', '');
+ }
+ }
+ }
+ }
+ }
+
+ // Cleaup wrappers
+ var nodes = doc.getElementsByTagName(wrapper);
+ for (var i=nodes.length-1; i>=0; i--) {
+ var elm = nodes[i];
+ var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true";
+
+ elm.removeAttribute("mce_new");
+
+ // Is only child a element
+ if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {
+ //tinyMCE.debug("merge1" + isNew);
+ this._mergeElements(scmd, elm, elm.childNodes[0], isNew);
+ continue;
+ }
+
+ // Is I the only child
+ if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {
+ //tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);
+ if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))
+ this._mergeElements(scmd, elm.parentNode, elm, false);
+ }
+ }
+
+ // Remove empty wrappers
+ var nodes = doc.getElementsByTagName(wrapper);
+ for (var i=nodes.length-1; i>=0; i--) {
+ var elm = nodes[i];
+ var isEmpty = true;
+
+ // Check if it has any attribs
+ var tmp = doc.createElement("body");
+ tmp.appendChild(elm.cloneNode(false));
+
+ // Is empty span, remove it
+ tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), '');
+ //tinyMCE.debug(tmp.innerHTML);
+ if (new RegExp('<span>', 'gi').test(tmp.innerHTML)) {
+ for (var x=0; x<elm.childNodes.length; x++) {
+ if (elm.parentNode != null)
+ elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true), elm);
+ }
+
+ elm.parentNode.removeChild(elm);
+ }
+ }
+
+ // Re add the visual aids
+ if (scmd == "removeformat")
+ tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
+
+ tinyMCE.triggerNodeChange();
+
+ break;
+
+ case "FontName":
+ if (value == null) {
+ var s = this.getSel();
+
+ // Find font and select it
+ if (tinyMCE.isGecko && s.isCollapsed) {
+ var f = tinyMCE.getParentElement(this.getFocusElement(), "font");
+
+ if (f != null)
+ this.selection.selectNode(f, false);
+ }
+
+ // Remove format
+ this.getDoc().execCommand("RemoveFormat", false, null);
+
+ // Collapse range if font was found
+ 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":
+ this.getDoc().execCommand('forecolor', false, value);
+ break;
+
+ case "HiliteColor":
+ 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;
+
+ // Try executing command
+ 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.');
+
+ // Alert error in gecko if command failed
+ if (tinyMCE.isGecko && cmdFailed) {
+ // Confirm more info
+ 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 = "";
+
+ // Call custom cleanup code
+ value = tinyMCE.storeAwayURLs(value);
+ value = tinyMCE._customCleanup(this, "insert_to_editor", value);
+ tinyMCE._setHTML(doc, value);
+ tinyMCE.setInnerHTML(doc.body, tinyMCE._cleanupHTML(this, doc, tinyMCE.settings, doc.body));
+ tinyMCE.convertAllRelativeURLs(doc.body);
+
+ // Cleanup any mess left from storyAwayURLs
+ tinyMCE._removeInternal(this.getBody());
+
+ // When editing always use fonts internaly
+ if (tinyMCE.getParam("convert_fonts_to_spans"))
+ tinyMCE.convertSpansToFonts(doc);
+
+ tinyMCE.handleVisualAid(doc.body, true, this.visualAid, this);
+ tinyMCE._setEventsEnabled(doc.body, false);
+ 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);
+
+ // When editing always use fonts internaly
+ if (tinyMCE.getParam("convert_fonts_to_spans"))
+ tinyMCE.convertSpansToFonts(doc);
+
+ tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
+ tinyMCE._setEventsEnabled(this.getBody(), false);
+ this.repaint();
+ this.selection.moveToBookmark(b);
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case "mceReplaceContent":
+ // Force empty string
+ if (!value)
+ value = '';
+
+ this.getWin().focus();
+
+ var selectedText = "";
+
+ if (tinyMCE.isMSIE) {
+ 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);
+ }
+
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case "mceSetAttribute":
+ if (typeof(value) == 'object') {
+ var targetElms = (typeof(value['targets']) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value['targets'];
+ var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms);
+
+ if (targetNode) {
+ targetNode.setAttribute(value['name'], value['value']);
+ tinyMCE.triggerNodeChange();
+ }
+ }
+ break;
+
+ case "mceSetCSSClass":
+ this.execCommand("SetStyleInfo", false, {command : "setattrib", name : "class", value : value});
+ break;
+
+ case "mceInsertRawHTML":
+ var key = 'tiny_mce_marker';
+
+ this.execCommand('mceBeginUndoLevel');
+
+ // Insert marker key
+ this.execCommand('mceInsertContent', false, key);
+
+ // Store away scroll pos
+ var scrollX = this.getDoc().body.scrollLeft + this.getDoc().documentElement.scrollLeft;
+ var scrollY = this.getDoc().body.scrollTop + this.getDoc().documentElement.scrollTop;
+
+ // Find marker and replace with RAW HTML
+ var html = this.getBody().innerHTML;
+ if ((pos = html.indexOf(key)) != -1)
+ tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length));
+
+ // Restore scoll pos
+ this.contentWindow.scrollTo(scrollX, scrollY);
+
+ this.execCommand('mceEndUndoLevel');
+
+ break;
+
+ case "mceInsertContent":
+ // Force empty string
+ if (!value)
+ value = '';
+
+ var insertHTMLFailed = false;
+ this.getWin().focus();
+
+ if (tinyMCE.isGecko || tinyMCE.isOpera) {
+ try {
+ // Is plain text or HTML, &amp;, &nbsp; etc will be encoded wrong in FF
+ 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();
+
+ // Insert text at cursor position
+ s.removeAllRanges();
+ r.deleteContents();
+ r.insertNode(n);
+
+ // Move the cursor to the end of text
+ r2.selectNode(n);
+ r2.collapse(false);
+ s.removeAllRanges();
+ s.addRange(r2);
+ } else {
+ value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value);
+ this.getDoc().execCommand('inserthtml', false, value);
+ tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);
+ }
+ } catch (ex) {
+ insertHTMLFailed = true;
+ }
+
+ if (!insertHTMLFailed) {
+ tinyMCE.triggerNodeChange();
+ return;
+ }
+ }
+
+ // Ugly hack in Opera due to non working "inserthtml"
+ if (tinyMCE.isOpera && insertHTMLFailed) {
+ this.getDoc().execCommand("insertimage", false, tinyMCE.uniqueURL);
+ var ar = tinyMCE.getElementsByAttributeValue(this.getBody(), "img", "src", tinyMCE.uniqueURL);
+ ar[0].outerHTML = value;
+ return;
+ }
+
+ if (!tinyMCE.isMSIE) {
+ var isHTML = value.indexOf('<') != -1;
+ var sel = this.getSel();
+ var rng = this.getRng();
+
+ if (isHTML) {
+ if (tinyMCE.isSafari) {
+ var tmpRng = this.getDoc().createRange();
+
+ tmpRng.setStart(this.getBody(), 0);
+ tmpRng.setEnd(this.getBody(), 0);
+
+ value = tmpRng.createContextualFragment(value);
+ } else
+ value = rng.createContextualFragment(value);
+ } else {
+ // Setup text node
+ var el = document.createElement("div");
+ el.innerHTML = value;
+ value = el.firstChild.nodeValue;
+ value = doc.createTextNode(value);
+ }
+
+ // Insert plain text in Safari
+ if (tinyMCE.isSafari && !isHTML) {
+ this.execCommand('InsertText', false, value.nodeValue);
+ tinyMCE.triggerNodeChange();
+ return true;
+ } else if (tinyMCE.isSafari && isHTML) {
+ rng.deleteContents();
+ rng.insertNode(value);
+ tinyMCE.triggerNodeChange();
+ return true;
+ }
+
+ rng.deleteContents();
+
+ // If target node is text do special treatment, (Mozilla 1.3 fix)
+ if (rng.startContainer.nodeType == 3) {
+ var node = rng.startContainer.splitText(rng.startOffset);
+ node.parentNode.insertBefore(value, node);
+ } else
+ rng.insertNode(value);
+
+ if (!isHTML) {
+ // Removes weird selection trails
+ sel.selectAllChildren(doc.body);
+ sel.removeAllRanges();
+
+ // Move cursor to end of content
+ var rng = doc.createRange();
+
+ rng.selectNode(value);
+ rng.collapse(false);
+
+ sel.addRange(rng);
+ } else
+ rng.collapse(false);
+
+ tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);
+ } else {
+ var rng = doc.selection.createRange();
+ var c = value.indexOf('<!--') != -1;
+
+ // Fix comment bug, add tag before comments
+ if (c)
+ value = tinyMCE.uniqueTag + value;
+
+ if (rng.item)
+ rng.item(0).outerHTML = value;
+ else
+ rng.pasteHTML(value);
+
+ // Remove unique tag
+ if (c) {
+ var e = this.getDoc().getElementById('mceTMPElement');
+ e.parentNode.removeChild(e);
+ }
+ }
+
+ tinyMCE.triggerNodeChange();
+ break;
+
+ case "mceStartTyping":
+ if (tinyMCE.settings['custom_undo_redo'] && this.undoRedo.typingUndoIndex == -1) {
+ this.undoRedo.typingUndoIndex = this.undoRedo.undoIndex;
+ this.execCommand('mceAddUndoLevel');
+ //tinyMCE.debug("mceStartTyping");
+ }
+ break;
+
+ case "mceEndTyping":
+ if (tinyMCE.settings['custom_undo_redo'] && this.undoRedo.typingUndoIndex != -1) {
+ this.execCommand('mceAddUndoLevel');
+ this.undoRedo.typingUndoIndex = -1;
+ //tinyMCE.debug("mceEndTyping");
+ }
+ 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.isMSIE) {
+ 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":
+ var text = this.selection.getSelectedText();
+
+ if (tinyMCE.isOpera) {
+ this.getDoc().execCommand("RemoveFormat", false, null);
+ return;
+ }
+
+ if (tinyMCE.isMSIE) {
+ try {
+ var rng = doc.selection.createRange();
+ rng.execCommand("RemoveFormat", false, null);
+ } catch (e) {
+ // Do nothing
+ }
+
+ this.execCommand("SetStyleInfo", false, {command : "removeformat"});
+ } else {
+ this.getDoc().execCommand(command, user_interface, value);
+
+ this.execCommand("SetStyleInfo", false, {command : "removeformat"});
+ }
+
+ // Remove class
+ 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();
+ }
+
+ // Add undo level after modification
+ 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);
+ },
+
+ _onAdd : function(replace_element, form_element_name, target_document) {
+ var hc, th, to, editorTemplate;
+
+ th = this.settings['theme'];
+ to = tinyMCE.themes[th];
+
+ var 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 (to.getEditorTemplate)
+ editorTemplate = to.getEditorTemplate(this.settings, this.editorId);
+
+ var deltaWidth = editorTemplate['delta_width'] ? editorTemplate['delta_width'] : 0;
+ var deltaHeight = editorTemplate['delta_height'] ? editorTemplate['delta_height'] : 0;
+ var html = '<span id="' + this.editorId + '_parent" class="mceEditorContainer">' + editorTemplate['html'];
+
+ html = tinyMCE.replaceVar(html, "editor_id", this.editorId);
+ this.settings['default_document'] = tinyMCE.baseURL + "/blank.htm";
+
+ this.settings['old_width'] = this.settings['width'];
+ this.settings['old_height'] = this.settings['height'];
+
+ // Set default width, height
+ if (this.settings['width'] == -1)
+ this.settings['width'] = replace_element.offsetWidth;
+
+ if (this.settings['height'] == -1)
+ this.settings['height'] = replace_element.offsetHeight;
+
+ // Try the style width
+ if (this.settings['width'] == 0)
+ this.settings['width'] = replace_element.style.width;
+
+ // Try the style height
+ if (this.settings['height'] == 0)
+ this.settings['height'] = replace_element.style.height;
+
+ // If no width/height then default to 320x240, better than nothing
+ 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;
+
+ // Special % handling
+ if (("" + this.settings['width']).indexOf('%') != -1)
+ this.settings['area_width'] = "100%";
+
+ if (("" + this.settings['height']).indexOf('%') != -1)
+ this.settings['area_height'] = "100%";
+
+ if (("" + replace_element.style.width).indexOf('%') != -1) {
+ this.settings['width'] = replace_element.style.width;
+ this.settings['area_width'] = "100%";
+ }
+
+ if (("" + replace_element.style.height).indexOf('%') != -1) {
+ this.settings['height'] = replace_element.style.height;
+ this.settings['area_height'] = "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;
+
+ // Get replace_element contents
+ if (replace_element.nodeName == "TEXTAREA" || replace_element.nodeName == "INPUT")
+ this.startContent = replace_element.value;
+ else
+ this.startContent = replace_element.innerHTML;
+
+ // If not text area or input
+ if (replace_element.nodeName != "TEXTAREA" && replace_element.nodeName != "INPUT") {
+ this.oldTargetElement = replace_element;
+
+ // Debug mode
+ if (tinyMCE.settings['debug']) {
+ hc = '<textarea wrap="off" id="' + form_element_name + '" name="' + form_element_name + '" cols="100" rows="15"></textarea>';
+ } else {
+ hc = '<input type="hidden" id="' + form_element_name + '" name="' + form_element_name + '" />';
+ this.oldTargetElement.style.display = "none";
+ }
+
+ html += '</span>';
+
+ if (tinyMCE.isGecko)
+ html = hc + html;
+ else
+ html += hc;
+
+ // Output HTML and set editable
+ if (tinyMCE.isGecko) {
+ var rng = replace_element.ownerDocument.createRange();
+ rng.setStartBefore(replace_element);
+
+ var fragment = rng.createContextualFragment(html);
+ tinyMCE.insertAfter(fragment, replace_element);
+ } else
+ replace_element.insertAdjacentHTML("beforeBegin", html);
+ } else {
+ html += '</span>';
+
+ // Just hide the textarea element
+ this.oldTargetElement = replace_element;
+
+ if (!tinyMCE.settings['debug'])
+ this.oldTargetElement.style.display = "none";
+
+ // Output HTML and set editable
+ if (tinyMCE.isGecko) {
+ var rng = replace_element.ownerDocument.createRange();
+ rng.setStartBefore(replace_element);
+
+ var fragment = rng.createContextualFragment(html);
+ tinyMCE.insertAfter(fragment, replace_element);
+ } else
+ replace_element.insertAdjacentHTML("beforeBegin", html);
+ }
+
+ // Setup iframe
+ var dynamicIFrame = false;
+ var tElm = targetDoc.getElementById(this.editorId);
+
+ if (!tinyMCE.isMSIE) {
+ // Node case is preserved in XML strict mode
+ 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;
+
+ //this.getDoc().designMode = "on";
+ } 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";
+ }
+
+ // Setup base HTML
+ var doc = this.contentDocument;
+ if (dynamicIFrame) {
+ var 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) {
+ // Failed Mozilla 1.3
+ this.getDoc().location.href = tinyMCE.baseURL + "/blank.htm";
+ }
+ }
+
+ // This timeout is needed in MSIE 5.5 for some odd reason
+ // it seems that the document.frames isn't initialized yet?
+ if (tinyMCE.isMSIE)
+ window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\"" + this.editorId + "\"]);", 1);
+
+ 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);
+ }
+ },
+
+ 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 = new Array(), i, s;
+
+ this.switchSettings();
+ s = tinyMCE.settings;
+
+ // Force hidden tabs visible while serializing
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+ 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;
+
+ // Default to false
+ if (typeof(skip_cleanup) == "undefined")
+ skip_cleanup = false;
+
+ // Default to false
+ if (typeof(skip_callback) == "undefined")
+ skip_callback = false;
+
+ tinyMCE._setHTML(this.getDoc(), this.getBody().innerHTML);
+
+ // Remove visual aids when cleanup is disabled
+ 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);
+ var 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'] != "")
+ var content = eval(tinyMCE.settings['save_callback'] + "(this.formTargetElementId,htm,this.getBody());");
+
+ // Use callback content if available
+ if ((typeof(content) != "undefined") && content != null)
+ htm = content;
+
+ // Replace some weird entities (Bug: #1056343)
+ 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;
+
+ // Hide them again (tabs in MSIE)
+ 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;
+ }
+ }
+};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Cleanup.class.js */
+
+TinyMCE_Engine.prototype.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>');
+
+ // Fix close BR elements
+ s = s.replace(new RegExp('<br>\\s*<\\/br>', 'gi'), '<br />');
+
+ // Open closed tags like <b/> to <b></b>
+ 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>');
+
+ // Remove trailing space <b > to <b>
+ s = s.replace(new RegExp('\\s+></', 'gi'), '></');
+
+ // Close tags <img></img> to <img/>
+ s = s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>', 'gi'), '<$1$2 />');
+
+ // Weird MSIE bug, <p><hr /></p> breaks runtime?
+ if (tinyMCE.isMSIE)
+ s = s.replace(new RegExp('<p><hr \\/><\\/p>', 'gi'), "<hr>");
+
+ // Convert relative anchors to absolute URLs ex: #something to file.htm#something
+ if (tinyMCE.getParam('convert_urls'))
+ s = s.replace(new RegExp('(href=\"{0,1})(\\s*#)', 'gi'), '$1' + tinyMCE.settings['document_base_url'] + "#");
+
+ return s;
+};
+
+TinyMCE_Engine.prototype.parseStyle = function(str) {
+ var ar = new Array();
+
+ if (str == null)
+ return ar;
+
+ var st = str.split(';');
+
+ tinyMCE.clearArray(ar);
+
+ for (var i=0; i<st.length; i++) {
+ if (st[i] == '')
+ continue;
+
+ var re = new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');
+ var pa = st[i].replace(re, '$1||$2').split('||');
+//tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));
+ if (pa.length == 2)
+ ar[pa[0].toLowerCase()] = pa[1];
+ }
+
+ return ar;
+};
+
+TinyMCE_Engine.prototype.compressStyle = function(ar, pr, sf, res) {
+ var box = new Array();
+
+ 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 (var i=0; i<box.length; i++) {
+ if (box[i] == null)
+ return;
+
+ for (var a=0; a<box.length; a++) {
+ if (box[a] != box[i])
+ return;
+ }
+ }
+
+ // They are all the same
+ ar[res] = box[0];
+ ar[pr + '-top' + sf] = null;
+ ar[pr + '-left' + sf] = null;
+ ar[pr + '-right' + sf] = null;
+ ar[pr + '-bottom' + sf] = null;
+};
+
+TinyMCE_Engine.prototype.serializeStyle = function(ar) {
+ var str = "";
+
+ // Compress box
+ 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 (var key in ar) {
+ var val = ar[key];
+
+ if (typeof(val) == 'function')
+ continue;
+
+ if (key.indexOf('mso-') == 0)
+ continue;
+
+ if (val != null && val != '') {
+ val = '' + val; // Force string
+
+ // Fix style URL
+ val = val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)", 'gi'), "url('$1')");
+
+ // Convert URL
+ if (val.indexOf('url(') != -1 && tinyMCE.getParam('convert_urls')) {
+ var m = new RegExp("url\\('(.*?)'\\)").exec(val);
+
+ if (m.length > 1)
+ val = "url('" + eval(tinyMCE.getParam('urlconverter_callback') + "(m[1], null, true);") + "')";
+ }
+
+ // Force HEX colors
+ if (tinyMCE.getParam("force_hex_style_colors"))
+ val = tinyMCE.convertRGBToHex(val, true);
+
+ if (val != "url('')")
+ str += key.toLowerCase() + ": " + val + "; ";
+ }
+ }
+
+ if (new RegExp('; $').test(str))
+ str = str.substring(0, str.length - 2);
+
+ return str;
+};
+
+TinyMCE_Engine.prototype.convertRGBToHex = function(s, k) {
+ if (s.toLowerCase().indexOf('rgb') != -1) {
+ var re = new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)", "gi");
+ var 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;
+};
+
+TinyMCE_Engine.prototype.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;
+};
+
+TinyMCE_Engine.prototype.convertSpansToFonts = function(doc) {
+ var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');
+
+ var h = doc.body.innerHTML;
+ h = h.replace(/<span/gi, '<font');
+ h = h.replace(/<\/span/gi, '</font');
+ doc.body.innerHTML = h;
+
+ var s = doc.getElementsByTagName("font");
+ for (var i=0; i<s.length; i++) {
+ var size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();
+ var fSize = 0;
+
+ for (var 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 = '';
+ }
+
+ var fFace = s[i].style.fontFamily;
+ if (fFace != null && fFace != "") {
+ tinyMCE.setAttrib(s[i], 'face', fFace);
+ s[i].style.fontFamily = '';
+ }
+
+ var fColor = s[i].style.color;
+ if (fColor != null && fColor != "") {
+ tinyMCE.setAttrib(s[i], 'color', tinyMCE.convertRGBToHex(fColor));
+ s[i].style.color = '';
+ }
+ }
+};
+
+TinyMCE_Engine.prototype.convertFontsToSpans = function(doc) {
+ var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');
+
+ var h = doc.body.innerHTML;
+ h = h.replace(/<font/gi, '<span');
+ h = h.replace(/<\/font/gi, '</span');
+ doc.body.innerHTML = h;
+
+ var fsClasses = tinyMCE.getParam('font_size_classes');
+ if (fsClasses != '')
+ fsClasses = fsClasses.replace(/\s+/, '').split(',');
+ else
+ fsClasses = null;
+
+ var s = doc.getElementsByTagName("span");
+ for (var i=0; i<s.length; i++) {
+ var fSize, fFace, fColor;
+
+ 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');
+ }
+ }
+};
+
+TinyMCE_Engine.prototype.cleanupAnchors = function(doc) {
+ var i, cn, x, an = doc.getElementsByTagName("a");
+
+ // Loops backwards due to bug #1467987
+ 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]);
+ }
+ }
+};
+
+TinyMCE_Engine.prototype.getContent = function(editor_id) {
+ var h;
+
+ if (typeof(editor_id) != "undefined")
+ tinyMCE.selectedInstance = tinyMCE.getInstanceById(editor_id);
+
+ if (tinyMCE.selectedInstance) {
+ h = tinyMCE._cleanupHTML(this.selectedInstance, this.selectedInstance.getDoc(), tinyMCE.settings, this.selectedInstance.getBody(), false, true);
+
+ // When editing always use fonts internaly
+ if (tinyMCE.getParam("convert_fonts_to_spans"))
+ tinyMCE.convertSpansToFonts(this.selectedInstance.getDoc());
+
+ return h;
+ }
+
+ return null;
+};
+
+TinyMCE_Engine.prototype._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);
+ }
+ }
+ }
+};
+
+TinyMCE_Engine.prototype._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,div,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);
+ }
+ }
+};
+
+TinyMCE_Engine.prototype._cleanupHTML = function(inst, doc, config, elm, visual, on_save, on_submit) {
+ var h, d, t1, t2, t3, t4, t5, c, s;
+
+ 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();
+
+ 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);
+
+ // Call custom cleanup code
+ 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;
+ //for (var i=0; i<100; i++)
+
+ c.idCount = 0;
+ c.serializationId++;
+ c.serializedNodes = new Array();
+ c.sourceIndex = -1;
+
+ if (s.cleanup_serializer == "xml")
+ h = c.serializeNodeAsXML(elm);
+ else
+ h = c.serializeNodeAsHTML(elm);
+
+ if (d)
+ t3 = new Date().getTime();
+
+ // Post processing
+ 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>&nbsp;</td>');
+ h = h.replace(/<p>\s*<br \/>\s*<\/p>/g, '<p>&nbsp;</p>');
+ h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g, '<p>&nbsp;</p>');
+ h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g, '<p>&nbsp;</p>');
+ h = h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g, '<p>&nbsp;</p>');
+ h = h.replace(new RegExp('<a>(.*?)<\\/a>', 'g'), '$1');
+ h = h.replace(/<p([^>]*)>\s*<\/p>/g, '<p$1>&nbsp;</p>');
+
+ // Clean body
+ if (/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))
+ h = '';
+
+ // If preformatted
+ if (s.preformatted) {
+ h = h.replace(/^<pre>/, '');
+ h = h.replace(/<\/pre>$/, '');
+ h = '<pre>' + h + '</pre>';
+ }
+
+ // Gecko specific processing
+ if (tinyMCE.isGecko) {
+ h = h.replace(/<o:p _moz-userdefined="" \/>/g, '');
+ h = h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g, '<td$1>&nbsp;</td>');
+ }
+
+ if (s.force_br_newlines)
+ h = h.replace(/<p>(&nbsp;|&#160;)<\/p>/g, '<br />');
+
+ // Call custom cleanup code
+ h = tinyMCE._customCleanup(inst, on_save ? "get_from_editor" : "insert_to_editor", h);
+
+ // Remove internal classes
+ 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 encoding (not recommended option)
+ 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.isMSIE = (navigator.appName == "Microsoft Internet Explorer");
+ this.rules = tinyMCE.clearArray(new Array());
+
+ // Default config
+ 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(new Array());
+ this.vElementsRe = '';
+ this.closeElementsRe = /^(IMG|BR|HR|LINK|META|BASE|INPUT|BUTTON|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];
+
+ // Setup code formating
+ s = this.settings;
+
+ // Setup regexps
+ 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', '<(\\/?)(', ')([^>]*)>');
+
+ if (s.invalid_elements != '')
+ this.iveRe = this._arrayToRe(s.invalid_elements.toUpperCase().split(','), 'g', '^(', ')$');
+ else
+ this.iveRe = null;
+
+ // Setup separator
+ st = '';
+ for (i=0; i<s.indent_levels; i++)
+ st += s.indent_char;
+
+ this.inStr = st;
+
+ // If verify_html if false force *[*]
+ if (!s.verify_html) {
+ s.valid_elements = '*[*]';
+ s.extended_valid_elements = '';
+ }
+
+ this.fillStr = s.entity_encoding == "named" ? "&nbsp;" : "&#160;";
+ this.idCount = 0;
+ },
+
+ addRuleStr : function(s) {
+ var r = this.parseRuleStr(s);
+ var n;
+
+ for (n in r) {
+ if (r[n])
+ this.rules[n] = r[n];
+ }
+
+ this.vElements = tinyMCE.clearArray(new Array());
+
+ for (n in this.rules) {
+ if (this.rules[n])
+ this.vElements[this.vElements.length] = this.rules[n].tag;
+ }
+
+ this.vElementsRe = this._arrayToRe(this.vElements, '');
+ },
+
+ parseRuleStr : function(s) {
+ var ta, p, r, a, i, x, px, t, tn, y, av, or = tinyMCE.clearArray(new Array()), 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;
+
+ // Split tag/attrs
+ p = this.split(/\[|\]/, s);
+ if (p == null || p.length < 1)
+ t = s.toUpperCase();
+ else
+ t = p[0].toUpperCase();
+
+ // Handle all tag names
+ 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;
+
+ // Handle prefixes
+ 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 + '$'));
+
+ // Setup valid attributes
+ if (p.length > 1) {
+ r.vAttribsRe = '^(';
+ a = this.split(/\|/, p[1]);
+
+ for (i=0; i<a.length; i++) {
+ t = a[i];
+
+ 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(new Array());
+
+ r.forceAttribs[t.toLowerCase()] = av[0].substring(1);
+ } else if (av[0].charAt(0) == '=') {
+ if (!r.defaultAttribs)
+ r.defaultAttribs = tinyMCE.clearArray(new Array());
+
+ 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(new Array());
+
+ r.validAttribValues[t.toLowerCase()] = this._arrayToRe(this.split('?', av[0].substring(1)), '');
+ }
+ }
+
+ r.vAttribsRe += '' + t.toLowerCase() + (i != a.length - 1 ? '|' : '');
+
+ a[i] = t.toLowerCase();
+ }
+
+ 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();
+
+ //tinyMCE.debug(r.tag, r.oTagName, r.vAttribsRe, r.vAttribsReWC);
+ } else {
+ r.vAttribsRe = '';
+ r.vAttribs = tinyMCE.clearArray(new Array());
+ r.vAttribsReIsWild = false;
+ }
+
+ or[r.tag] = r;
+ }
+ }
+
+ return or;
+ },
+
+ serializeNodeAsXML : function(n) {
+ var s, b;
+
+ if (!this.xmlDoc) {
+ if (this.isMSIE) {
+ 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.isMSIE)
+ 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 (this._isDuplicate(n))
+ return;
+
+ xd = this.xmlDoc;
+
+ switch (n.nodeType) {
+ case 1: // Element
+ 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: // Text
+ xn.appendChild(xd.createTextNode(n.nodeValue));
+ return;
+
+ case 8: // Comment
+ 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) {
+ var en, no, h = '', i, l, r, cn, va = false, f = false, at, hc;
+
+ this._setupRules(); // Will initialize cleanup rules
+
+ if (this._isDuplicate(n))
+ return '';
+
+ switch (n.nodeType) {
+ case 1: // Element
+ hc = n.hasChildNodes();
+
+ // MSIE sometimes produces <//tag>
+ if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && n.nodeName.indexOf('/') != -1)
+ break;
+
+ if (this.vElementsRe.test(n.nodeName) && (!this.iveRe || !this.iveRe.test(n.nodeName))) {
+ va = true;
+
+ r = this.rules[n.nodeName];
+ if (!r) {
+ at = this.rules;
+ for (no in at) {
+ if (at[no] && at[no].validRe.test(n.nodeName)) {
+ r = at[no];
+ break;
+ }
+ }
+ }
+
+ en = r.isWild ? n.nodeName.toLowerCase() : r.oTagName;
+ f = r.fill;
+
+ if (r.removeEmpty && !hc)
+ return "";
+
+ h += '<' + en;
+
+ if (r.vAttribsReIsWild) {
+ // Serialize wildcard attributes
+ at = n.attributes;
+ for (i=at.length-1; i>-1; i--) {
+ no = at[i];
+ if (no.specified && r.vAttribsRe.test(no.nodeName))
+ h += this._serializeAttribute(n, r, no.nodeName);
+ }
+ } else {
+ // Serialize specific attributes
+ for (i=r.vAttribs.length-1; i>-1; i--)
+ h += this._serializeAttribute(n, r, r.vAttribs[i]);
+ }
+
+ // Serialize mce_ atts
+ if (!this.settings.on_save) {
+ at = this.mceAttribs;
+
+ for (no in at) {
+ if (at[no])
+ h += this._serializeAttribute(n, r, at[no]);
+ }
+ }
+
+ // Close these
+ if (this.closeElementsRe.test(n.nodeName))
+ return h + ' />';
+
+ h += '>';
+
+ if (this.isMSIE && this.codeElementsRe.test(n.nodeName))
+ h += n.innerHTML;
+ }
+ break;
+
+ case 3: // Text
+ if (n.parentNode && this.codeElementsRe.test(n.parentNode.nodeName))
+ return this.isMSIE ? '' : n.nodeValue;
+
+ return this.xmlEncode(n.nodeValue);
+
+ case 8: // Comment
+ return "<!--" + this._trimComment(n.nodeValue) + "-->";
+ }
+
+ if (hc) {
+ cn = n.childNodes;
+
+ for (i=0, l=cn.length; i<l; i++)
+ h += this.serializeNodeAsHTML(cn[i]);
+ }
+
+ // Fill empty nodes
+ if (f && !hc)
+ h += this.fillStr;
+
+ // End element
+ if (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 && this.settings.url_converter.length != 0 && /^(src|href|longdesc)$/.test(an))
+ av = eval(this.settings.url_converter + '(this, n, av)');
+
+ if (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av))
+ return "";
+
+ if (av.length != 0 && av == "{$uid}")
+ av = "uid_" + (this.idCount++);
+
+ if (av.length != 0)
+ return " " + an + "=" + '"' + this.xmlEncode(av) + '"';
+
+ return "";
+ },
+
+ formatHTML : function(h) {
+ var s = this.settings, p = '', i = 0, li = 0, o = '', l;
+
+ h = h.replace(/\r/g, ''); // Windows sux, isn't carriage return a thing of the past :)
+ h = '\n' + h;
+ h = h.replace(new RegExp('\\n\\s+', 'gi'), '\n'); // Remove previous formatting
+ h = h.replace(this.nlBeforeRe, '\n<$1$2>');
+ h = h.replace(this.nlAfterRe, '<$1$2>\n');
+ h = h.replace(this.nlBeforeAfterRe, '\n<$1$2$3>\n');
+ h += '\n';
+
+ //tinyMCE.debug(h);
+
+ while ((i = h.indexOf('\n', i + 1)) != -1) {
+ if ((l = h.substring(li + 1, i)).length != 0) {
+ if (this.ouRe.test(l) && p.length >= s.indent_levels)
+ p = p.substring(s.indent_levels);
+
+ o += p + l + '\n';
+
+ if (this.inRe.test(l))
+ p += this.inStr;
+ }
+
+ li = i;
+ }
+
+ //tinyMCE.debug(h);
+
+ return o;
+ },
+
+ xmlEncode : function(s) {
+ var i, l, e, o = '', c;
+
+ this._setupEntities(); // Will intialize lookup table
+
+ switch (this.settings.entity_encoding) {
+ case "raw":
+ return tinyMCE.xmlEncode(s);
+
+ case "named":
+ for (i=0, l=s.length; i<l; i++) {
+ c = s.charCodeAt(i);
+ e = this.entities[c];
+
+ if (e && e != '')
+ o += '&' + e + ';';
+ else
+ o += String.fromCharCode(c);
+ }
+
+ return o;
+
+ case "numeric":
+ for (i=0, l=s.length; i<l; i++) {
+ c = s.charCodeAt(i);
+
+ if (c > 127 || c == 60 || c == 62 || c == 38 || c == 39 || c == 34)
+ o += '&#' + c + ";";
+ else
+ o += String.fromCharCode(c);
+ }
+
+ return o;
+ }
+
+ return s;
+ },
+
+ split : function(re, s) {
+ var c = s.split(re);
+ var i, l, o = new Array();
+
+ for (i=0, l=c.length; i<l; i++) {
+ if (c[i] != '')
+ o[i] = c[i];
+ }
+
+ return o;
+ },
+
+ _trimComment : function(s) {
+ // Remove mce_src, mce_href
+ s = s.replace(new RegExp('\\smce_src=\"[^\"]*\"', 'gi'), "");
+ s = s.replace(new RegExp('\\smce_href=\"[^\"]*\"', 'gi'), "");
+
+ return s;
+ },
+
+ _getAttrib : function(e, n, d) {
+ if (typeof(d) == "undefined")
+ d = "";
+
+ if (!e || e.nodeType != 1)
+ return d;
+
+ var v = e.getAttribute(n, 0);
+
+ if (n == "class" && !v)
+ v = e.className;
+
+ if (this.isMSIE && n == "http-equiv")
+ v = e.httpEquiv;
+
+ if (this.isMSIE && e.nodeName == "FORM" && n == "enctype" && v == "application/x-www-form-urlencoded")
+ v = "";
+
+ if (this.isMSIE && e.nodeName == "INPUT" && n == "size" && v == "20")
+ v = "";
+
+ if (this.isMSIE && e.nodeName == "INPUT" && n == "maxlength" && v == "2147483647")
+ v = "";
+
+ if (n == "style" && !tinyMCE.isOpera)
+ v = e.style.cssText;
+
+ if (n == 'style')
+ 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'))
+ return eval(tinyMCE.settings.urlconverter_callback + "(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;
+
+ // Setup entities
+ if (!this.entitiesDone) {
+ if (s.entity_encoding == "named") {
+ n = tinyMCE.clearArray(new Array());
+ 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;
+
+ // Setup default rule
+ if (!this.rulesDone) {
+ this.addRuleStr(s.valid_elements);
+ this.addRuleStr(s.extended_valid_elements);
+
+ this.rulesDone = true;
+ }
+ },
+
+ _isDuplicate : function(n) {
+ var i;
+
+ if (!this.settings.fix_content_duplication)
+ return false;
+
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera && n.nodeType == 1) {
+ // Mark elements
+ if (n.mce_serialized == this.serializationId)
+ return true;
+
+ n.setAttribute('mce_serialized', this.serializationId);
+ } else {
+ // Search lookup table for text nodes and comments
+ for (i=0; i<this.serializedNodes.length; i++) {
+ if (this.serializedNodes[i] == n)
+ return true;
+ }
+
+ this.serializedNodes[this.serializedNodes.length] = n;
+ }
+
+ return false;
+ }
+};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_DOMUtils.class.js */
+
+TinyMCE_Engine.prototype.getElementByAttributeValue = function(n, e, a, v) {
+ return (n = this.getElementsByAttributeValue(n, e, a, v)).length == 0 ? null : n[0];
+};
+
+TinyMCE_Engine.prototype.getElementsByAttributeValue = function(n, e, a, v) {
+ var i, nl = n.getElementsByTagName(e), o = new Array();
+
+ for (i=0; i<nl.length; i++) {
+ if (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)
+ o[o.length] = nl[i];
+ }
+
+ return o;
+};
+
+TinyMCE_Engine.prototype.isBlockElement = function(n) {
+ return n != null && n.nodeType == 1 && this.blockRegExp.test(n.nodeName);
+};
+
+TinyMCE_Engine.prototype.getParentBlockElement = function(n) {
+ while (n) {
+ if (this.isBlockElement(n))
+ return n;
+
+ n = n.parentNode;
+ }
+
+ return null;
+};
+
+TinyMCE_Engine.prototype.insertAfter = function(n, r){
+ if (r.nextSibling)
+ r.parentNode.insertBefore(n, r.nextSibling);
+ else
+ r.parentNode.appendChild(n);
+};
+
+TinyMCE_Engine.prototype.setInnerHTML = function(e, h) {
+ var i, nl, n;
+
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+ // Since MSIE handles invalid HTML better that valid XHTML we
+ // need to make some things invalid. <hr /> gets converted to <hr>.
+ h = h.replace(/\s\/>/g, '>');
+
+ // Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones
+ h = h.replace(/<p([^>]*)>\u00A0?<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
+ h = h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
+ h = h.replace(/<p([^>]*)>\s+<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
+
+ // Remove first comment
+ e.innerHTML = tinyMCE.uniqueTag + h;
+ e.firstChild.removeNode(true);
+
+ // Remove weird auto generated empty paragraphs unless it's supposed to be there
+ nl = e.getElementsByTagName("p");
+ for (i=nl.length-1; i>=0; i--) {
+ n = nl[i];
+
+ if (n.nodeName == 'P' && !n.hasChildNodes() && !n.mce_keep)
+ n.parentNode.removeChild(n);
+ }
+ } else {
+ h = this.fixGeckoBaseHREFBug(1, e, h);
+ e.innerHTML = h;
+ this.fixGeckoBaseHREFBug(2, e, h);
+ }
+};
+
+TinyMCE_Engine.prototype.getOuterHTML = function(e) {
+ if (tinyMCE.isMSIE)
+ return e.outerHTML;
+
+ var d = e.ownerDocument.createElement("body");
+ d.appendChild(e);
+ return d.innerHTML;
+};
+
+TinyMCE_Engine.prototype.setOuterHTML = function(e, h) {
+ if (tinyMCE.isMSIE) {
+ e.outerHTML = h;
+ return;
+ }
+
+ var d = e.ownerDocument.createElement("body");
+ d.innerHTML = h;
+ e.parentNode.replaceChild(d.firstChild, e);
+};
+
+TinyMCE_Engine.prototype._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;
+};
+
+TinyMCE_Engine.prototype.getNodeTree = function(n, na, t, nn) {
+ var i;
+
+ if (typeof(t) == "undefined" || n.nodeType == t && (typeof(nn) == "undefined" || n.nodeName == nn))
+ na[na.length] = n;
+
+ if (n.hasChildNodes()) {
+ for (i=0; i<n.childNodes.length; i++)
+ tinyMCE.getNodeTree(n.childNodes[i], na, t, nn);
+ }
+
+ return na;
+};
+
+TinyMCE_Engine.prototype.getParentElement = function(node, names, attrib_name, attrib_value) {
+ if (typeof(names) == "undefined") {
+ if (node.nodeType == 1)
+ return node;
+
+ // Find parent node that is a element
+ while ((node = node.parentNode) != null && node.nodeType != 1) ;
+
+ return node;
+ }
+
+ if (node == null)
+ return null;
+
+ var namesAr = names.toUpperCase().split(',');
+
+ do {
+ for (var i=0; i<namesAr.length; i++) {
+ if (node.nodeName == namesAr[i] || names == "*") {
+ if (typeof(attrib_name) == "undefined")
+ return node;
+ else if (node.getAttribute(attrib_name)) {
+ if (typeof(attrib_value) == "undefined") {
+ if (node.getAttribute(attrib_name) != "")
+ return node;
+ } else if (node.getAttribute(attrib_name) == attrib_value)
+ return node;
+ }
+ }
+ }
+ } while ((node = node.parentNode) != null);
+
+ return null;
+};
+
+TinyMCE_Engine.prototype.getParentNode = function(n, f) {
+ while (n) {
+ if (f(n))
+ return n;
+
+ n = n.parentNode;
+ }
+
+ return null;
+};
+
+TinyMCE_Engine.prototype.getAttrib = function(elm, name, default_value) {
+ if (typeof(default_value) == "undefined")
+ default_value = "";
+
+ // Not a element
+ if (!elm || elm.nodeType != 1)
+ return default_value;
+
+ var v = elm.getAttribute(name);
+
+ // Try className for class attrib
+ if (name == "class" && !v)
+ v = elm.className;
+
+ // Workaround for a issue with Firefox 1.5rc2+
+ if (tinyMCE.isGecko && name == "src" && elm.src != null && elm.src != "")
+ v = elm.src;
+
+ // Workaround for a issue with Firefox 1.5rc2+
+ if (tinyMCE.isGecko && name == "href" && elm.href != null && elm.href != "")
+ v = elm.href;
+
+ if (name == "http-equiv" && tinyMCE.isMSIE)
+ v = elm.httpEquiv;
+
+ if (name == "style" && !tinyMCE.isOpera)
+ v = elm.style.cssText;
+
+ return (v && v != "") ? v : default_value;
+};
+
+TinyMCE_Engine.prototype.setAttrib = function(element, name, value, fix_value) {
+ if (typeof(value) == "number" && value != null)
+ value = "" + value;
+
+ if (fix_value) {
+ if (value == null)
+ value = "";
+
+ var re = new RegExp('[^0-9%]', 'g');
+ value = value.replace(re, '');
+ }
+
+ if (name == "style")
+ element.style.cssText = value;
+
+ if (name == "class")
+ element.className = value;
+
+ if (value != null && value != "" && value != -1)
+ element.setAttribute(name, value);
+ else
+ element.removeAttribute(name);
+};
+
+TinyMCE_Engine.prototype.setStyleAttrib = function(elm, name, value) {
+ eval('elm.style.' + name + '=value;');
+
+ // Style attrib deleted
+ if (tinyMCE.isMSIE && value == null || value == '') {
+ var str = tinyMCE.serializeStyle(tinyMCE.parseStyle(elm.style.cssText));
+ elm.style.cssText = str;
+ elm.setAttribute("style", str);
+ }
+};
+
+TinyMCE_Engine.prototype.switchClass = function(ei, c) {
+ var e;
+
+ if (tinyMCE.switchClassCache[ei])
+ e = tinyMCE.switchClassCache[ei];
+ else
+ e = tinyMCE.switchClassCache[ei] = document.getElementById(ei);
+
+ if (e) {
+ // Keep tile mode
+ if (tinyMCE.settings.button_tile_map && e.className && e.className.indexOf('mceTiledButton') == 0)
+ c = 'mceTiledButton ' + c;
+
+ e.className = c;
+ }
+};
+
+TinyMCE_Engine.prototype.getAbsPosition = function(n) {
+ var p = {absLeft : 0, absTop : 0};
+
+ while (n) {
+ p.absLeft += n.offsetLeft;
+ p.absTop += n.offsetTop;
+ n = n.offsetParent;
+ }
+
+ return p;
+};
+
+TinyMCE_Engine.prototype.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;
+};
+
+TinyMCE_Engine.prototype.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;
+};
+
+TinyMCE_Engine.prototype.selectNodes = function(n, f, a) {
+ var i;
+
+ if (!a)
+ a = new Array();
+
+ 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;
+};
+
+TinyMCE_Engine.prototype.addCSSClass = function(e, c, b) {
+ var o = this.removeCSSClass(e, c);
+
+ return e.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c;
+};
+
+TinyMCE_Engine.prototype.removeCSSClass = function(e, c) {
+ var a = this.explode(' ', e.className), i;
+
+ for (i=0; i<a.length; i++) {
+ if (a[i] == c)
+ a[i] = '';
+ }
+
+ return e.className = a.join(' ');
+};
+
+TinyMCE_Engine.prototype.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);
+ }
+};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_URL.class.js */
+
+TinyMCE_Engine.prototype.parseURL = function(url_str) {
+ var urlParts = new Array();
+
+ if (url_str) {
+ var pos, lastPos;
+
+ // Parse protocol part
+ pos = url_str.indexOf('://');
+ if (pos != -1) {
+ urlParts['protocol'] = url_str.substring(0, pos);
+ lastPos = pos + 3;
+ }
+
+ // Find port or path start
+ for (var i=lastPos; i<url_str.length; i++) {
+ var chr = url_str.charAt(i);
+
+ if (chr == ':')
+ break;
+
+ if (chr == '/')
+ break;
+ }
+ pos = i;
+
+ // Get host
+ urlParts['host'] = url_str.substring(lastPos, pos);
+
+ // Get port
+ urlParts['port'] = "";
+ lastPos = pos;
+ if (url_str.charAt(pos) == ':') {
+ pos = url_str.indexOf('/', lastPos);
+ urlParts['port'] = url_str.substring(lastPos+1, pos);
+ }
+
+ // Get path
+ 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);
+
+ // Get query
+ 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);
+ }
+
+ // Get anchor
+ lastPos = pos;
+ if (url_str.charAt(pos) == '#') {
+ pos = url_str.length;
+ urlParts['anchor'] = url_str.substring(lastPos+1, pos);
+ }
+ }
+
+ return urlParts;
+};
+
+TinyMCE_Engine.prototype.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;
+};
+
+TinyMCE_Engine.prototype.convertAbsoluteURLToRelativeURL = function(base_url, url_to_relative) {
+ var baseURL = this.parseURL(base_url);
+ var targetURL = this.parseURL(url_to_relative);
+ var strTok1;
+ var strTok2;
+ var breakPoint = 0;
+ var outPath = "";
+ var forceSlash = false;
+
+ if (targetURL.path == "")
+ targetURL.path = "/";
+ else
+ forceSlash = true;
+
+ // Crop away last path part
+ base_url = baseURL.path.substring(0, baseURL.path.lastIndexOf('/'));
+ strTok1 = base_url.split('/');
+ strTok2 = targetURL.path.split('/');
+
+ if (strTok1.length >= strTok2.length) {
+ for (var i=0; i<strTok1.length; i++) {
+ if (i >= strTok2.length || strTok1[i] != strTok2[i]) {
+ breakPoint = i + 1;
+ break;
+ }
+ }
+ }
+
+ if (strTok1.length < strTok2.length) {
+ for (var 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 (var i=0; i<(strTok1.length-(breakPoint-1)); i++)
+ outPath += "../";
+
+ for (var 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;
+
+ // Remove document prefix from local anchors
+ var fileName = baseURL.path;
+ var pos;
+
+ if ((pos = fileName.lastIndexOf('/')) != -1)
+ fileName = fileName.substring(pos + 1);
+
+ // Is local anchor
+ if (fileName == targetURL.path && targetURL.anchor != "")
+ targetURL.path = "";
+
+ // If empty and not local anchor force filename or slash
+ if (targetURL.path == "" && !targetURL.anchor)
+ targetURL.path = fileName != "" ? fileName : "/";
+
+ return this.serializeURL(targetURL);
+};
+
+TinyMCE_Engine.prototype.convertRelativeToAbsoluteURL = function(base_url, relative_url) {
+ var baseURL = this.parseURL(base_url);
+ var relURL = this.parseURL(relative_url);
+
+ if (relative_url == "" || relative_url.charAt(0) == '/' || relative_url.indexOf('://') != -1 || relative_url.indexOf('mailto:') != -1 || relative_url.indexOf('javascript:') != -1)
+ return relative_url;
+
+ // Split parts
+ baseURLParts = baseURL['path'].split('/');
+ relURLParts = relURL['path'].split('/');
+
+ // Remove empty chunks
+ var newBaseURLParts = new Array();
+ for (var i=baseURLParts.length-1; i>=0; i--) {
+ if (baseURLParts[i].length == 0)
+ continue;
+
+ newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];
+ }
+ baseURLParts = newBaseURLParts.reverse();
+
+ // Merge relURLParts chunks
+ var newRelURLParts = new Array();
+ var numBack = 0;
+ for (var i=relURLParts.length-1; i>=0; i--) {
+ if (relURLParts[i].length == 0 || relURLParts[i] == ".")
+ continue;
+
+ if (relURLParts[i] == '..') {
+ numBack++;
+ continue;
+ }
+
+ if (numBack > 0) {
+ numBack--;
+ continue;
+ }
+
+ newRelURLParts[newRelURLParts.length] = relURLParts[i];
+ }
+
+ relURLParts = newRelURLParts.reverse();
+
+ // Remove end from absolute path
+ var len = baseURLParts.length-numBack;
+ var absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/');
+ var start = "", end = "";
+
+ // Build output URL
+ relURL.protocol = baseURL.protocol;
+ relURL.host = baseURL.host;
+ relURL.port = baseURL.port;
+
+ // Re-add trailing slash if it's removed
+ if (relURL.path.charAt(relURL.path.length-1) == "/")
+ absPath += "/";
+
+ relURL.path = absPath;
+
+ return this.serializeURL(relURL);
+};
+
+TinyMCE_Engine.prototype.convertURL = function(url, node, on_save) {
+ var prot = document.location.protocol;
+ var host = document.location.hostname;
+ var port = document.location.port;
+
+ // Pass through file protocol
+ if (prot == "file:")
+ return url;
+
+ // Something is wrong, remove weirdness
+ url = tinyMCE.regexpReplace(url, '(http|https):///', '/');
+
+ // Mailto link or anchor (Pass through)
+ if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || tinyMCE.regexpReplace(url,'[ \t\r\n\+]|%20','').charAt(0) == "#")
+ return url;
+
+ // Fix relative/Mozilla
+ if (!tinyMCE.isMSIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/')
+ return tinyMCE.settings['base_href'] + url;
+
+ // Handle relative URLs
+ if (on_save && tinyMCE.getParam('relative_urls')) {
+ var curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url);
+ if (curl.charAt(0) == '/')
+ curl = tinyMCE.settings['document_base_prefix'] + curl;
+
+ var urlParts = tinyMCE.parseURL(curl);
+ var tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings['document_base_url']);
+
+ // Force relative
+ if (urlParts['host'] == tmpUrlParts['host'] && (urlParts['port'] == tmpUrlParts['port']))
+ return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings['document_base_url'], curl);
+ }
+
+ // Handle absolute URLs
+ if (!tinyMCE.getParam('relative_urls')) {
+ var urlParts = tinyMCE.parseURL(url);
+ var baseUrlParts = tinyMCE.parseURL(tinyMCE.settings['base_href']);
+
+ // Force absolute URLs from relative URLs
+ url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url);
+
+ // If anchor and path is the same page
+ if (urlParts['anchor'] && urlParts['path'] == baseUrlParts['path'])
+ return "#" + urlParts['anchor'];
+ }
+
+ // Remove current domain
+ if (tinyMCE.getParam('remove_script_host')) {
+ var start = "", portPart = "";
+
+ if (port != "")
+ portPart = ":" + port;
+
+ start = prot + "//" + host + portPart + "/";
+
+ if (url.indexOf(start) == 0)
+ url = url.substring(start.length-1);
+ }
+
+ return url;
+};
+
+TinyMCE_Engine.prototype.convertAllRelativeURLs = function(body) {
+ // Convert all image URL:s to absolute URL
+ var elms = body.getElementsByTagName("img");
+ for (var i=0; i<elms.length; i++) {
+ var src = tinyMCE.getAttrib(elms[i], 'src');
+
+ var 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);
+ }
+ }
+
+ // Convert all link URL:s to absolute URL
+ var elms = body.getElementsByTagName("a");
+ for (var i=0; i<elms.length; i++) {
+ var href = tinyMCE.getAttrib(elms[i], 'href');
+
+ var 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);
+ }
+ }
+};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Array.class.js */
+
+TinyMCE_Engine.prototype.clearArray = function(a) {
+ for (var k in a)
+ a[k] = null;
+
+ return a;
+};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Event.class.js */
+
+TinyMCE_Engine.prototype._setEventsEnabled = function(node, state) {
+ var events = new Array('onfocus','onblur','onclick','ondblclick',
+ 'onmousedown','onmouseup','onmouseover','onmousemove',
+ 'onmouseout','onkeypress','onkeydown','onkeydown','onkeyup');
+
+ var evs = tinyMCE.settings['event_elements'].split(',');
+ for (var y=0; y<evs.length; y++){
+ var elms = node.getElementsByTagName(evs[y]);
+ for (var i=0; i<elms.length; i++) {
+ var event = "";
+
+ for (var 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);
+ }
+ }
+ }
+ }
+};
+
+TinyMCE_Engine.prototype._eventPatch = function(editor_id) {
+ var n, inst, win, e;
+
+ // Remove odd, error
+ if (typeof(tinyMCE) == "undefined")
+ return true;
+
+ try {
+ // Try selected instance first
+ 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;
+ }
+ }
+
+ // Search for it
+ for (n in tinyMCE.instances) {
+ inst = tinyMCE.instances[n];
+
+ if (!tinyMCE.isInstance(inst))
+ continue;
+
+ tinyMCE.selectedInstance = inst;
+ 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) {
+ // Ignore error if iframe is pointing to external URL
+ }
+};
+
+TinyMCE_Engine.prototype.unloadHandler = function() {
+ tinyMCE.triggerSave(true, true);
+};
+
+TinyMCE_Engine.prototype.addEventHandlers = function(inst) {
+ var doc = inst.getDoc();
+
+ inst.switchSettings();
+
+ if (tinyMCE.isMSIE) {
+ tinyMCE.addEvent(doc, "keypress", TinyMCE_Engine.prototype._eventPatch);
+ tinyMCE.addEvent(doc, "keyup", TinyMCE_Engine.prototype._eventPatch);
+ tinyMCE.addEvent(doc, "keydown", TinyMCE_Engine.prototype._eventPatch);
+ tinyMCE.addEvent(doc, "mouseup", TinyMCE_Engine.prototype._eventPatch);
+ tinyMCE.addEvent(doc, "mousedown", TinyMCE_Engine.prototype._eventPatch);
+ tinyMCE.addEvent(doc, "click", TinyMCE_Engine.prototype._eventPatch);
+ } else {
+ tinyMCE.addEvent(doc, "keypress", tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, "keydown", tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, "keyup", tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, "click", tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, "mouseup", tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, "mousedown", tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, "focus", tinyMCE.handleEvent);
+ tinyMCE.addEvent(doc, "blur", tinyMCE.handleEvent);
+
+ eval('try { doc.designMode = "On"; } catch(e) {}'); // Force designmode
+ }
+};
+
+TinyMCE_Engine.prototype.onMouseMove = function() {
+ var inst;
+
+ if (!tinyMCE.hasMouseMoved) {
+ inst = tinyMCE.selectedInstance;
+
+ // Workaround for bug #1437457 (Odd MSIE bug)
+ if (inst.isFocused) {
+ inst.undoBookmark = inst.selection.getBookmark();
+ tinyMCE.hasMouseMoved = true;
+ }
+ }
+
+// tinyMCE.cancelEvent(inst.getWin().event);
+// return false;
+};
+
+TinyMCE_Engine.prototype.cancelEvent = function(e) {
+ if (tinyMCE.isMSIE) {
+ e.returnValue = false;
+ e.cancelBubble = true;
+ } else
+ e.preventDefault();
+};
+
+TinyMCE_Engine.prototype.addEvent = function(o, n, h) {
+ if (o.attachEvent)
+ o.attachEvent("on" + n, h);
+ else
+ o.addEventListener(n, h, false);
+};
+
+TinyMCE_Engine.prototype.addSelectAccessibility = function(e, s, w) {
+ // Add event handlers
+ if (!s._isAccessible) {
+ s.onkeydown = tinyMCE.accessibleEventHandler;
+ s.onblur = tinyMCE.accessibleEventHandler;
+ s._isAccessible = true;
+ s._win = w;
+ }
+
+ return false;
+};
+
+TinyMCE_Engine.prototype.accessibleEventHandler = function(e) {
+ var win = this._win;
+ e = tinyMCE.isMSIE ? win.event : e;
+ var elm = tinyMCE.isMSIE ? e.srcElement : e.target;
+
+ // Unpiggyback onchange on blur
+ if (e.type == "blur") {
+ if (elm.oldonchange) {
+ elm.onchange = elm.oldonchange;
+ elm.oldonchange = null;
+ }
+
+ return true;
+ }
+
+ // Piggyback onchange
+ if (elm.nodeName == "SELECT" && !elm.oldonchange) {
+ elm.oldonchange = elm.onchange;
+ elm.onchange = null;
+ }
+
+ // Execute onchange and remove piggyback
+ if (e.keyCode == 13 || e.keyCode == 32) {
+ elm.onchange = elm.oldonchange;
+ elm.onchange();
+ elm.oldonchange = null;
+
+ tinyMCE.cancelEvent(e);
+ return false;
+ }
+
+ return true;
+};
+
+TinyMCE_Engine.prototype._resetIframeHeight = function() {
+ var ife;
+
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+ ife = tinyMCE.selectedInstance.iframeElement;
+
+/* if (ife._oldWidth) {
+ ife.style.width = ife._oldWidth;
+ ife.width = ife._oldWidth;
+ }*/
+
+ if (ife._oldHeight) {
+ ife.style.height = ife._oldHeight;
+ ife.height = ife._oldHeight;
+ }
+ }
+};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Selection.class.js */
+
+function TinyMCE_Selection(inst) {
+ this.instance = inst;
+};
+
+TinyMCE_Selection.prototype = {
+ getSelectedHTML : function() {
+ var inst = this.instance;
+ var e, r = this.getRng(), h;
+
+ if (tinyMCE.isSafari) {
+ // Not realy perfect!!
+ return r.toString();
+ }
+
+ e = document.createElement("body");
+
+ if (tinyMCE.isGecko)
+ e.appendChild(r.cloneContents());
+ else
+ e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;
+
+ h = tinyMCE._cleanupHTML(inst, inst.contentDocument, inst.settings, e, e, false, true, false);
+
+ // When editing always use fonts internaly
+ if (tinyMCE.getParam("convert_fonts_to_spans"))
+ tinyMCE.convertSpansToFonts(inst.getDoc());
+
+ return h;
+ },
+
+ getSelectedText : function() {
+ var inst = this.instance;
+ var d, r, s, t;
+
+ if (tinyMCE.isMSIE) {
+ 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 rng = this.getRng();
+ var doc = this.instance.getDoc();
+ var sp, le, s, e, nl, i, si, ei;
+ var trng, sx, sy, xx = -999999999;
+
+ // Skip Opera for now
+ if (tinyMCE.isOpera)
+ return null;
+
+ sx = doc.body.scrollLeft + doc.documentElement.scrollLeft;
+ sy = doc.body.scrollTop + doc.documentElement.scrollTop;
+
+ if (tinyMCE.isSafari || tinyMCE.isGecko)
+ return {rng : rng, scrollX : sx, scrollY : sy};
+
+ if (tinyMCE.isMSIE) {
+ if (simple)
+ return {rng : rng};
+
+ if (rng.item) {
+ e = rng.item(0);
+
+ nl = doc.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 = 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,
+ length : le,
+ scrollX : sx,
+ scrollY : sy
+ };
+ }
+ }
+
+ if (tinyMCE.isGecko) {
+ s = tinyMCE.getParentElement(rng.startContainer);
+ for (si=0; si<s.childNodes.length && s.childNodes[si] != rng.startContainer; si++) ;
+
+ nl = doc.getElementsByTagName(s.nodeName);
+ for (i=0; i<nl.length; i++) {
+ if (s == nl[i]) {
+ sp = i;
+ break;
+ }
+ }
+
+ e = tinyMCE.getParentElement(rng.endContainer);
+ for (ei=0; ei<e.childNodes.length && e.childNodes[ei] != rng.endContainer; ei++) ;
+
+ nl = doc.getElementsByTagName(e.nodeName);
+ for (i=0; i<nl.length; i++) {
+ if (e == nl[i]) {
+ le = i;
+ break;
+ }
+ }
+
+ //tinyMCE.debug(s.nodeName, sp, rng.startOffset, '-' , e.nodeName, le, rng.endOffset);
+ //tinyMCE.debug(sx, sy);
+
+ return {
+ startTag : s.nodeName,
+ start : sp,
+ startIndex : si,
+ endTag : e.nodeName,
+ end : le,
+ endIndex : ei,
+ startOffset : rng.startOffset,
+ endOffset : rng.endOffset,
+ scrollX : sx,
+ scrollY : sy
+ };
+ }
+
+ return null;
+ },
+
+ moveToBookmark : function(bookmark) {
+ var rng, nl, i;
+ var inst = this.instance;
+ var doc = inst.getDoc();
+ var win = inst.getWin();
+ var sel = this.getSel();
+
+ if (!bookmark)
+ return false;
+
+ if (tinyMCE.isSafari) {
+ sel.setBaseAndExtent(bookmark.startContainer, bookmark.startOffset, bookmark.endContainer, bookmark.endOffset);
+ return true;
+ }
+
+ if (tinyMCE.isMSIE) {
+ if (bookmark.rng) {
+ bookmark.rng.select();
+ return true;
+ }
+
+ win.focus();
+
+ if (bookmark.tag) {
+ rng = inst.getBody().createControlRange();
+
+ nl = doc.getElementsByTagName(bookmark.tag);
+
+ if (nl.length > bookmark.index) {
+ try {
+ rng.addElement(nl[bookmark.index]);
+ } catch (ex) {
+ // Might be thrown if the node no longer exists
+ }
+ }
+ } else {
+ rng = inst.getSel().createRange();
+ rng.moveToElementText(inst.getBody());
+ rng.collapse(true);
+ rng.moveStart('character', bookmark.start);
+ rng.moveEnd('character', bookmark.length);
+ }
+
+ rng.select();
+
+ win.scrollTo(bookmark.scrollX, bookmark.scrollY);
+ return true;
+ }
+
+ if (tinyMCE.isGecko && bookmark.rng) {
+ sel.removeAllRanges();
+ sel.addRange(bookmark.rng);
+ win.scrollTo(bookmark.scrollX, bookmark.scrollY);
+ return true;
+ }
+
+ if (tinyMCE.isGecko) {
+ // try {
+ rng = doc.createRange();
+
+ nl = doc.getElementsByTagName(bookmark.startTag);
+ if (nl.length > bookmark.start)
+ rng.setStart(nl[bookmark.start].childNodes[bookmark.startIndex], bookmark.startOffset);
+
+ nl = doc.getElementsByTagName(bookmark.endTag);
+ if (nl.length > bookmark.end)
+ rng.setEnd(nl[bookmark.end].childNodes[bookmark.endIndex], bookmark.endOffset);
+
+ sel.removeAllRanges();
+ sel.addRange(rng);
+ /* } catch {
+ // Ignore
+ }*/
+
+ win.scrollTo(bookmark.scrollX, bookmark.scrollY);
+ return true;
+ }
+
+ return false;
+ },
+
+ 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 (tinyMCE.isMSIE) {
+ rng = inst.getBody().createTextRange();
+
+ try {
+ rng.moveToElementText(node);
+
+ if (collapse)
+ rng.collapse(to_start);
+
+ rng.select();
+ } catch (e) {
+ // Throws illigal agrument in MSIE some times
+ }
+ } else {
+ sel = this.getSel();
+
+ if (!sel)
+ return;
+
+ if (tinyMCE.isSafari) {
+ sel.setBaseAndExtent(node, 0, node, node.innerText.length);
+
+ if (collapse) {
+ if (to_start)
+ sel.collapseToStart();
+ else
+ sel.collapseToEnd();
+ }
+
+ this.scrollToNode(node);
+
+ return;
+ }
+
+ rng = inst.getDoc().createRange();
+
+ if (select_text_node) {
+ // Find first textnode in tree
+ nodes = tinyMCE.getNodeTree(node, new Array(), 3);
+ if (nodes.length > 0)
+ rng.selectNodeContents(nodes[0]);
+ else
+ rng.selectNodeContents(node);
+ } else
+ rng.selectNode(node);
+
+ if (collapse) {
+ // Special treatment of textnode collapse
+ if (!to_start && node.nodeType == 3) {
+ rng.setStart(node, node.nodeValue.length);
+ rng.setEnd(node, node.nodeValue.length);
+ } else
+ rng.collapse(to_start);
+ }
+
+ sel.removeAllRanges();
+ sel.addRange(rng);
+ }
+
+ this.scrollToNode(node);
+
+ // Set selected element
+ tinyMCE.selectedElement = null;
+ if (node.nodeType == 1)
+ tinyMCE.selectedElement = node;
+ },
+
+ scrollToNode : function(node) {
+ var inst = this.instance;
+ var pos, doc, scrollX, scrollY, height;
+
+ // Scroll to node position
+ pos = tinyMCE.getAbsPosition(node);
+ doc = inst.getDoc();
+ scrollX = doc.body.scrollLeft + doc.documentElement.scrollLeft;
+ scrollY = doc.body.scrollTop + doc.documentElement.scrollTop;
+ height = tinyMCE.isMSIE ? document.getElementById(inst.editorId).style.pixelHeight : inst.targetElement.clientHeight;
+
+ // Only scroll if out of visible area
+ if (!tinyMCE.settings['auto_resize'] && !(pos.absTop > scrollY && pos.absTop < (scrollY - 25 + height)))
+ inst.contentWindow.scrollTo(pos.absLeft, pos.absTop - height + 25);
+ },
+
+ getSel : function() {
+ var inst = this.instance;
+
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ return inst.getDoc().selection;
+
+ return inst.contentWindow.getSelection();
+ },
+
+ getRng : function() {
+ var inst = this.instance;
+ var sel = this.getSel();
+
+ if (sel == null)
+ return null;
+
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera)
+ return sel.createRange();
+
+ if (tinyMCE.isSafari && !sel.getRangeAt)
+ return '' + window.getSelection();
+
+ return sel.getRangeAt(0);
+ },
+
+ getFocusElement : function() {
+ var inst = this.instance;
+
+ if (tinyMCE.isMSIE && !tinyMCE.isOpera) {
+ var doc = inst.getDoc();
+ var rng = doc.selection.createRange();
+
+ // if (rng.collapse)
+ // rng.collapse(true);
+
+ var elm = rng.item ? rng.item(0) : rng.parentElement();
+ } else {
+ if (inst.isHidden())
+ return inst.getBody();
+
+ var sel = this.getSel();
+ var rng = this.getRng();
+
+ if (!sel || !rng)
+ return null;
+
+ var elm = rng.commonAncestorContainer;
+ //var elm = (sel && sel.anchorNode) ? sel.anchorNode : null;
+
+ // Handle selection a image or other control like element such as anchors
+ if (!rng.collapsed) {
+ // Is selection small
+ if (rng.startContainer == rng.endContainer) {
+ if (rng.startOffset - rng.endOffset < 2) {
+ if (rng.startContainer.hasChildNodes())
+ elm = rng.startContainer.childNodes[rng.startOffset];
+ }
+ }
+ }
+
+ // Get the element parent of the node
+ elm = tinyMCE.getParentElement(elm);
+
+ //if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")
+ // elm = tinyMCE.selectedElement;
+ }
+
+ return elm;
+ }
+};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_UndoRedo.class.js */
+
+function TinyMCE_UndoRedo(inst) {
+ this.instance = inst;
+ this.undoLevels = new Array();
+ this.undoIndex = 0;
+ this.typingUndoIndex = -1;
+ this.undoRedo = true;
+};
+
+TinyMCE_UndoRedo.prototype = {
+ add : function(l) {
+ var b;
+
+ if (l) {
+ this.undoLevels[this.undoLevels.length] = l;
+ return true;
+ }
+
+ var inst = this.instance;
+
+ if (this.typingUndoIndex != -1) {
+ this.undoIndex = this.typingUndoIndex;
+ // tinyMCE.debug("Override: " + this.undoIndex);
+ }
+
+ var newHTML = tinyMCE.trim(inst.getBody().innerHTML);
+ if (this.undoLevels[this.undoIndex] && newHTML != this.undoLevels[this.undoIndex].content) {
+ //tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex]);
+
+ tinyMCE.dispatchCallback(inst, 'onchange_callback', 'onChange', inst);
+
+ // Time to compress
+ var customUndoLevels = tinyMCE.settings['custom_undo_redo_levels'];
+ if (customUndoLevels != -1 && this.undoLevels.length > customUndoLevels) {
+ for (var i=0; i<this.undoLevels.length-1; i++) {
+ //tinyMCE.debug(this.undoLevels[i] + "=" + this.undoLevels[i+1]);
+ 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
+ };
+
+ this.undoLevels.length = this.undoIndex + 1;
+
+ //tinyMCE.debug("level added" + this.undoIndex);
+ return true;
+
+ // tinyMCE.debug(this.undoIndex + "," + (this.undoLevels.length-1));
+ }
+
+ return false;
+ },
+
+ undo : function() {
+ var inst = this.instance;
+
+ // Do undo
+ 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);
+ }
+
+ // tinyMCE.debug("Undo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);
+ },
+
+ 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 (this.undoIndex > 0)
+// inst.selection.moveToBookmark(this.undoLevels[this.undoIndex-1].bookmark);
+ if (inst.settings.custom_undo_redo_restore_selection)
+ inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);
+ // tinyMCE.debug("Redo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);
+ }
+
+ tinyMCE.triggerNodeChange();
+ }
+};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_ForceParagraphs.class.js */
+
+var TinyMCE_ForceParagraphs = {
+ _insertPara : function(inst, e) {
+ function isEmpty(para) {
+ function isEmptyHTML(html) {
+ return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == "";
+ }
+
+ // Check for images
+ if (para.getElementsByTagName("img").length > 0)
+ return false;
+
+ // Check for tables
+ if (para.getElementsByTagName("table").length > 0)
+ return false;
+
+ // Check for HRs
+ if (para.getElementsByTagName("hr").length > 0)
+ return false;
+
+ // Check all textnodes
+ var nodes = tinyMCE.getNodeTree(para, new Array(), 3);
+ for (var i=0; i<nodes.length; i++) {
+ if (!isEmptyHTML(nodes[i].nodeValue))
+ return false;
+ }
+
+ // No images, no tables, no hrs, no text content then it's empty
+ return true;
+ }
+
+ var doc = inst.getDoc();
+ var sel = inst.getSel();
+ var win = inst.contentWindow;
+ var rng = sel.getRangeAt(0);
+ var body = doc.body;
+ var rootElm = doc.documentElement;
+ var blockName = "P";
+
+ // tinyMCE.debug(body.innerHTML);
+
+ // debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());
+
+ // Setup before range
+ var rngBefore = doc.createRange();
+ rngBefore.setStart(sel.anchorNode, sel.anchorOffset);
+ rngBefore.collapse(true);
+
+ // Setup after range
+ var rngAfter = doc.createRange();
+ rngAfter.setStart(sel.focusNode, sel.focusOffset);
+ rngAfter.collapse(true);
+
+ // Setup start/end points
+ var direct = rngBefore.compareBoundaryPoints(rngBefore.START_TO_END, rngAfter) < 0;
+ var startNode = direct ? sel.anchorNode : sel.focusNode;
+ var startOffset = direct ? sel.anchorOffset : sel.focusOffset;
+ var endNode = direct ? sel.focusNode : sel.anchorNode;
+ var endOffset = direct ? sel.focusOffset : sel.anchorOffset;
+
+ startNode = startNode.nodeName == "BODY" ? startNode.firstChild : startNode;
+ endNode = endNode.nodeName == "BODY" ? endNode.firstChild : endNode;
+
+ // tinyMCE.debug(startNode, endNode);
+
+ // Get block elements
+ var startBlock = tinyMCE.getParentBlockElement(startNode);
+ var endBlock = tinyMCE.getParentBlockElement(endNode);
+
+ // If absolute force paragraph generation within
+ if (startBlock && new RegExp('absolute|relative|static', 'gi').test(startBlock.style.position))
+ startBlock = null;
+
+ if (endBlock && new RegExp('absolute|relative|static', 'gi').test(endBlock.style.position))
+ endBlock = null;
+
+ // Use current block name
+ if (startBlock != null) {
+ blockName = startBlock.nodeName;
+
+ // Use P instead
+ if (blockName == "TD" || blockName == "TABLE" || (blockName == "DIV" && new RegExp('left|right', 'gi').test(startBlock.style.cssFloat)))
+ blockName = "P";
+ }
+
+ // Within a list use normal behaviour
+ if (tinyMCE.getParentElement(startBlock, "OL,UL") != null)
+ return false;
+
+ // Within a table create new paragraphs
+ if ((startBlock != null && startBlock.nodeName == "TABLE") || (endBlock != null && endBlock.nodeName == "TABLE"))
+ startBlock = endBlock = null;
+
+ // Setup new paragraphs
+ var paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);
+ var paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);
+
+ // Is header, then force paragraph under
+ if (/^(H[1-6])$/.test(blockName))
+ paraAfter = doc.createElement("p");
+
+ // Setup chop nodes
+ var startChop = startNode;
+ var endChop = endNode;
+
+ // Get startChop node
+ node = startChop;
+ do {
+ if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
+ break;
+
+ startChop = node;
+ } while ((node = node.previousSibling ? node.previousSibling : node.parentNode));
+
+ // Get endChop node
+ node = endChop;
+ do {
+ if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
+ break;
+
+ endChop = node;
+ } while ((node = node.nextSibling ? node.nextSibling : node.parentNode));
+
+ // Fix when only a image is within the TD
+ if (startChop.nodeName == "TD")
+ startChop = startChop.firstChild;
+
+ if (endChop.nodeName == "TD")
+ endChop = endChop.lastChild;
+
+ // If not in a block element
+ if (startBlock == null) {
+ // Delete selection
+ rng.deleteContents();
+ sel.removeAllRanges();
+
+ if (startChop != rootElm && endChop != rootElm) {
+ // Insert paragraph before
+ rngBefore = rng.cloneRange();
+
+ if (startChop == body)
+ rngBefore.setStart(startChop, 0);
+ else
+ rngBefore.setStartBefore(startChop);
+
+ paraBefore.appendChild(rngBefore.cloneContents());
+
+ // Insert paragraph after
+ if (endChop.parentNode.nodeName == blockName)
+ endChop = endChop.parentNode;
+
+ // If not after image
+ //if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")
+ rng.setEndAfter(endChop);
+
+ if (endChop.nodeName != "#text" && endChop.nodeName != "BODY")
+ rngBefore.setEndAfter(endChop);
+
+ var contents = rng.cloneContents();
+ if (contents.firstChild && (contents.firstChild.nodeName == blockName || contents.firstChild.nodeName == "BODY"))
+ paraAfter.innerHTML = contents.firstChild.innerHTML;
+ else
+ paraAfter.appendChild(contents);
+
+ // Check if it's a empty paragraph
+ if (isEmpty(paraBefore))
+ paraBefore.innerHTML = "&nbsp;";
+
+ // Check if it's a empty paragraph
+ if (isEmpty(paraAfter))
+ paraAfter.innerHTML = "&nbsp;";
+
+ // Delete old contents
+ rng.deleteContents();
+ rngAfter.deleteContents();
+ rngBefore.deleteContents();
+
+ // Insert new paragraphs
+ paraAfter.normalize();
+ rngBefore.insertNode(paraAfter);
+ paraBefore.normalize();
+ rngBefore.insertNode(paraBefore);
+
+ // tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);
+ } else {
+ body.innerHTML = "<" + blockName + ">&nbsp;</" + blockName + "><" + blockName + ">&nbsp;</" + blockName + ">";
+ paraAfter = body.childNodes[1];
+ }
+
+ inst.selection.selectNode(paraAfter, true, true);
+
+ return true;
+ }
+
+ // Place first part within new paragraph
+ if (startChop.nodeName == blockName)
+ rngBefore.setStart(startChop, 0);
+ else
+ rngBefore.setStartBefore(startChop);
+
+ rngBefore.setEnd(startNode, startOffset);
+ paraBefore.appendChild(rngBefore.cloneContents());
+
+ // Place secound part within new paragraph
+ rngAfter.setEndAfter(endChop);
+ rngAfter.setStart(endNode, endOffset);
+ var contents = rngAfter.cloneContents();
+
+ if (contents.firstChild && contents.firstChild.nodeName == blockName) {
+ /* var nodes = contents.firstChild.childNodes;
+ for (var i=0; i<nodes.length; i++) {
+ //tinyMCE.debug(nodes[i].nodeName);
+ if (nodes[i].nodeName != "BODY")
+ paraAfter.appendChild(nodes[i]);
+ }
+ */
+ paraAfter.innerHTML = contents.firstChild.innerHTML;
+ } else
+ paraAfter.appendChild(contents);
+
+ // Check if it's a empty paragraph
+ if (isEmpty(paraBefore))
+ paraBefore.innerHTML = "&nbsp;";
+
+ // Check if it's a empty paragraph
+ if (isEmpty(paraAfter))
+ paraAfter.innerHTML = "&nbsp;";
+
+ // Create a range around everything
+ var 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);
+
+ // Delete all contents and insert new paragraphs
+ rng.deleteContents();
+ rng.insertNode(paraAfter);
+ rng.insertNode(paraBefore);
+ //tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);
+
+ // Normalize
+ paraAfter.normalize();
+ paraBefore.normalize();
+
+ 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") {
+ nv = sn.nodeValue;
+
+ // Handle if a backspace is pressed after a space character #bug 1466054
+ if (nv != null && nv.length >= r.startOffset && nv.charAt(r.startOffset - 1) == ' ')
+ s = true;
+
+ // Only remove BRs if we are at the end of line #bug 1464152
+ if (nv != null && r.startOffset == nv.length)
+ sn.nextSibling.parentNode.removeChild(sn.nextSibling);
+ }
+
+ return s;
+ }
+};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Layer.class.js */
+
+function TinyMCE_Layer(id, bm) {
+ this.id = id;
+ this.blockerElement = null;
+ this.events = false;
+ this.element = null;
+ this.blockMode = typeof(bm) != 'undefined' ? bm : true;
+ this.doc = document;
+};
+
+TinyMCE_Layer.prototype = {
+ moveRelativeTo : function(re, p) {
+ var rep = this.getAbsPosition(re);
+ var w = parseInt(re.offsetWidth);
+ var h = parseInt(re.offsetHeight);
+ var e = this.getElement();
+ var ew = parseInt(e.offsetWidth);
+ var eh = parseInt(e.offsetHeight);
+ var x, y;
+
+ switch (p) {
+ case "tl":
+ x = rep.absLeft;
+ y = rep.absTop;
+ break;
+
+ case "tr":
+ x = rep.absLeft + w;
+ y = rep.absTop;
+ break;
+
+ case "bl":
+ x = rep.absLeft;
+ y = rep.absTop + h;
+ break;
+
+ case "br":
+ x = rep.absLeft + w;
+ y = rep.absTop + h;
+ break;
+
+ case "cc":
+ x = rep.absLeft + (w / 2) - (ew / 2);
+ y = rep.absTop + (h / 2) - (eh / 2);
+ break;
+ }
+
+ this.moveTo(x, y);
+ },
+
+ moveBy : function(x, y) {
+ var e = this.getElement();
+ this.moveTo(parseInt(e.style.left) + x, parseInt(e.style.top) + y);
+ },
+
+ moveTo : function(x, y) {
+ var e = this.getElement();
+
+ e.style.left = x + "px";
+ e.style.top = y + "px";
+
+ this.updateBlocker();
+ },
+
+ resizeBy : function(w, h) {
+ var e = this.getElement();
+ this.resizeTo(parseInt(e.style.width) + w, parseInt(e.style.height) + h);
+ },
+
+ resizeTo : function(w, h) {
+ var e = this.getElement();
+
+ if (w != null)
+ e.style.width = w + "px";
+
+ if (h != null)
+ e.style.height = h + "px";
+
+ this.updateBlocker();
+ },
+
+ show : function() {
+ this.getElement().style.display = 'block';
+ this.updateBlocker();
+ },
+
+ hide : function() {
+ this.getElement().style.display = 'none';
+ this.updateBlocker();
+ },
+
+ isVisible : function() {
+ return this.getElement().style.display == 'block';
+ },
+
+ getElement : function() {
+ if (!this.element)
+ this.element = this.doc.getElementById(this.id);
+
+ return this.element;
+ },
+
+ setBlockMode : function(s) {
+ this.blockMode = s;
+ },
+
+ updateBlocker : function() {
+ var e, b, x, y, w, h;
+
+ b = this.getBlocker();
+ if (b) {
+ if (this.blockMode) {
+ e = this.getElement();
+ x = this.parseInt(e.style.left);
+ y = this.parseInt(e.style.top);
+ w = this.parseInt(e.offsetWidth);
+ h = this.parseInt(e.offsetHeight);
+
+ b.style.left = x + 'px';
+ b.style.top = y + 'px';
+ b.style.width = w + 'px';
+ b.style.height = h + 'px';
+ b.style.display = e.style.display;
+ } else
+ b.style.display = 'none';
+ }
+ },
+
+ getBlocker : function() {
+ var d, b;
+
+ if (!this.blockerElement && this.blockMode) {
+ d = this.doc;
+ b = d.createElement("iframe");
+
+ 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) {
+ var d = this.doc, e = d.createElement(n);
+
+ e.setAttribute('id', this.id);
+
+ if (c)
+ e.className = c;
+
+ if (!p)
+ p = d.body;
+
+ p.appendChild(e);
+
+ return this.element = e;
+ },
+
+ parseInt : function(s) {
+ if (s == null || s == '')
+ return 0;
+
+ return parseInt(s);
+ }
+};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Menu.class.js */
+
+function TinyMCE_Menu() {
+ var id;
+
+ if (typeof(tinyMCE.menuCounter) == "undefined")
+ tinyMCE.menuCounter = 0;
+
+ id = "mc_menu_" + tinyMCE.menuCounter++;
+
+ TinyMCE_Layer.call(this, id, true);
+
+ this.id = id;
+ this.items = new Array();
+ this.needsUpdate = true;
+};
+
+// Extends the TinyMCE_Layer class
+TinyMCE_Menu.prototype = tinyMCE.extend(TinyMCE_Layer.prototype, {
+ init : function(s) {
+ var n;
+
+ // Default params
+ this.settings = {
+ separator_class : 'mceMenuSeparator',
+ title_class : 'mceMenuTitle',
+ disabled_class : 'mceMenuDisabled',
+ menu_class : 'mceMenu',
+ drop_menu : true
+ };
+
+ for (n in s)
+ this.settings[n] = s[n];
+
+ this.create('div', this.settings.menu_class);
+ },
+
+ clear : function() {
+ this.items = new Array();
+ },
+
+ addTitle : function(t) {
+ this.add({type : 'title', text : t});
+ },
+
+ addDisabled : function(t) {
+ this.add({type : 'disabled', text : t});
+ },
+
+ addSeparator : function() {
+ this.add({type : 'separator'});
+ },
+
+ addItem : function(t, js) {
+ this.add({text : t, js : js});
+ },
+
+ add : function(mi) {
+ this.items[this.items.length] = mi;
+ this.needsUpdate = true;
+ },
+
+ update : function() {
+ var e = this.getElement(), h = '', i, t, m = this.items, s = this.settings;
+
+ if (this.settings.drop_menu)
+ h += '<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="javascript:void(0);" onmousedown="' + tinyMCE.xmlEncode(m[i].js) + ';return false;"><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) {
+ // Accessibility stuff
+/* nl = this.getElement().getElementsByTagName("a");
+ if (nl.length > 0)
+ nl[0].focus();*/
+ }
+
+ tinyMCE.lastMenu = this;
+ }
+});
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Debug.class.js */
+
+TinyMCE_Engine.prototype.debug = function() {
+ var m = "", e, a, i;
+
+ e = document.getElementById("tinymce_debug");
+ if (!e) {
+ var d = document.createElement("div");
+ d.setAttribute("className", "debugger");
+ d.className = "debugger";
+ d.innerHTML = 'Debug output:<textarea id="tinymce_debug" style="width: 100%; height: 300px" wrap="nowrap" mce_editable="false"></textarea>';
+
+ document.body.appendChild(d);
+ e = document.getElementById("tinymce_debug");
+ }
+
+ a = this.debug.arguments;
+ for (i=0; i<a.length; i++) {
+ m += a[i];
+ if (i<a.length-1)
+ m += ', ';
+ }
+
+ e.value += m + "\n";
+};
diff --git a/program/js/tiny_mce/utils/editable_selects.js b/program/js/tiny_mce/utils/editable_selects.js
new file mode 100644
index 000000000..81c99eb5c
--- /dev/null
+++ b/program/js/tiny_mce/utils/editable_selects.js
@@ -0,0 +1,63 @@
+/**
+ * $RCSfile: editable_selects.js,v $
+ * $Revision: 1.1 $
+ * $Date: 2006/04/10 09:30:19 $
+ *
+ * Makes select boxes editable.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+var TinyMCE_EditableSelects = {
+ editSelectElm : null,
+
+ init : function() {
+ var nl = document.getElementsByTagName("select"), i, d = document, o;
+
+ for (i=0; i<nl.length; i++) {
+ if (nl[i].className.indexOf('mceEditableSelect') != -1) {
+ o = new Option('(value)', '__mce_add_custom__');
+
+ o.className = 'mceAddSelectValue';
+
+ nl[i].options[nl[i].options.length] = o;
+ nl[i].setAttribute('onchange', 'TinyMCE_EditableSelects.onChangeEditableSelect(this);');
+ }
+ }
+ },
+
+ onChangeEditableSelect : function(se) {
+ var d = document, ne;
+
+ if (se.options[se.selectedIndex].value == '__mce_add_custom__') {
+ ne = d.createElement("input");
+ ne.id = se.id + "_custom";
+ ne.name = se.name + "_custom";
+ ne.type = "text";
+
+ ne.style.width = se.clientWidth;
+ se.parentNode.insertBefore(ne, se);
+ se.style.display = 'none';
+ ne.focus();
+ ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput;
+ TinyMCE_EditableSelects.editSelectElm = se;
+ }
+ },
+
+ onBlurEditableSelectInput : function() {
+ var se = TinyMCE_EditableSelects.editSelectElm;
+
+ if (se) {
+ if (se.previousSibling.value != '') {
+ addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value);
+ selectByValue(document.forms[0], se.id, se.previousSibling.value);
+ } else
+ selectByValue(document.forms[0], se.id, '');
+
+ se.style.display = 'inline';
+ se.parentNode.removeChild(se.previousSibling);
+ TinyMCE_EditableSelects.editSelectElm = null;
+ }
+ }
+};
diff --git a/program/js/tiny_mce/utils/form_utils.js b/program/js/tiny_mce/utils/form_utils.js
new file mode 100644
index 000000000..f1e935809
--- /dev/null
+++ b/program/js/tiny_mce/utils/form_utils.js
@@ -0,0 +1,210 @@
+/**
+ * $RCSfile: form_utils.js,v $
+ * $Revision: 1.11 $
+ * $Date: 2006/04/07 15:53:12 $
+ *
+ * Various form utilitiy functions.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+function getColorPickerHTML(id, target_form_element) {
+ var html = "";
+
+ html += '<a id="' + id + '_link" href="javascript:void(0);" onkeydown="pickColor(event,\'' + target_form_element +'\');" onmousedown="pickColor(event,\'' + target_form_element +'\');return false;">';
+ html += '<img id="' + id + '" src="../../themes/' + tinyMCE.getParam("theme") + '/images/color.gif"';
+ html += ' onmouseover="this.className=\'mceButtonOver\'"';
+ html += ' onmouseout="this.className=\'mceButtonNormal\'"';
+ html += ' onmousedown="this.className=\'mceButtonDown\'"';
+ html += ' width="20" height="16" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';
+ html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';
+
+ return html;
+}
+
+function pickColor(e, target_form_element) {
+ if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown")
+ tinyMCEPopup.pickColor(e, target_form_element);
+}
+
+function updateColor(img_id, form_element_id) {
+ document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;
+}
+
+function setBrowserDisabled(id, state) {
+ var img = document.getElementById(id);
+ var lnk = document.getElementById(id + "_link");
+
+ if (lnk) {
+ if (state) {
+ lnk.setAttribute("realhref", lnk.getAttribute("href"));
+ lnk.removeAttribute("href");
+ tinyMCE.switchClass(img, 'mceButtonDisabled', true);
+ } else {
+ lnk.setAttribute("href", lnk.getAttribute("realhref"));
+ tinyMCE.switchClass(img, 'mceButtonNormal', false);
+ }
+ }
+}
+
+function getBrowserHTML(id, target_form_element, type, prefix) {
+ var option = prefix + "_" + type + "_browser_callback";
+ var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
+ if (cb == null)
+ return "";
+
+ var html = "";
+
+ html += '<a id="' + id + '_link" href="javascript:openBrower(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;">';
+ html += '<img id="' + id + '" src="../../themes/' + tinyMCE.getParam("theme") + '/images/browse.gif"';
+ html += ' onmouseover="this.className=\'mceButtonOver\';"';
+ html += ' onmouseout="this.className=\'mceButtonNormal\';"';
+ html += ' onmousedown="this.className=\'mceButtonDown\';"';
+ html += ' width="20" height="18" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';
+ html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';
+
+ return html;
+}
+
+function openBrower(img_id, target_form_element, type, option) {
+ var img = document.getElementById(img_id);
+
+ if (img.className != "mceButtonDisabled")
+ tinyMCEPopup.openBrowser(target_form_element, type, option);
+}
+
+function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {
+ if (!form_obj || !form_obj.elements[field_name])
+ return;
+
+ var sel = form_obj.elements[field_name];
+
+ var found = false;
+ for (var i=0; i<sel.options.length; i++) {
+ var option = sel.options[i];
+
+ if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) {
+ option.selected = true;
+ found = true;
+ } else
+ option.selected = false;
+ }
+
+ if (!found && add_custom && value != '') {
+ var option = new Option(value, value);
+ option.selected = true;
+ sel.options[sel.options.length] = option;
+ sel.selectedIndex = sel.options.length - 1;
+ }
+
+ return found;
+}
+
+function getSelectValue(form_obj, field_name) {
+ var elm = form_obj.elements[field_name];
+
+ if (elm == null || elm.options == null)
+ return "";
+
+ return elm.options[elm.selectedIndex].value;
+}
+
+function addSelectValue(form_obj, field_name, name, value) {
+ var s = form_obj.elements[field_name];
+ var o = new Option(name, value);
+ s.options[s.options.length] = o;
+}
+
+function addClassesToList(list_id, specific_option) {
+ // Setup class droplist
+ var styleSelectElm = document.getElementById(list_id);
+ var styles = tinyMCE.getParam('theme_advanced_styles', false);
+ styles = tinyMCE.getParam(specific_option, styles);
+
+ if (styles) {
+ var stylesAr = styles.split(';');
+
+ for (var i=0; i<stylesAr.length; i++) {
+ if (stylesAr != "") {
+ var key, value;
+
+ key = stylesAr[i].split('=')[0];
+ value = stylesAr[i].split('=')[1];
+
+ styleSelectElm.options[styleSelectElm.length] = new Option(key, value);
+ }
+ }
+ } else {
+ // Use auto impored classes
+ var csses = tinyMCE.getCSSClasses(tinyMCE.getWindowArg('editor_id'));
+ for (var i=0; i<csses.length; i++)
+ styleSelectElm.options[styleSelectElm.length] = new Option(csses[i], csses[i]);
+ }
+}
+
+function isVisible(element_id) {
+ var elm = document.getElementById(element_id);
+
+ return elm && elm.style.display != "none";
+}
+
+function convertRGBToHex(col) {
+ var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
+
+ var rgb = col.replace(re, "$1,$2,$3").split(',');
+ if (rgb.length == 3) {
+ r = parseInt(rgb[0]).toString(16);
+ g = parseInt(rgb[1]).toString(16);
+ b = parseInt(rgb[2]).toString(16);
+
+ r = r.length == 1 ? '0' + r : r;
+ g = g.length == 1 ? '0' + g : g;
+ b = b.length == 1 ? '0' + b : b;
+
+ return "#" + r + g + b;
+ }
+
+ return col;
+}
+
+function convertHexToRGB(col) {
+ if (col.indexOf('#') != -1) {
+ col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');
+
+ r = parseInt(col.substring(0, 2), 16);
+ g = parseInt(col.substring(2, 4), 16);
+ b = parseInt(col.substring(4, 6), 16);
+
+ return "rgb(" + r + "," + g + "," + b + ")";
+ }
+
+ return col;
+}
+
+function trimSize(size) {
+ return size.replace(new RegExp('[^0-9%]', 'gi'), '');
+}
+
+function getCSSSize(size) {
+ size = trimSize(size);
+
+ if (size == "")
+ return "";
+
+ return size.indexOf('%') != -1 ? size : size + "px";
+}
+
+function getStyle(elm, attrib, style) {
+ var val = tinyMCE.getAttrib(elm, attrib);
+
+ if (val != '')
+ return '' + val;
+
+ if (typeof(style) == 'undefined')
+ style = attrib;
+
+ val = eval('elm.style.' + style);
+
+ return val == null ? '' : '' + val;
+}
diff --git a/program/js/tiny_mce/utils/mclayer.js b/program/js/tiny_mce/utils/mclayer.js
new file mode 100644
index 000000000..0a7837b28
--- /dev/null
+++ b/program/js/tiny_mce/utils/mclayer.js
@@ -0,0 +1,212 @@
+/**
+ * $RCSfile: mclayer.js,v $
+ * $Revision: 1.2 $
+ * $Date: 2006/02/06 20:11:09 $
+ *
+ * Moxiecode floating layer script.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+function MCLayer(id) {
+ this.id = id;
+ this.settings = new Array();
+ this.blockerElement = null;
+ this.isMSIE = navigator.appName == "Microsoft Internet Explorer";
+ this.events = false;
+ this.autoHideCallback = null;
+}
+
+MCLayer.prototype = {
+ moveRelativeTo : function(re, p, a) {
+ var rep = this.getAbsPosition(re);
+ var w = parseInt(re.offsetWidth);
+ var h = parseInt(re.offsetHeight);
+ var x, y;
+
+ switch (p) {
+ case "tl":
+ break;
+
+ case "tr":
+ x = rep.absLeft + w;
+ y = rep.absTop;
+ break;
+
+ case "bl":
+ break;
+
+ case "br":
+ break;
+ }
+
+ this.moveTo(x, y);
+ },
+
+ moveBy : function(dx, dy) {
+ var e = this.getElement();
+ var x = parseInt(e.style.left);
+ var y = parseInt(e.style.top);
+
+ e.style.left = (x + dx) + "px";
+ e.style.top = (y + dy) + "px";
+
+ this.updateBlocker();
+ },
+
+ moveTo : function(x, y) {
+ var e = this.getElement();
+
+ e.style.left = x + "px";
+ e.style.top = y + "px";
+
+ this.updateBlocker();
+ },
+
+ show : function() {
+ MCLayer.visibleLayer = this;
+
+ this.getElement().style.display = 'block';
+ this.updateBlocker();
+ },
+
+ hide : function() {
+ this.getElement().style.display = 'none';
+ this.updateBlocker();
+ },
+
+ setAutoHide : function(s, cb) {
+ this.autoHideCallback = cb;
+ this.registerEventHandlers();
+ },
+
+ getElement : function() {
+ return document.getElementById(this.id);
+ },
+
+ updateBlocker : function() {
+ if (!this.isMSIE)
+ return;
+
+ var e = this.getElement();
+ var b = this.getBlocker();
+ var x = this.parseInt(e.style.left);
+ var y = this.parseInt(e.style.top);
+ var w = this.parseInt(e.offsetWidth);
+ var 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;
+ },
+
+ getBlocker : function() {
+ if (!this.blockerElement) {
+ var d = document, b = d.createElement("iframe");
+
+ b.style.cssText = 'display: none; left: 0px; position: absolute; 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;
+ },
+
+ registerEventHandlers : function() {
+ if (!this.events) {
+ var d = document;
+
+ this.addEvent(d, 'mousedown', MCLayer.prototype.onMouseDown);
+
+ this.events = true;
+ }
+ },
+
+ addEvent : function(o, n, h) {
+ if (o.attachEvent)
+ o.attachEvent("on" + n, h);
+ else
+ o.addEventListener(n, h, false);
+ },
+
+ onMouseDown : function(e) {
+ e = typeof(e) == "undefined" ? window.event : e;
+ var b = document.body;
+ var l = MCLayer.visibleLayer;
+
+ if (l) {
+ var mx = l.isMSIE ? e.clientX + b.scrollLeft : e.pageX;
+ var my = l.isMSIE ? e.clientY + b.scrollTop : e.pageY;
+ var el = l.getElement();
+ var x = parseInt(el.style.left);
+ var y = parseInt(el.style.top);
+ var w = parseInt(el.offsetWidth);
+ var h = parseInt(el.offsetHeight);
+
+ if (!(mx > x && mx < x + w && my > y && my < y + h)) {
+ MCLayer.visibleLayer = null;
+
+ if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my))
+ return true;
+
+ l.hide();
+ }
+ }
+ },
+
+ addCSSClass : function(e, c) {
+ this.removeCSSClass(e, c);
+ var a = this.explode(' ', e.className);
+ a[a.length] = c;
+ e.className = a.join(' ');
+ },
+
+ removeCSSClass : function(e, c) {
+ var a = this.explode(' ', e.className), i;
+
+ for (i=0; i<a.length; i++) {
+ if (a[i] == c)
+ a[i] = '';
+ }
+
+ e.className = a.join(' ');
+ },
+
+ explode : function(d, s) {
+ var ar = s.split(d);
+ var oar = new Array();
+
+ for (var i = 0; i<ar.length; i++) {
+ if (ar[i] != "")
+ oar[oar.length] = ar[i];
+ }
+
+ return oar;
+ },
+
+ parseInt : function(s) {
+ if (s == null || s == '')
+ return 0;
+
+ return parseInt(s);
+ }
+} \ No newline at end of file
diff --git a/program/js/tiny_mce/utils/mctabs.js b/program/js/tiny_mce/utils/mctabs.js
new file mode 100644
index 000000000..c159360c0
--- /dev/null
+++ b/program/js/tiny_mce/utils/mctabs.js
@@ -0,0 +1,76 @@
+/**
+ * $RCSfile: mctabs.js,v $
+ * $Revision: 1.2 $
+ * $Date: 2006/02/06 20:11:09 $
+ *
+ * Moxiecode DHTML Tabs script.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+function MCTabs() {
+ this.settings = new Array();
+};
+
+MCTabs.prototype.init = function(settings) {
+ this.settings = settings;
+};
+
+MCTabs.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;
+};
+
+MCTabs.prototype.displayTab = function(tab_id, panel_id) {
+ var panelElm = document.getElementById(panel_id);
+ var panelContainerElm = panelElm ? panelElm.parentNode : null;
+ var tabElm = document.getElementById(tab_id);
+ var tabContainerElm = tabElm ? tabElm.parentNode : null;
+ var selectionClass = this.getParam('selection_class', 'current');
+
+ if (tabElm && tabContainerElm) {
+ var nodes = tabContainerElm.childNodes;
+
+ // Hide all other tabs
+ for (var i=0; i<nodes.length; i++) {
+ if (nodes[i].nodeName == "LI")
+ nodes[i].className = '';
+ }
+
+ // Show selected tab
+ tabElm.className = 'current';
+ }
+
+ if (panelElm && panelContainerElm) {
+ var nodes = panelContainerElm.childNodes;
+
+ // Hide all other panels
+ for (var i=0; i<nodes.length; i++) {
+ if (nodes[i].nodeName == "DIV")
+ nodes[i].className = 'panel';
+ }
+
+ // Show selected panel
+ panelElm.className = 'current';
+ }
+};
+
+MCTabs.prototype.getAnchor = function() {
+ var pos, url = document.location.href;
+
+ if ((pos = url.lastIndexOf('#')) != -1)
+ return url.substring(pos + 1);
+
+ return "";
+};
+
+// Global instance
+var mcTabs = new MCTabs();
diff --git a/program/js/tiny_mce/utils/validate.js b/program/js/tiny_mce/utils/validate.js
new file mode 100644
index 000000000..747b62bb6
--- /dev/null
+++ b/program/js/tiny_mce/utils/validate.js
@@ -0,0 +1,50 @@
+/**
+ * $RCSfile: validate.js,v $
+ * $Revision: 1.3 $
+ * $Date: 2006/02/06 20:11:09 $
+ *
+ * Various form validation methods.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+function testRegExp(form_name, element_name, re) {
+ return new RegExp(re).test(document.forms[form_name].elements[element_name].value);
+}
+
+function validateString(form_name, element_name) {
+ return (document.forms[form_name].elements[element_name].value.length > 0);
+}
+
+function validateSelection(form_name, element_name) {
+ return (document.forms[form_name].elements[element_name].selectedIndex > 0);
+}
+
+function validateCheckBox(form_name, element_name) {
+ return document.forms[form_name].elements[element_name].checked;
+}
+
+function validateCleanString(form_name, element_name) {
+ return testRegExp(form_name, element_name, '^[A-Za-z0-9_]+$');
+}
+
+function validateEmail(form_name, element_name) {
+ return testRegExp(form_name, element_name, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$');
+}
+
+function validateAbsUrl(form_name, element_name) {
+ return testRegExp(form_name, element_name, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+$');
+}
+
+function validateNumber(form_name, element_name, allow_blank) {
+ return (!allow_blank && value == '') ? false : testRegExp(form_name, element_name, '^-?[0-9]*\\.?[0-9]*$');
+}
+
+function validateSize(form_name, element_name,) {
+ return testRegExp(form_name, element_name, '^[0-9]+(px|%)?$');
+}
+
+function validateID(form_name, element_name,) {
+ return testRegExp(form_name, element_name, '^[A-Za-z_]([A-Za-z0-9_])*$');
+}
diff --git a/program/lib/Mail/mime.php b/program/lib/Mail/mime.php
index eb4807336..96d7025d8 100644
--- a/program/lib/Mail/mime.php
+++ b/program/lib/Mail/mime.php
@@ -198,6 +198,16 @@ class Mail_mime
}
/**
+ * returns the HTML body portion of the message
+ * @return string HTML body of the message
+ * @access public
+ */
+ function getHTMLBody()
+ {
+ return $this->_htmlbody;
+ }
+
+ /**
* Adds an image to the list of embedded images.
*
* @param string $file The image file name OR image data itself
@@ -206,11 +216,13 @@ class Mail_mime
* Only use if $file is the image data
* @param bool $isfilename Whether $file is a filename or not
* Defaults to true
+ * @param string $contentid Desired Content-ID of MIME part
+ * Defaults to generated unique ID
* @return mixed true on success or PEAR_Error object
* @access public
*/
function addHTMLImage($file, $c_type='application/octet-stream',
- $name = '', $isfilename = true)
+ $name = '', $isfilename = true, $contentid = '')
{
$filedata = ($isfilename === true) ? $this->_file2str($file)
: $file;
@@ -222,11 +234,14 @@ class Mail_mime
if (PEAR::isError($filedata)) {
return $filedata;
}
+ if ($contentid == '') {
+ $contentid = md5(uniqid(time()));
+ }
$this->_html_images[] = array(
'body' => $filedata,
'name' => $filename,
'c_type' => $c_type,
- 'cid' => md5(uniqid(time()))
+ 'cid' => $contentid
);
return true;
}
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 810ae78a2..0c351f929 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -63,7 +63,7 @@ $labels['download'] = 'download';
$labels['filename'] = 'File name';
$labels['filesize'] = 'File size';
-$labels['preferhtml'] = 'Prefer HTML';
+$labels['preferhtml'] = 'Display HTML';
$labels['htmlmessage'] = 'HTML Message';
$labels['prettydate'] = 'Pretty dates';
@@ -120,16 +120,17 @@ $labels['resetsearch'] = 'Reset search';
// message compose
-$labels['compose'] = 'Compose a message';
+$labels['compose'] = 'Compose a message';
+$labels['sendmessage'] = 'Send the message now';
$labels['savemessage'] = 'Save this draft';
-$labels['sendmessage'] = 'Send the message now';
$labels['addattachment'] = 'Attach a file';
-$labels['charset'] = 'Charset';
-$labels['returnreceipt'] = 'Return receipt';
+$labels['charset'] = 'Charset';
+$labels['editortype'] = 'Editor type';
+$labels['returnreceipt'] = 'Return receipt';
$labels['checkspelling'] = 'Check spelling';
$labels['resumeediting'] = 'Resume editing';
-$labels['revertto'] = 'Revert to';
+$labels['revertto'] = 'Revert to';
$labels['attachments'] = 'Attachments';
$labels['upload'] = 'Upload';
@@ -201,6 +202,8 @@ $labels['timezone'] = 'Time zone';
$labels['pagesize'] = 'Rows per page';
$labels['signature'] = 'Signature';
$labels['dstactive'] = 'Daylight savings';
+$labels['htmleditor'] = 'Use HTML editor';
+$labels['htmlsignature'] = 'HTML signature';
$labels['autosavedraft'] = 'Automatically save draft';
$labels['everynminutes'] = 'every $n minutes';
diff --git a/program/localization/en_US/messages.inc b/program/localization/en_US/messages.inc
index f406ff128..2856db8a9 100644
--- a/program/localization/en_US/messages.inc
+++ b/program/localization/en_US/messages.inc
@@ -106,5 +106,6 @@ $messages['nospellerrors'] = 'No spelling errors found';
$messages['folderdeleted'] = 'Folder successfully deleted';
+$messages['converting'] = 'Removing formatting from message...';
?>
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 29fdddd06..0b09065ac 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -53,7 +53,7 @@ rcmail_compose_cleanup();
$_SESSION['compose'] = array('id' => uniqid(rand()));
// add some labels to client
-rcube_add_label('nosubject', 'norecipientwarning', 'nosubjectwarning', 'nobodywarning', 'notsentwarning', 'savingmessage', 'sendingmessage', 'messagesaved');
+rcube_add_label('nosubject', 'norecipientwarning', 'nosubjectwarning', 'nobodywarning', 'notsentwarning', 'savingmessage', 'sendingmessage', 'messagesaved', 'converting');
// add config parameter to client script
$OUTPUT->add_script(sprintf("%s.set_env('draft_autosave', %d);", $JS_OBJECT_NAME, !empty($CONFIG['drafts_mbox']) ? $CONFIG['draft_autosave'] : 0));
@@ -272,39 +272,42 @@ function rcmail_compose_header_from($attrib)
}
// get this user's identities
- $sql_result = $DB->query("SELECT identity_id, name, email, signature
+ $sql_result = $DB->query("SELECT identity_id, name, email, signature, html_signature
FROM ".get_table_name('identities')."
WHERE user_id=?
AND del<>1
ORDER BY ".$DB->quoteIdentifier('standard')." DESC, name ASC",
$_SESSION['user_id']);
-
+
if ($DB->num_rows($sql_result))
{
$from_id = 0;
$a_signatures = array();
-
+
$field_attrib['onchange'] = "$JS_OBJECT_NAME.change_identity(this)";
$select_from = new select($field_attrib);
-
+
while ($sql_arr = $DB->fetch_assoc($sql_result))
{
- $select_from->add(format_email_recipient($sql_arr['email'], $sql_arr['name']), $sql_arr['identity_id']);
+ $identity_id = $sql_arr['identity_id'];
+ $select_from->add(format_email_recipient($sql_arr['email'], $sql_arr['name']), $identity_id);
// add signature to array
if (!empty($sql_arr['signature']))
- $a_signatures[$sql_arr['identity_id']] = $sql_arr['signature'];
-
+ {
+ $a_signatures[$identity_id]['text'] = $sql_arr['signature'];
+ $a_signatures[$identity_id]['is_html'] = ($sql_arr['html_signature'] == 1) ? true : false;
+ }
+
// set identity if it's one of the reply-message recipients
if (in_array($sql_arr['email'], $a_recipients))
$from_id = $sql_arr['identity_id'];
-
+
if ($compose_mode == RCUBE_COMPOSE_REPLY && is_array($MESSAGE['FROM']))
$MESSAGE['FROM'][] = $sql_arr['email'];
if ($compose_mode == RCUBE_COMPOSE_DRAFT && strstr($MESSAGE['headers']->from, $sql_arr['email']))
$from_id = $sql_arr['identity_id'];
-
}
// overwrite identity selection with post parameter
@@ -312,7 +315,6 @@ function rcmail_compose_header_from($attrib)
$from_id = get_input_value('_from', RCUBE_INPUT_POST);
$out = $select_from->show($from_id);
-
// add signatures to client
$OUTPUT->add_script(sprintf("%s.set_env('signatures', %s);", $JS_OBJECT_NAME, array2js($a_signatures)));
@@ -340,40 +342,76 @@ function rcmail_compose_body($attrib)
if (empty($attrib['id']))
$attrib['id'] = 'rcmComposeMessage';
-
+
$attrib['name'] = '_message';
- $textarea = new textarea($attrib);
+
+ if ($CONFIG['htmleditor'])
+ $isHtml = true;
+ else
+ $isHtml = false;
$body = '';
-
+
// use posted message body
if (!empty($_POST['_message']))
+ {
$body = get_input_value('_message', RCUBE_INPUT_POST, TRUE);
-
+ }
// compose reply-body
else if ($compose_mode == RCUBE_COMPOSE_REPLY)
{
- $body = rcmail_first_text_part($MESSAGE);
+ $hasHtml = rcmail_has_html_part($MESSAGE['parts']);
+ if ($hasHtml && $CONFIG['htmleditor'])
+ {
+ $body = rcmail_first_html_part($MESSAGE);
+ $isHtml = true;
+ }
+ else
+ {
+ $body = rcmail_first_text_part($MESSAGE);
+ $isHtml = false;
+ }
if (strlen($body))
- $body = rcmail_create_reply_body($body);
+ $body = rcmail_create_reply_body($body, $isHtml);
}
-
// forward message body inline
else if ($compose_mode == RCUBE_COMPOSE_FORWARD)
{
- $body = rcmail_first_text_part($MESSAGE);
+ $hasHtml = rcmail_has_html_part($MESSAGE['parts']);
+ if ($hasHtml && $CONFIG['htmleditor'])
+ {
+ $body = rcmail_first_html_part($MESSAGE);
+ $isHtml = true;
+ }
+ else
+ {
+ $body = rcmail_first_text_part($MESSAGE);
+ $isHtml = false;
+ }
if (strlen($body))
- $body = rcmail_create_forward_body($body);
+ $body = rcmail_create_forward_body($body, $isHtml);
}
-
- // forward message body inline
else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
{
- $body = rcmail_first_text_part($MESSAGE);
+ $hasHtml = rcmail_has_html_part($MESSAGE['parts']);
+ if ($hasHtml && $CONFIG['htmleditor'])
+ {
+ $body = rcmail_first_html_part($MESSAGE);
+ $isHtml = true;
+ }
+ else
+ {
+ $body = rcmail_first_text_part($MESSAGE);
+ $isHtml = false;
+ }
if (strlen($body))
- $body = rcmail_create_draft_body($body);
+ $body = rcmail_create_draft_body($body, $isHtml);
}
-
+
+ $OUTPUT->include_script('tiny_mce/tiny_mce.js');
+ $OUTPUT->include_script("editor.js");
+ $OUTPUT->add_script('rcmail_editor_init($__skin_path);');
+
$out = $form_start ? "$form_start\n" : '';
$saveid = new hiddenfield(array('name' => '_draft_saveid', 'value' => str_replace(array('<','>'),"",$MESSAGE['headers']->messageID) ));
@@ -382,11 +420,18 @@ function rcmail_compose_body($attrib)
$drafttoggle = new hiddenfield(array('name' => '_draft', 'value' => 'yes'));
$out .= $drafttoggle->show();
+ $msgtype = new hiddenfield(array('name' => '_is_html', 'value' => ($isHtml?"1":"0")));
+ $out .= $msgtype->show();
+
+ // If desired, set this text area to be editable by TinyMCE
+ if ($isHtml)
+ $attrib['mce_editable'] = "true";
+ $textarea = new textarea($attrib);
$out .= $textarea->show($body);
$out .= $form_end ? "\n$form_end" : '';
-
+
// include GoogieSpell
- if (!empty($CONFIG['enable_spellcheck']))
+ if (!empty($CONFIG['enable_spellcheck']) && !$isHtml)
{
$lang_set = '';
if (!empty($CONFIG['spellcheck_languages']) && is_array($CONFIG['spellcheck_languages']))
@@ -422,57 +467,88 @@ function rcmail_compose_body($attrib)
}
-function rcmail_create_reply_body($body)
+function rcmail_create_reply_body($body, $bodyIsHtml)
{
global $IMAP, $MESSAGE;
- // soft-wrap message first
- $body = wordwrap($body, 75);
+ if (! $bodyIsHtml)
+ {
+ // soft-wrap message first
+ $body = wordwrap($body, 75);
- // split body into single lines
- $a_lines = preg_split('/\r?\n/', $body);
+ // split body into single lines
+ $a_lines = preg_split('/\r?\n/', $body);
- // add > to each line
- for($n=0; $n<sizeof($a_lines); $n++)
- {
- if (strpos($a_lines[$n], '>')===0)
- $a_lines[$n] = '>'.$a_lines[$n];
- else
- $a_lines[$n] = '> '.$a_lines[$n];
- }
+ // add > to each line
+ for($n=0; $n<sizeof($a_lines); $n++)
+ {
+ if (strpos($a_lines[$n], '>')===0)
+ $a_lines[$n] = '>'.$a_lines[$n];
+ else
+ $a_lines[$n] = '> '.$a_lines[$n];
+ }
- $body = join("\n", $a_lines);
+ $body = join("\n", $a_lines);
- // add title line
- $pefix = sprintf("\n\n\nOn %s, %s wrote:\n",
- $MESSAGE['headers']->date,
- $IMAP->decode_header($MESSAGE['headers']->from));
-
+ // add title line
+ $prefix = sprintf("\n\n\nOn %s, %s wrote:\n",
+ $MESSAGE['headers']->date,
+ $IMAP->decode_header($MESSAGE['headers']->from));
- // try to remove the signature
- if ($sp = strrpos($body, '-- '))
- {
- if ($body{$sp+3}==' ' || $body{$sp+3}=="\n" || $body{$sp+3}=="\r")
- $body = substr($body, 0, $sp-1);
- }
+ // try to remove the signature
+ if ($sp = strrstr($body, '-- '))
+ {
+ if ($body{$sp+3}==' ' || $body{$sp+3}=="\n" || $body{$sp+3}=="\r")
+ $body = substr($body, 0, $sp-1);
+ }
+ $suffix = '';
+ }
+ else
+ {
+ $prefix = sprintf("<br><br>On %s, %s wrote:<br><blockquote type=\"cite\" " .
+ "style=\"padding-left: 5px; border-left: #1010ff 2px solid; " .
+ "margin-left: 5px; width: 100%%\">",
+ $MESSAGE['headers']->date,
+ $IMAP->decode_header($MESSAGE['headers']->from));
+
+ $suffix = "</blockquote>";
+ }
- return $pefix.$body;
+ return $prefix.$body.$suffix;
}
-function rcmail_create_forward_body($body)
+function rcmail_create_forward_body($body, $bodyIsHtml)
{
global $IMAP, $MESSAGE;
- // soft-wrap message first
- $body = wordwrap($body, 80);
-
- $prefix = sprintf("\n\n\n-------- Original Message --------\nSubject: %s\nDate: %s\nFrom: %s\nTo: %s\n\n",
- $MESSAGE['subject'],
- $MESSAGE['headers']->date,
- $IMAP->decode_header($MESSAGE['headers']->from),
- $IMAP->decode_header($MESSAGE['headers']->to));
-
+ if (! $bodyIsHtml)
+ {
+ // soft-wrap message first
+ $body = wordwrap($body, 80);
+
+ $prefix = sprintf("\n\n\n-------- Original Message --------\nSubject: %s\nDate: %s\nFrom: %s\nTo: %s\n\n",
+ $MESSAGE['subject'],
+ $MESSAGE['headers']->date,
+ $IMAP->decode_header($MESSAGE['headers']->from),
+ $IMAP->decode_header($MESSAGE['headers']->to));
+ }
+ else
+ {
+ $prefix = sprintf(
+ "<br><br>-------- Original Message --------" .
+ "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody>" .
+ "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Subject: </th><td>%s</td></tr>" .
+ "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">Date: </th><td>%s</td></tr>" .
+ "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">From: </th><td>%s</td></tr>" .
+ "<tr><th align=\"right\" nowrap=\"nowrap\" valign=\"baseline\">To: </th><td>%s</td></tr>" .
+ "</tbody></table><br>",
+ $MESSAGE['subject'],
+ $MESSAGE['headers']->date,
+ $IMAP->decode_header($MESSAGE['headers']->from),
+ $IMAP->decode_header($MESSAGE['headers']->to));
+ }
+
// add attachments
if (!isset($_SESSION['compose']['forward_attachments']) &&
is_array($MESSAGE['parts']) && sizeof($MESSAGE['parts'])>1)
@@ -482,7 +558,7 @@ function rcmail_create_forward_body($body)
}
-function rcmail_create_draft_body($body)
+function rcmail_create_draft_body($body, $bodyIsHtml)
{
global $IMAP, $MESSAGE;
@@ -581,7 +657,7 @@ function rcmail_compose_subject($attrib)
function rcmail_compose_attachment_list($attrib)
{
- global $OUTPUT, $JS_OBJECT_NAME;
+ global $OUTPUT, $JS_OBJECT_NAME, $CONFIG;
// add ID if not given
if (!$attrib['id'])
@@ -706,6 +782,45 @@ function rcmail_receipt_checkbox($attrib)
}
+function rcmail_editor_selector($attrib)
+{
+ global $CONFIG, $MESSAGE, $compose_mode;
+
+ $choices = array(
+ 'html' => 'HTML',
+ 'plain' => 'Plain text'
+ );
+
+ // determine whether HTML or plain text should be checked
+ if ($CONFIG['htmleditor'])
+ $useHtml = true;
+ else
+ $useHtml = false;
+
+ if ($compose_mode == RCUBE_COMPOSE_REPLY ||
+ $compose_mode == RCUBE_COMPOSE_FORWARD ||
+ $compose_mode == RCUBE_COMPOSE_DRAFT)
+ {
+ $hasHtml = rcmail_has_html_part($MESSAGE['parts']);
+ $useHtml = ($hasHtml && $CONFIG['htmleditor']);
+ }
+
+ $selector = '';
+ foreach ($choices as $value => $text)
+ {
+ $checked = '';
+ if ((($text == 'HTML') && $useHtml) ||
+ (($text != 'HTML') && !$useHtml))
+ $checked = 'checked';
+
+ $selector .= sprintf("<input type='radio' name='_editorSelect' value='%s' %s onclick='return rcmail_toggle_editor(this)'>%s</input>\n",
+ $value, $checked, $text);
+ }
+
+ return $selector;
+}
+
+
function get_form_tags($attrib)
{
global $CONFIG, $OUTPUT, $JS_OBJECT_NAME, $MESSAGE_FORM, $SESS_HIDDEN_FIELD;
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index b51ec4b80..bfddb5aa8 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -689,7 +689,7 @@ function rcmail_print_body($part, $safe=FALSE, $plain=FALSE)
global $IMAP, $REMOTE_OBJECTS, $JS_OBJECT_NAME;
$body = is_array($part->replaces) ? strtr($part->body, $part->replaces) : $part->body;
-
+
// text/html
if ($part->ctype_secondary=='html')
{
@@ -1083,11 +1083,11 @@ function rcmail_message_body($attrib)
{
if (empty($part->ctype_parameters) || empty($part->ctype_parameters['charset']))
$$part->ctype_parameters['charset'] = $MESSAGE['headers']->charset;
-
+
// fetch part if not available
if (!isset($part->body))
$part->body = $IMAP->get_message_part($MESSAGE['UID'], $part->mime_id, $part);
-
+
$body = rcmail_print_body($part, $safe_mode);
$out .= '<div class="message-part">';
@@ -1187,13 +1187,13 @@ function rcmail_mod_html_body($body, $container_id)
'/(<\/?meta[^>]*>)/i'),
'<!--\\1-->',
$body);
-
+
$out = preg_replace(array('/(<body[^>]*>)/i',
'/(<\/body>)/i'),
array('<div class="rcmBody">',
'</div>'),
$out);
-
+
return $out;
}
@@ -1239,6 +1239,56 @@ function rcmail_mod_css_styles($source, $container_id)
}
+function rcmail_has_html_part($message_parts)
+{
+ if (!is_array($message_parts))
+ return FALSE;
+
+ // check all message parts
+ foreach ($message_parts as $pid => $part)
+ {
+ $mimetype = strtolower($part->ctype_primary.'/'.$part->ctype_secondary);
+ if ($mimetype=='text/html')
+ {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+// return first HTML part of a message
+function rcmail_first_html_part($message_struct)
+ {
+ global $IMAP;
+
+ if (!is_array($message_struct['parts']))
+ return FALSE;
+
+ $html_part = NULL;
+
+ // check all message parts
+ foreach ($message_struct['parts'] as $pid => $part)
+ {
+ $mimetype = strtolower($part->ctype_primary.'/'.$part->ctype_secondary);
+ if ($mimetype=='text/html')
+ {
+ $html_part = $IMAP->get_message_part($message_struct['UID'], $pid, $part);
+ }
+ }
+
+ if ($html_part)
+ {
+ // remove special chars encoding
+ //$trans = array_flip(get_html_translation_table(HTML_ENTITIES));
+ //$html_part = strtr($html_part, $trans);
+
+ return $html_part;
+ }
+
+ return FALSE;
+}
+
// return first text part of a message
function rcmail_first_text_part($message_struct)
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index 375fc92d9..b4a6b7c20 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -23,6 +23,7 @@
//require_once('lib/smtp.inc');
require_once('include/rcube_smtp.inc');
+require_once('lib/html2text.inc');
require_once('Mail/mime.php');
@@ -62,6 +63,54 @@ function rcmail_get_identity($id)
return FALSE;
}
+/**
+ * go from this:
+ * <img src=".../tiny_mce/plugins/emotions/images/smiley-cool.gif" border="0" alt="Cool" title="Cool" />
+ *
+ * to this:
+ *
+ * <IMG src="cid:smiley-cool.gif"/>
+ * ...
+ * ------part...
+ * Content-Type: image/gif
+ * Content-Transfer-Encoding: base64
+ * Content-ID: <smiley-cool.gif>
+ */
+function rcmail_attach_emoticons(&$mime_message)
+{
+ global $CONFIG, $INSTALL_PATH;
+
+ $htmlContents = $mime_message->getHtmlBody();
+
+ // remove any null-byte characters before parsing
+ $body = preg_replace('/\x00/', '', $htmlContents);
+
+ $last_img_pos = 0;
+
+ $searchstr = 'program/js/tiny_mce/plugins/emotions/images/';
+
+ // find emoticon image tags
+ while ($pos = strpos($body, $searchstr, $last_img_pos))
+ {
+ $pos2 = strpos($body, '"', $pos);
+ $body_pre = substr($body, 0, $pos);
+ $image_name = substr($body, $pos + strlen($searchstr), $pos2 - ($pos + strlen($searchstr)));
+ $body_post = substr($body, $pos2);
+
+ // add the image to the MIME message
+ $img_file = $INSTALL_PATH . '/' . $searchstr . $image_name;
+ if(! $mime_message->addHTMLImage($img_file, 'image/gif', '', true, '_' . $image_name))
+ {
+ show_message("emoticonerror", 'error');
+ }
+
+ $body = $body_pre . 'cid:_' . $image_name . $body_post;
+
+ $last_img_pos = $pos2;
+ }
+
+ $mime_message->setHTMLBody($body);
+}
if (strlen($_POST['_draft_saveid']) > 3)
$olddraftmessageid = get_input_value('_draft_saveid', RCUBE_INPUT_POST);
@@ -184,9 +233,31 @@ else
$header_delm = "\n";
// create PEAR::Mail_mime instance
+
+$isHtmlVal = strtolower(get_input_value('_is_html', RCUBE_INPUT_POST));
+$isHtml = ($isHtmlVal == "1");
+
$MAIL_MIME = new Mail_mime($header_delm);
-$MAIL_MIME->setTXTBody($message_body, FALSE, TRUE);
-//$MAIL_MIME->setTXTBody(wordwrap($message_body), FALSE, TRUE);
+
+// For HTML-formatted messages, construct the MIME message with both
+// the HTML part and the plain-text part
+
+if ($isHtml)
+ {
+ $MAIL_MIME->setHTMLBody($message_body);
+
+ // add a plain text version of the e-mail as an alternative part.
+ $h2t = new html2text($message_body);
+ $plainTextPart = $h2t->get_text();
+ $MAIL_MIME->setTXTBody($plainTextPart);
+
+ // look for "emoticon" images from TinyMCE and copy into message as attachments
+ rcmail_attach_emoticons($MAIL_MIME);
+ }
+else
+ {
+ $MAIL_MIME->setTXTBody($message_body, FALSE, TRUE);
+ }
// add stored attachments, if any
diff --git a/program/steps/settings/edit_identity.inc b/program/steps/settings/edit_identity.inc
index 316eec785..af9cb26cc 100644
--- a/program/steps/settings/edit_identity.inc
+++ b/program/steps/settings/edit_identity.inc
@@ -42,7 +42,17 @@ else
function rcube_identity_form($attrib)
{
- global $IDENTITY_RECORD, $JS_OBJECT_NAME;
+ global $IDENTITY_RECORD, $JS_OBJECT_NAME, $OUTPUT;
+
+ $OUTPUT->include_script('tiny_mce/tiny_mce_src.js');
+ $OUTPUT->add_script("tinyMCE.init({ mode : 'specific_textareas'," .
+ "apply_source_formatting : true," .
+ "theme : 'advanced'," .
+ "theme_advanced_toolbar_location : 'top'," .
+ "theme_advanced_toolbar_align : 'left'," .
+ "theme_advanced_buttons1 : 'bold,italic,underline,strikethrough,justifyleft,justifycenter,justifyright,justifyfull,separator,outdent,indent,charmap,hr'," .
+ "theme_advanced_buttons2 : 'link,unlink,forecolor,fontselect,fontsizeselect'," .
+ "theme_advanced_buttons3 : '' });");
if (!$IDENTITY_RECORD && $GLOBALS['_action']!='add-identity')
return rcube_label('notfound');
@@ -62,7 +72,8 @@ function rcube_identity_form($attrib)
'organization' => array('type' => 'text'),
'reply-to' => array('type' => 'text', 'label' => 'replyto'),
'bcc' => array('type' => 'text'),
- 'signature' => array('type' => 'textarea'),
+ 'signature' => array('type' => 'textarea', 'size' => "40", 'rows' => "6"),
+ 'html_signature'=>array('type' => 'checkbox', 'label' => 'htmlsignature', 'onclick' => 'return rcmail.toggle_editor(this, \'_signature\');'),
'standard' => array('type' => 'checkbox', 'label' => 'setdefault'));
@@ -87,6 +98,25 @@ function rcube_identity_form($attrib)
foreach ($a_show_cols as $col => $colprop)
{
$attrib['id'] = 'rcmfd_'.$col;
+
+ if (strlen($colprop['onclick']))
+ $attrib['onclick'] = $colprop['onclick'];
+ else
+ unset($attrib['onclick']);
+
+ if ($col == 'signature')
+ {
+ $attrib['size'] = $colprop['size'];
+ $attrib['rows'] = $colprop['rows'];
+ $attrib['mce_editable'] = $IDENTITY_RECORD['html_signature'] ? "true" : "false";
+ }
+ else
+ {
+ unset($attrib['size']);
+ unset($attrib['rows']);
+ unset($attrib['mce_editable']);
+ }
+
$label = strlen($colprop['label']) ? $colprop['label'] : $col;
$value = rcmail_get_edit_field($col, $IDENTITY_RECORD[$col], $attrib, $colprop['type']);
diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc
index f08b75af8..fd985726d 100644
--- a/program/steps/settings/func.inc
+++ b/program/steps/settings/func.inc
@@ -147,6 +147,14 @@ function rcmail_user_prefs_form($attrib)
rep_specialchars_output(rcube_label('prettydate')),
$input_prettydate->show($CONFIG['prettydate']?1:0));
+ // Show checkbox for HTML Editor
+ $field_id = 'rcmfd_htmleditor';
+ $input_htmleditor = new checkbox(array('name' => '_htmleditor', 'id' => $field_id, 'value' => 1));
+ $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
+ $field_id,
+ rep_specialchars_output(rcube_label('htmleditor')),
+ $input_htmleditor->show($CONFIG['htmleditor']?1:0));
+
if (!empty($CONFIG['drafts_mbox']))
{
$field_id = 'rcmfd_autosave';
@@ -168,7 +176,6 @@ function rcmail_user_prefs_form($attrib)
-
function rcmail_identities_list($attrib)
{
global $DB, $CONFIG, $OUTPUT, $JS_OBJECT_NAME;
diff --git a/program/steps/settings/save_identity.inc b/program/steps/settings/save_identity.inc
index ffbcfe3d9..60a6855f0 100644
--- a/program/steps/settings/save_identity.inc
+++ b/program/steps/settings/save_identity.inc
@@ -19,9 +19,9 @@
*/
-$a_save_cols = array('name', 'email', 'organization', 'reply-to', 'bcc', 'standard', 'signature');
+$a_save_cols = array('name', 'email', 'organization', 'reply-to', 'bcc', 'standard', 'signature', 'html_signature');
$a_html_cols = array('signature');
-
+$a_boolean_cols = array('standard', 'html_signature');
// check input
if (empty($_POST['_name']) || empty($_POST['_email']))
@@ -48,6 +48,17 @@ if ($_POST['_iid'])
$DB->quote(get_input_value($fname, RCUBE_INPUT_POST, in_array($col, $a_html_cols))));
}
+ // set "off" values for checkboxes that were not checked, and therefore
+ // not included in the POST body.
+ foreach ($a_boolean_cols as $col)
+ {
+ $fname = '_' . $col;
+ if (!isset($_POST[$fname]))
+ {
+ $a_write_sql[] = sprintf("%s=0", $DB->quoteIdentifier($col));
+ }
+ }
+
if (sizeof($a_write_sql))
{
$DB->query("UPDATE ".get_table_name('identities')."
diff --git a/program/steps/settings/save_prefs.inc b/program/steps/settings/save_prefs.inc
index 73fb231f2..a438de002 100644
--- a/program/steps/settings/save_prefs.inc
+++ b/program/steps/settings/save_prefs.inc
@@ -28,6 +28,7 @@ $a_user_prefs['timezone'] = isset($_POST['_timezone']) ? floatval($_POST['_timez
$a_user_prefs['dst_active'] = isset($_POST['_dst_active']) ? TRUE : FALSE;
$a_user_prefs['pagesize'] = is_numeric($_POST['_pagesize']) ? (int)$_POST['_pagesize'] : $CONFIG['pagesize'];
$a_user_prefs['prefer_html'] = isset($_POST['_prefer_html']) ? TRUE : FALSE;
+$a_user_prefs['htmleditor'] = isset($_POST['_htmleditor']) ? TRUE : FALSE;
$a_user_prefs['draft_autosave'] = isset($_POST['_draft_autosave']) ? intval($_POST['_draft_autosave']) : 0;
// MM: Date format toggle (Pretty / Standard)
@@ -49,4 +50,4 @@ $_action = 'preferences';
// overwrite action variable
$OUTPUT->add_script(sprintf("\n%s.set_env('action', '%s');", $JS_OBJECT_NAME, $_action));
-?> \ No newline at end of file
+?>
diff --git a/skins/default/editor_content.css b/skins/default/editor_content.css
new file mode 100644
index 000000000..182e79121
--- /dev/null
+++ b/skins/default/editor_content.css
@@ -0,0 +1,58 @@
+/* This file contains the CSS data for the editable area(iframe) of TinyMCE */
+/* You can extend this CSS by adding your own CSS file with the the content_css option */
+
+body, td, pre {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+body {
+ background-color: #FFFFFF;
+}
+
+.mceVisualAid {
+ border: 1px dashed #BBBBBB !important;
+}
+
+div.mceVisualAid {
+ background-image:url('../images/spacer.gif');
+ visibility: visible !important;
+}
+
+.mceItemAnchor {
+ width: 12px;
+ line-height: 6px;
+ overflow: hidden;
+ padding-left: 12px;
+ background-image: url('../images/anchor_symbol.gif');
+ background-position: bottom;
+ background-repeat: no-repeat;
+}
+
+/* Important is needed in Gecko browsers inorder to style links */
+/*
+a {
+ color: green !important;
+}
+*/
+
+/* Style selection range colors in Gecko browsers */
+/*
+::-moz-selection {
+ background-color: red;
+ color: green;
+}
+*/
+
+/* MSIE specific */
+
+* html body {
+ scrollbar-3dlight-color: #F0F0EE;
+ scrollbar-arrow-color: #676662;
+ scrollbar-base-color: #F0F0EE;
+ scrollbar-darkshadow-color: #DDDDDD;
+ scrollbar-face-color: #E0E0DD;
+ scrollbar-highlight-color: #F0F0EE;
+ scrollbar-shadow-color: #F0F0EE;
+ scrollbar-track-color: #F5F5F5;
+}
diff --git a/skins/default/editor_popup.css b/skins/default/editor_popup.css
new file mode 100644
index 000000000..2bae9158a
--- /dev/null
+++ b/skins/default/editor_popup.css
@@ -0,0 +1,327 @@
+/* This file contains the CSS data for all popups in TinyMCE */
+
+body {
+ background-color: #F0F0EE;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 11px;
+ scrollbar-3dlight-color: #F0F0EE;
+ scrollbar-arrow-color: #676662;
+ scrollbar-base-color: #F0F0EE;
+ scrollbar-darkshadow-color: #DDDDDD;
+ scrollbar-face-color: #E0E0DD;
+ scrollbar-highlight-color: #F0F0EE;
+ scrollbar-shadow-color: #F0F0EE;
+ scrollbar-track-color: #F5F5F5;
+ margin: 8px;
+}
+
+td {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 11px;
+}
+
+input {
+ background: #FFFFFF;
+ border: 1px solid #cccccc;
+}
+
+td, input, select, textarea {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+input, select, textarea {
+ border: 1px solid #808080;
+}
+
+.input_noborder {
+ border: 0;
+}
+
+#insert, .updateButton {
+ font-weight: bold;
+ width: 90px;
+ height: 21px;
+ border: 0;
+ background-image: url('../images/insert_button_bg.gif');
+ cursor: pointer;
+}
+
+#cancel {
+ font-weight: bold;
+ width: 90px;
+ height: 21px;
+ border: 0;
+ background-image: url('../images/cancel_button_bg.gif');
+ cursor: pointer;
+}
+
+/* Mozilla only style */
+html>body #insert, html>body #cancel {
+ padding-bottom: 2px;
+}
+
+.title {
+ font-size: 12px;
+ font-weight: bold;
+ color: #2B6FB6;
+}
+
+table.charmap {
+ border-style: solid;
+ border-width: 1px;
+ border-color: #AAAAAA;
+}
+
+td.charmap, td.charmapOver {
+ color: #000000;
+ border-color: #AAAAAA;
+ border-style: solid;
+ border-width: 1px;
+ text-align: center;
+ font-size: 12px;
+}
+
+td.charmapOver {
+ background-color: #CCCCCC;
+ cursor: default;
+}
+
+a.charmap {
+ color: #000000;
+ text-decoration: none
+}
+
+.wordWrapCode {
+ vertical-align: middle;
+ border: 1px none #000000;
+ background-color: transparent;
+}
+
+input.radio {
+ border: 1px none #000000;
+ background-color: transparent;
+ vertical-align: middle;
+}
+
+input.checkbox {
+ border: 1px none #000000;
+ background-color: transparent;
+ vertical-align: middle;
+}
+
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {
+ margin-left: 1px;
+}
+
+.mceButtonNormal {
+ border-top: 1px solid;
+ border-left: 1px solid;
+ border-bottom: 1px solid;
+ border-right: 1px solid;
+ border-color: #F0F0EE;
+ cursor: default;
+}
+
+.mceButtonOver {
+ border: 1px solid #0A246A;
+ cursor: default;
+ background-color: #B6BDD2;
+}
+
+.mceButtonDown {
+ cursor: default;
+ border: 1px solid #0A246A;
+ background-color: #8592B5;
+}
+
+.mceButtonDisabled {
+ filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+ -moz-opacity:0.3;
+ opacity: 0.3;
+ border-top: 1px solid;
+ border-left: 1px solid;
+ border-bottom: 1px solid;
+ border-right: 1px solid;
+ border-color: #F0F0EE;
+ cursor: default;
+}
+
+.mceActionPanel {
+ margin-top: 5px;
+}
+
+/* Tabs classes */
+
+.tabs {
+ float: left;
+ width: 100%;
+ line-height: normal;
+ background-image: url("../images/xp/tabs_bg.gif");
+}
+
+.tabs ul {
+ margin: 0;
+ padding: 0 0 0;
+ list-style: none;
+}
+
+.tabs li {
+ float: left;
+ background: url("../images/xp/tab_bg.gif") no-repeat left top;
+ margin: 0;
+ margin-left: 0;
+ margin-right: 2px;
+ padding: 0 0 0 10px;
+ line-height: 18px;
+}
+
+.tabs li.current {
+ background: url("../images/xp/tab_sel_bg.gif") no-repeat left top;
+ margin-right: 2px;
+}
+
+.tabs span {
+ float: left;
+ display: block;
+ background: url("../images/xp/tab_end.gif") no-repeat right top;
+ padding: 0px 10px 0 0;
+}
+
+.tabs .current span {
+ background: url("../images/xp/tab_sel_end.gif") no-repeat right top;
+}
+
+.tabs a {
+ text-decoration: none;
+ font-family: Verdana, Arial;
+ font-size: 10px;
+}
+
+.tabs a:link, .tabs a:visited, .tabs a:hover {
+ color: black;
+}
+
+.tabs a:hover {
+}
+
+.tabs .current {
+}
+
+.tabs .current a, .tabs .current a:link, .tabs .current a:visited {
+}
+
+.panel_wrapper div.panel {
+ display: none;
+}
+
+.panel_wrapper div.current {
+ display: block;
+ width: 100%;
+ height: 300px;
+ overflow: visible; /* Should be auto but that breaks Safari */
+}
+
+.panel_wrapper {
+ border: 1px solid #919B9C;
+ border-top: 0px;
+ padding: 10px;
+ padding-top: 5px;
+ clear: both;
+ background-color: white;
+}
+
+fieldset {
+ border: 1px solid #919B9C;
+ font-family: Verdana, Arial;
+ font-size: 10px;
+ padding: 0;
+ margin: 0;
+ padding: 4px;
+}
+
+legend {
+ color: #2B6FB6;
+ font-weight: bold;
+}
+
+.properties {
+ width: 100%;
+}
+
+.properties .column1 {
+}
+
+.properties .column2 {
+ text-align: left;
+}
+
+a:link, a:visited {
+ color: black;
+}
+
+a:hover {
+ color: #2B6FB6;
+}
+
+#plugintable thead {
+ font-weight: bold;
+ background-color: #DDDDDD;
+}
+
+#plugintable, #about #plugintable td {
+ border: 1px solid #919B9C;
+}
+
+#plugintable {
+ width: 99%;
+ margin-top: 10px;
+}
+
+#pluginscontainer {
+ height: 290px;
+ overflow: auto;
+}
+
+/* MSIE Specific styles */
+
+* html .panel_wrapper {
+ width: 100%;
+}
+
+.column {
+ float: left;
+}
+
+h1, h2, h3, h4 {
+ color: #2B6FB6;
+ margin: 0;
+ padding: 0;
+ padding-top: 5px;
+}
+
+h3 {
+ font-size: 14px;
+}
+
+#link .panel_wrapper, #link div.current {
+ height: 125px;
+}
+
+#image .panel_wrapper, #image div.current {
+ height: 190px;
+}
+
+/* Disables the advanced tab in the table plugin. */
+/*
+#table #advanced_tab {
+ display: none;
+}
+*/
+
+/* Disables the border input field and label in the table plugin. */
+/*
+#table #border, #table #borderlabel {
+ display: none;
+}
+*/
diff --git a/skins/default/editor_ui.css b/skins/default/editor_ui.css
new file mode 100644
index 000000000..c51be6c89
--- /dev/null
+++ b/skins/default/editor_ui.css
@@ -0,0 +1,353 @@
+/* This file contains the CSS data for the editor UI of TinyMCE instances */
+
+.mceToolbarTop a, .mceToolbarTop a:visited, .mceToolbarTop a:hover, .mceToolbarBottom a, .mceToolbarBottom a:visited, .mceToolbarBottom a:hover {
+ border: 0; margin: 0; padding: 0; background: transparent;
+}
+
+.mceSeparatorLine {
+ border: 0;
+ padding: 0;
+ margin-left: 4px;
+ margin-right: 2px;
+}
+
+.mceSelectList {
+ font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;
+ font-size: 7pt !important;
+ font-weight: normal;
+ margin-top: 3px;
+ padding: 0;
+ display: inline;
+ vertical-align: top;
+ background-color: #F0F0EE;
+}
+
+.mceLabel, .mceLabelDisabled {
+ font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;
+ font-size: 9pt;
+}
+
+.mceLabel {
+ color: #000000;
+}
+
+.mceLabelDisabled {
+ cursor: text;
+ color: #999999;
+}
+
+.mceEditor {
+ background: #F0F0EE;
+ border: 1px solid #cccccc;
+ padding: 0;
+ margin: 0;
+}
+
+.mceEditorArea {
+ font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;
+ background: #FFFFFF;
+ padding: 0;
+ margin: 0;
+}
+
+.mceToolbarTop, .mceToolbarBottom {
+ background: #F0F0EE;
+ line-height: 1px;
+ font-size: 1px;
+}
+
+.mceToolbarTop {
+ border-bottom: 1px solid #cccccc;
+ padding-bottom: 1px;
+}
+
+.mceToolbarBottom {
+ border-top: 1px solid #cccccc;
+}
+
+.mceStatusbarTop, .mceStatusbarBottom, .mceStatusbar {
+ height: 20px;
+}
+
+.mceStatusbarTop .mceStatusbarPathText, .mceStatusbarBottom .mceStatusbarPathText, .mceStatusbar .mceStatusbarPathText {
+ font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;
+ font-size: 9pt;
+ padding: 2px;
+ line-height: 16px;
+ overflow: visible;
+}
+
+.mceStatusbarTop {
+ border-bottom: 1px solid #cccccc;
+}
+
+.mceStatusbarBottom {
+ border-top: 1px solid #cccccc;
+}
+
+.mceStatusbar {
+ border-bottom: 1px solid #cccccc;
+}
+
+.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover {
+ text-decoration: none;
+ font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;
+ font-size: 9pt;
+ color: #000000;
+}
+
+.mcePathItem:hover {
+ text-decoration: underline;
+}
+
+.mceStatusbarPathText {
+ float: left;
+}
+
+.mceStatusbarResize {
+ float: right;
+ background-image: url('../images/statusbar_resize.gif');
+ background-repeat: no-repeat;
+ width: 11px;
+ height: 20px;
+ cursor: se-resize;
+}
+
+.mceResizeBox {
+ width: 10px;
+ height: 10px;
+ display: none;
+ border: 1px dotted gray;
+ margin: 0;
+ padding: 0;
+}
+
+.mceEditorIframe {
+ border: 0;
+}
+
+/* Button CSS rules */
+
+a.mceButtonDisabled img, a.mceButtonNormal img, a.mceButtonSelected img {
+ width: 20px;
+ height: 20px;
+ cursor: default;
+ margin-top: 1px;
+ margin-left: 1px;
+}
+
+a.mceButtonDisabled img {
+ border: 0 !important;
+}
+
+a.mceButtonNormal img, a.mceButtonSelected img {
+ border: 1px solid #F0F0EE !important;
+}
+
+a.mceButtonSelected img {
+ border: 1px solid #6779AA !important;
+ background-color: #D4D5D8;
+}
+
+a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {
+ border: 1px solid #0A246A !important;
+ cursor: default;
+ background-color: #B6BDD2;
+}
+
+a.mceButtonDisabled img {
+ -moz-opacity:0.3;
+ opacity: 0.3;
+ border: 1px solid #F0F0EE !important;
+ cursor: default;
+}
+
+a.mceTiledButton img {
+ background-image: url('../images/buttons.gif');
+ background-repeat: no-repeat;
+}
+
+/* MSIE specific rules */
+
+* html a.mceButtonNormal img, * html a.mceButtonSelected img, * html a.mceButtonDisabled img {
+ border: 0 !important;
+ margin-top: 2px;
+ margin-bottom: 1px;
+}
+
+* html a.mceButtonDisabled img {
+ filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+ border: 0 !important;
+}
+
+* html a.mceButtonDisabled {
+ border: 1px solid #F0F0EE !important;
+}
+
+* html a.mceButtonNormal, * html a.mceButtonSelected {
+ border: 1px solid #F0F0EE !important;
+ cursor: default;
+}
+
+* html a.mceButtonSelected {
+ border: 1px solid #6779AA !important;
+ background-color: #D4D5D8;
+}
+
+* html a.mceButtonNormal:hover, * html a.mceButtonSelected:hover {
+ border: 1px solid #0A246A !important;
+ cursor: default;
+ background-color: #B6BDD2;
+}
+
+* html .mceSelectList {
+ margin-top: 2px;
+}
+
+/* Menu button CSS rules */
+
+span.mceMenuButton img, span.mceMenuButtonSelected img {
+ border: 1px solid #F0F0EE;
+ margin-left: 1px;
+}
+
+span.mceMenuButtonSelected img {
+ border: 1px solid #6779AA;
+ background-color: #B6BDD2;
+}
+
+span.mceMenuButtonSelected img.mceMenuButton {
+ border: 1px solid #F0F0EE;
+ background-color: transparent;
+}
+
+span.mceMenuButton img.mceMenuButton, span.mceMenuButtonSelected img.mceMenuButton {
+ border-left: 0;
+ margin-left: 0;
+}
+
+span.mceMenuButton:hover img, span.mceMenuButtonSelected:hover img {
+ border: 1px solid #0A246A;
+ background-color: #B6BDD2;
+}
+
+span.mceMenuButton:hover img.mceMenuButton, span.mceMenuButtonSelected:hover img.mceMenuButton {
+ border-left: 0;
+}
+
+span.mceMenuButtonFocus img {
+ border: 1px solid gray;
+ border-right: 0;
+ margin-left: 1px;
+ background-color: #F5F4F2;
+}
+
+span.mceMenuButtonFocus img.mceMenuButton {
+ border: 1px solid gray;
+ border-left: 1px solid #F5F4F2;
+ margin-left: 0;
+}
+
+/* Menu button MSIE specific rules */
+
+* html span.mceMenuButton, * html span.mceMenuButtonFocus {
+ position: relative;
+ left: 0;
+ top: 0;
+}
+
+* html span.mceMenuButton img, * html span.mceMenuButtonSelected img, * html span.mceMenuButtonFocus img {
+ position: relative;
+ top: 1px;
+}
+
+* html span.mceMenuHover img {
+ border: 1px solid #0A246A;
+ background-color: #B6BDD2;
+}
+
+* html span.mceMenuButtonSelected.mceMenuHover img.mceMenuButton {
+ border: 1px solid #0A246A;
+ background-color: #B6BDD2;
+ border-left: 0;
+}
+
+/* Menu */
+
+.mceMenu {
+ position: absolute;
+ left: 0;
+ top: 0;
+ display: none;
+ z-index: 100;
+ background-color: white;
+ border: 1px solid gray;
+ font-weight: normal;
+}
+
+.mceMenu a, .mceMenuTitle, .mceMenuDisabled {
+ display: block;
+ width: 100%;
+ text-decoration: none;
+ background-color: white;
+ font-family: Tahoma, Verdana, Arial, Helvetica;
+ font-size: 11px;
+ line-height: 20px;
+ color: black;
+}
+
+.mceMenu a:hover {
+ background-color: #B6BDD2;
+ color: black;
+ text-decoration: none !important;
+}
+
+.mceMenu span {
+ padding-left: 10px;
+ padding-right: 10px;
+ display: block;
+ line-height: 20px;
+}
+
+.mceMenuSeparator {
+ border-bottom: 1px solid gray;
+ background-color: gray;
+ height: 1px;
+}
+
+.mceMenuTitle span {
+ padding-left: 5px;
+}
+
+.mceMenuTitle {
+ background-color: #DDDDDD;
+ font-weight: bold;
+}
+
+.mceMenuDisabled {
+ color: gray;
+}
+
+span.mceMenuSelectedItem {
+ background-image: url('../images/menu_check.gif');
+ background-repeat: no-repeat;
+ background-position: 5px 8px;
+ padding-left: 20px;
+}
+
+span.mceMenuCheckItem {
+ padding-left: 20px;
+}
+
+span.mceMenuLine {
+ display: block;
+ position: absolute;
+ left: 0;
+ top: -1px;
+ background-color: #F5F4F2;
+ width: 30px;
+ height: 1px;
+ overflow: hidden;
+ padding-left: 0;
+ padding-right: 0;
+}
diff --git a/skins/default/templates/compose.html b/skins/default/templates/compose.html
index ed44bb56c..2c11e0015 100644
--- a/skins/default/templates/compose.html
+++ b/skins/default/templates/compose.html
@@ -106,7 +106,9 @@ function rcmail_toggle_display(id)
<td align="right">
<roundcube:label name="charset" />:&nbsp;<roundcube:object name="charsetSelector" tabindex="8" />
</td>
-
+<td align="right">
+ <roundcube:label name="editortype" />:&nbsp;<roundcube:object name="editorSelector" tabindex="9" />
+</td>
</tr></tbody></table>
</td>
diff --git a/skins/default/templates/ldappublicsearch.html b/skins/default/templates/ldappublicsearch.html
index 70570c06f..d9714cb85 100644
--- a/skins/default/templates/ldappublicsearch.html
+++ b/skins/default/templates/ldappublicsearch.html
@@ -22,7 +22,7 @@
<roundcube:object name="ldappublicaddresslist"
id="ldappublicaddresslist"
cellspacing="0"
- summary="Ldap email address list" />
+ summary="LDAP email address list" />
</div>
<roundcube:include file="/includes/ldapscripts.html" />