svncommit
2006-09-13 a0109c4933e0bfb5ed9dbcf94f932991ca689542
Initial TinyMCE editor support (still need to work on spellcheck and skins)



24 files modified
177 files added
15973 ■■■■■ changed files
CHANGELOG 6 ●●●●● patch | view | raw | blame | history
SQL/mysql.initial.sql 1 ●●●● patch | view | raw | blame | history
SQL/mysql.update.sql 2 ●●●●● patch | view | raw | blame | history
SQL/mysql5.initial.sql 3 ●●●● patch | view | raw | blame | history
SQL/postgres.initial.sql 3 ●●●● patch | view | raw | blame | history
SQL/postgres.update.sql 2 ●●●●● patch | view | raw | blame | history
SQL/sqlite.initial.sql 3 ●●●● patch | view | raw | blame | history
index.php 17 ●●●●● patch | view | raw | blame | history
program/include/bugs.inc 14 ●●●●● patch | view | raw | blame | history
program/include/main.inc 18 ●●●● patch | view | raw | blame | history
program/include/rcube_shared.inc 81 ●●●● patch | view | raw | blame | history
program/js/app.js 117 ●●●● patch | view | raw | blame | history
program/js/editor.js 148 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/blank.htm 9 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/langs/en.js 41 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/langs/readme.txt 7 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/license.txt 437 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/cleanup/editor_plugin.js patch | view | raw | blame | history
program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js 12 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/cleanup/readme.txt 1 ●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/editor_plugin.js 1 ●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/editor_plugin_src.js 65 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/emotions.htm 40 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/emotions.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/readme.txt 2 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/jscripts/functions.js 21 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/langs/en.js 22 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/emotions/readme.txt 1 ●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/readme.txt 1 ●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/searchreplace/editor_plugin.js 1 ●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js 185 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/searchreplace/images/replace.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/searchreplace/images/search.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/searchreplace/jscripts/replace.js 40 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/searchreplace/jscripts/search.js 36 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/searchreplace/langs/en.js 21 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/searchreplace/readme.txt 1 ●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/searchreplace/replace.htm 49 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/searchreplace/search.htm 42 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/cell.htm 182 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/css/cell.css 17 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/css/row.css 25 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/css/table.css 13 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/editor_plugin.js 1 ●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/editor_plugin_src.js 1054 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/buttons.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_cell_props.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_delete.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_delete_col.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_delete_row.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_merge_cells.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_row_props.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/images/table_split_cells.gif patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/jscripts/cell.js 249 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/jscripts/merge_cells.js 19 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/jscripts/row.js 200 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/jscripts/table.js 344 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/langs/en.js 78 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/merge_cells.htm 37 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/readme.txt 1 ●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/row.htm 159 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/plugins/table/table.htm 155 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/about.htm 52 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/anchor.htm 33 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/charmap.htm 53 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/color_picker.htm 13 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/about.htm 31 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/common_buttons.htm 162 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm 45 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/index.htm 27 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm 32 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/insert_image_button.htm 65 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/insert_link_button.htm 33 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/insert_table_button.htm 71 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/docs/en/style.css 28 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/editor_template.js 1 ●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/editor_template_src.js 1411 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/image.htm 100 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/anchor.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/backcolor.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/bold.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/bold_de_se.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/bold_es.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/bold_fr.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/bold_ru.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/bold_tw.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/browse.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/bullist.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/button_menu.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/buttons.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/charmap.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/cleanup.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/close.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/code.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/color.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/copy.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/custom_1.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/cut.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/forecolor.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/help.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/hr.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/image.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/indent.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/italic.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/italic_de_se.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/italic_es.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/italic_ru.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/italic_tw.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/justifycenter.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/justifyfull.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/justifyleft.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/justifyright.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/link.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/menu_check.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/newdocument.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/numlist.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/opacity.png patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/outdent.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/paste.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/redo.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/removeformat.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/separator.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/spacer.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/strikethrough.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/sub.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/sup.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/underline.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/underline_es.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/underline_fr.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/underline_ru.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/underline_tw.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/undo.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/unlink.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/visualaid.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/jscripts/about.js 75 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/jscripts/anchor.js 74 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/jscripts/charmap.js 326 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/jscripts/color_picker.js 108 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/jscripts/image.js 81 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/jscripts/link.js 70 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/jscripts/source_editor.js 66 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/langs/en.js 81 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/link.htm 100 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/themes/advanced/source_editor.htm 30 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/tiny_mce.js 1 ●●●● patch | view | raw | blame | history
program/js/tiny_mce/tiny_mce_popup.js 272 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/tiny_mce_src.js 6719 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/utils/editable_selects.js 63 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/utils/form_utils.js 210 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/utils/mclayer.js 212 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/utils/mctabs.js 76 ●●●●● patch | view | raw | blame | history
program/js/tiny_mce/utils/validate.js 50 ●●●●● patch | view | raw | blame | history
program/lib/Mail/mime.php 19 ●●●● patch | view | raw | blame | history
program/localization/en_US/labels.inc 15 ●●●●● patch | view | raw | blame | history
program/localization/en_US/messages.inc 1 ●●●● patch | view | raw | blame | history
program/steps/mail/compose.inc 243 ●●●● patch | view | raw | blame | history
program/steps/mail/func.inc 60 ●●●●● patch | view | raw | blame | history
program/steps/mail/sendmail.inc 75 ●●●●● patch | view | raw | blame | history
program/steps/settings/edit_identity.inc 34 ●●●●● patch | view | raw | blame | history
program/steps/settings/func.inc 9 ●●●● patch | view | raw | blame | history
program/steps/settings/save_identity.inc 15 ●●●● patch | view | raw | blame | history
program/steps/settings/save_prefs.inc 3 ●●●● patch | view | raw | blame | history
skins/default/editor_content.css 58 ●●●●● patch | view | raw | blame | history
skins/default/editor_popup.css 327 ●●●●● patch | view | raw | blame | history
skins/default/editor_ui.css 353 ●●●●● patch | view | raw | blame | history
skins/default/templates/compose.html 4 ●●● patch | view | raw | blame | history
skins/default/templates/ldappublicsearch.html 2 ●●● patch | view | raw | blame | history
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)
SQL/mysql.initial.sql
@@ -58,6 +58,7 @@
  `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`)
);
SQL/mysql.update.sql
@@ -7,3 +7,5 @@
  ADD `structure` TEXT,
  ADD UNIQUE `uniqueness` (`cache_key`, `uid`);
ALTER TABLE 'identities'
  ADD 'html_signature' tinyint(1) default 0 NOT NULL;
SQL/mysql5.initial.sql
@@ -114,6 +114,7 @@
 `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 @@
) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
SET FOREIGN_KEY_CHECKS=1;
SET FOREIGN_KEY_CHECKS=1;
SQL/postgres.initial.sql
@@ -69,7 +69,8 @@
    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
);
SQL/postgres.update.sql
@@ -5,3 +5,5 @@
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;
SQL/sqlite.initial.sql
@@ -58,7 +58,8 @@
  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);
index.php
@@ -81,6 +81,7 @@
require_once('include/bugs.inc');
require_once('include/main.inc');
require_once('include/cache.inc');
require_once('lib/html2text.inc');
require_once('PEAR.php');
@@ -143,6 +144,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;
  }
@@ -240,7 +256,6 @@
  rcube_remote_response('');
  exit;
  }
// include task specific files
if ($_task=='mail')
program/include/bugs.inc
@@ -115,5 +115,19 @@
    }
  }
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);
   }
}
?>
program/include/main.inc
@@ -375,7 +375,7 @@
  // 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 @@
        '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 @@
  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 @@
    $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 @@
  }
/**
 * 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;
program/include/rcube_shared.inc
@@ -28,13 +28,15 @@
  
  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 @@
    $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 @@
      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 @@
  
  
    // 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 @@
    $__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 @@
    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 @@
        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 @@
          {
          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 @@
      }
    }
  else
    {
    return $arr;
    }
  }
@@ -1437,4 +1467,31 @@
  }
/**
 * 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;
      }
  }
?>
program/js/app.js
@@ -142,7 +142,7 @@
          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 @@
          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 @@
        // 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 @@
    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 @@
      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 @@
      }
    // check for empty body
    if (input_message.value=='')
    if ((input_message.value=='')&&(tinyMCE.getContent()==''))
      {
      if (!confirm(this.get_label('nobodywarning')))
        {
@@ -2079,35 +2079,67 @@
    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 @@
    };
  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 @@
      }
    }
  // sedn GET request
  // send GET request
  this.GET = function(url)
    {
    this.build();
@@ -3841,9 +3885,28 @@
    };
  this.POST = function(url, a_param)
  this.POST = function(url, body, contentType)
    {
    // not implemented yet
    // default value for contentType if not provided
    contentType = typeof(contentType) != 'undefined' ?
        contentType : 'application/x-www-form-urlencoded';
    this.build();
    if (!this.xmlhttp)
    {
       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);
    };
program/js/editor.js
New file
@@ -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);
}
program/js/tiny_mce/blank.htm
New file
@@ -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>
program/js/tiny_mce/langs/en.js
New file
@@ -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.'
});
program/js/tiny_mce/langs/readme.txt
New file
@@ -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.
program/js/tiny_mce/license.txt
New file
@@ -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
program/js/tiny_mce/plugins/cleanup/editor_plugin.js
program/js/tiny_mce/plugins/cleanup/editor_plugin_src.js
New file
@@ -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 */
program/js/tiny_mce/plugins/cleanup/readme.txt
New file
@@ -0,0 +1 @@
Dummy plugin since cleanup is now moved into core.
program/js/tiny_mce/plugins/emotions/editor_plugin.js
New file
@@ -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);
program/js/tiny_mce/plugins/emotions/editor_plugin_src.js
New file
@@ -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);
program/js/tiny_mce/plugins/emotions/emotions.htm
New file
@@ -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>
program/js/tiny_mce/plugins/emotions/images/emotions.gif
program/js/tiny_mce/plugins/emotions/images/readme.txt
New file
@@ -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.
program/js/tiny_mce/plugins/emotions/images/smiley-cool.gif
program/js/tiny_mce/plugins/emotions/images/smiley-cry.gif
program/js/tiny_mce/plugins/emotions/images/smiley-embarassed.gif
program/js/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif
program/js/tiny_mce/plugins/emotions/images/smiley-frown.gif
program/js/tiny_mce/plugins/emotions/images/smiley-innocent.gif
program/js/tiny_mce/plugins/emotions/images/smiley-kiss.gif
program/js/tiny_mce/plugins/emotions/images/smiley-laughing.gif
program/js/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif
program/js/tiny_mce/plugins/emotions/images/smiley-sealed.gif
program/js/tiny_mce/plugins/emotions/images/smiley-smile.gif
program/js/tiny_mce/plugins/emotions/images/smiley-surprised.gif
program/js/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif
program/js/tiny_mce/plugins/emotions/images/smiley-undecided.gif
program/js/tiny_mce/plugins/emotions/images/smiley-wink.gif
program/js/tiny_mce/plugins/emotions/images/smiley-yell.gif
program/js/tiny_mce/plugins/emotions/jscripts/functions.js
New file
@@ -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();
}
program/js/tiny_mce/plugins/emotions/langs/en.js
New file
@@ -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'
});
program/js/tiny_mce/plugins/emotions/readme.txt
New file
@@ -0,0 +1 @@
Check the TinyMCE documentation for details on this plugin.
program/js/tiny_mce/plugins/readme.txt
New file
@@ -0,0 +1 @@
This is the location you place TinyMCE plugins.
program/js/tiny_mce/plugins/searchreplace/editor_plugin.js
New file
@@ -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);
program/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js
New file
@@ -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);
program/js/tiny_mce/plugins/searchreplace/images/replace.gif
program/js/tiny_mce/plugins/searchreplace/images/search.gif
program/js/tiny_mce/plugins/searchreplace/jscripts/replace.js
New file
@@ -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();
}
program/js/tiny_mce/plugins/searchreplace/jscripts/search.js
New file
@@ -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();
}
program/js/tiny_mce/plugins/searchreplace/langs/en.js
New file
@@ -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'
});
program/js/tiny_mce/plugins/searchreplace/readme.txt
New file
@@ -0,0 +1 @@
Check the TinyMCE documentation for details on this plugin.
program/js/tiny_mce/plugins/searchreplace/replace.htm
New file
@@ -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>
program/js/tiny_mce/plugins/searchreplace/search.htm
New file
@@ -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>
program/js/tiny_mce/plugins/table/cell.htm
New file
@@ -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>
program/js/tiny_mce/plugins/table/css/cell.css
New file
@@ -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;
}
program/js/tiny_mce/plugins/table/css/row.css
New file
@@ -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;
}
program/js/tiny_mce/plugins/table/css/table.css
New file
@@ -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;
}
program/js/tiny_mce/plugins/table/editor_plugin.js
New file
@@ -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);
program/js/tiny_mce/plugins/table/editor_plugin_src.js
New file
@@ -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);
program/js/tiny_mce/plugins/table/images/buttons.gif
program/js/tiny_mce/plugins/table/images/table.gif
program/js/tiny_mce/plugins/table/images/table_cell_props.gif
program/js/tiny_mce/plugins/table/images/table_delete.gif
program/js/tiny_mce/plugins/table/images/table_delete_col.gif
program/js/tiny_mce/plugins/table/images/table_delete_row.gif
program/js/tiny_mce/plugins/table/images/table_insert_col_after.gif
program/js/tiny_mce/plugins/table/images/table_insert_col_before.gif
program/js/tiny_mce/plugins/table/images/table_insert_row_after.gif
program/js/tiny_mce/plugins/table/images/table_insert_row_before.gif
program/js/tiny_mce/plugins/table/images/table_merge_cells.gif
program/js/tiny_mce/plugins/table/images/table_row_props.gif
program/js/tiny_mce/plugins/table/images/table_split_cells.gif
program/js/tiny_mce/plugins/table/jscripts/cell.js
New file
@@ -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');
    }
}
program/js/tiny_mce/plugins/table/jscripts/merge_cells.js
New file
@@ -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();
}
program/js/tiny_mce/plugins/table/jscripts/row.js
New file
@@ -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);
}
program/js/tiny_mce/plugins/table/jscripts/table.js
New file
@@ -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');
    }
}
program/js/tiny_mce/plugins/table/langs/en.js
New file
@@ -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.'
});
program/js/tiny_mce/plugins/table/merge_cells.htm
New file
@@ -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>
program/js/tiny_mce/plugins/table/readme.txt
New file
@@ -0,0 +1 @@
Check the TinyMCE documentation for details on this plugin.
program/js/tiny_mce/plugins/table/row.htm
New file
@@ -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>
program/js/tiny_mce/plugins/table/table.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/about.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/anchor.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/charmap.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/color_picker.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/docs/en/about.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/docs/en/common_buttons.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif
program/js/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif
program/js/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif
program/js/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif
program/js/tiny_mce/themes/advanced/docs/en/index.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/docs/en/insert_image_button.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/docs/en/insert_link_button.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/docs/en/insert_table_button.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/docs/en/style.css
New file
@@ -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; }
program/js/tiny_mce/themes/advanced/editor_template.js
New file
@@ -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);
program/js/tiny_mce/themes/advanced/editor_template_src.js
New file
@@ -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);
program/js/tiny_mce/themes/advanced/image.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/images/anchor.gif
program/js/tiny_mce/themes/advanced/images/anchor_symbol.gif
program/js/tiny_mce/themes/advanced/images/backcolor.gif
program/js/tiny_mce/themes/advanced/images/bold.gif
program/js/tiny_mce/themes/advanced/images/bold_de_se.gif
program/js/tiny_mce/themes/advanced/images/bold_es.gif
program/js/tiny_mce/themes/advanced/images/bold_fr.gif
program/js/tiny_mce/themes/advanced/images/bold_ru.gif
program/js/tiny_mce/themes/advanced/images/bold_tw.gif
program/js/tiny_mce/themes/advanced/images/browse.gif
program/js/tiny_mce/themes/advanced/images/bullist.gif
program/js/tiny_mce/themes/advanced/images/button_menu.gif
program/js/tiny_mce/themes/advanced/images/buttons.gif
program/js/tiny_mce/themes/advanced/images/cancel_button_bg.gif
program/js/tiny_mce/themes/advanced/images/charmap.gif
program/js/tiny_mce/themes/advanced/images/cleanup.gif
program/js/tiny_mce/themes/advanced/images/close.gif
program/js/tiny_mce/themes/advanced/images/code.gif
program/js/tiny_mce/themes/advanced/images/color.gif
program/js/tiny_mce/themes/advanced/images/copy.gif
program/js/tiny_mce/themes/advanced/images/custom_1.gif
program/js/tiny_mce/themes/advanced/images/cut.gif
program/js/tiny_mce/themes/advanced/images/forecolor.gif
program/js/tiny_mce/themes/advanced/images/help.gif
program/js/tiny_mce/themes/advanced/images/hr.gif
program/js/tiny_mce/themes/advanced/images/image.gif
program/js/tiny_mce/themes/advanced/images/indent.gif
program/js/tiny_mce/themes/advanced/images/insert_button_bg.gif
program/js/tiny_mce/themes/advanced/images/italic.gif
program/js/tiny_mce/themes/advanced/images/italic_de_se.gif
program/js/tiny_mce/themes/advanced/images/italic_es.gif
program/js/tiny_mce/themes/advanced/images/italic_ru.gif
program/js/tiny_mce/themes/advanced/images/italic_tw.gif
program/js/tiny_mce/themes/advanced/images/justifycenter.gif
program/js/tiny_mce/themes/advanced/images/justifyfull.gif
program/js/tiny_mce/themes/advanced/images/justifyleft.gif
program/js/tiny_mce/themes/advanced/images/justifyright.gif
program/js/tiny_mce/themes/advanced/images/link.gif
program/js/tiny_mce/themes/advanced/images/menu_check.gif
program/js/tiny_mce/themes/advanced/images/newdocument.gif
program/js/tiny_mce/themes/advanced/images/numlist.gif
program/js/tiny_mce/themes/advanced/images/opacity.png
program/js/tiny_mce/themes/advanced/images/outdent.gif
program/js/tiny_mce/themes/advanced/images/paste.gif
program/js/tiny_mce/themes/advanced/images/redo.gif
program/js/tiny_mce/themes/advanced/images/removeformat.gif
program/js/tiny_mce/themes/advanced/images/separator.gif
program/js/tiny_mce/themes/advanced/images/spacer.gif
program/js/tiny_mce/themes/advanced/images/statusbar_resize.gif
program/js/tiny_mce/themes/advanced/images/strikethrough.gif
program/js/tiny_mce/themes/advanced/images/sub.gif
program/js/tiny_mce/themes/advanced/images/sup.gif
program/js/tiny_mce/themes/advanced/images/underline.gif
program/js/tiny_mce/themes/advanced/images/underline_es.gif
program/js/tiny_mce/themes/advanced/images/underline_fr.gif
program/js/tiny_mce/themes/advanced/images/underline_ru.gif
program/js/tiny_mce/themes/advanced/images/underline_tw.gif
program/js/tiny_mce/themes/advanced/images/undo.gif
program/js/tiny_mce/themes/advanced/images/unlink.gif
program/js/tiny_mce/themes/advanced/images/visualaid.gif
program/js/tiny_mce/themes/advanced/images/xp/tab_bg.gif
program/js/tiny_mce/themes/advanced/images/xp/tab_end.gif
program/js/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif
program/js/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif
program/js/tiny_mce/themes/advanced/images/xp/tabs_bg.gif
program/js/tiny_mce/themes/advanced/jscripts/about.js
New file
@@ -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;
}
program/js/tiny_mce/themes/advanced/jscripts/anchor.js
New file
@@ -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();
}
program/js/tiny_mce/themes/advanced/jscripts/charmap.js
New file
@@ -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;
}
program/js/tiny_mce/themes/advanced/jscripts/color_picker.js
New file
@@ -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);
}
program/js/tiny_mce/themes/advanced/jscripts/image.js
New file
@@ -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);
}
program/js/tiny_mce/themes/advanced/jscripts/link.js
New file
@@ -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();
}
program/js/tiny_mce/themes/advanced/jscripts/source_editor.js
New file
@@ -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>');
}
program/js/tiny_mce/themes/advanced/langs/en.js
New file
@@ -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'
});
program/js/tiny_mce/themes/advanced/link.htm
New file
@@ -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>
program/js/tiny_mce/themes/advanced/source_editor.htm
New file
@@ -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>
program/js/tiny_mce/tiny_mce.js
New file
@@ -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";};
program/js/tiny_mce/tiny_mce_popup.js
New file
@@ -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();
program/js/tiny_mce/tiny_mce_src.js
New file
Diff too large
program/js/tiny_mce/utils/editable_selects.js
New file
@@ -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;
        }
    }
};
program/js/tiny_mce/utils/form_utils.js
New file
@@ -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;
}
program/js/tiny_mce/utils/mclayer.js
New file
@@ -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);
    }
}
program/js/tiny_mce/utils/mctabs.js
New file
@@ -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();
program/js/tiny_mce/utils/validate.js
New file
@@ -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_])*$');
}
program/lib/Mail/mime.php
@@ -198,6 +198,16 @@
    }
    /**
    * 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 @@
     *                             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 @@
        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;
    }
program/localization/en_US/labels.inc
@@ -63,7 +63,7 @@
$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 @@
// 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['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';
program/localization/en_US/messages.inc
@@ -106,5 +106,6 @@
$messages['folderdeleted'] = 'Folder successfully deleted';
$messages['converting'] = 'Removing formatting from message...';
?>
program/steps/mail/compose.inc
@@ -53,7 +53,7 @@
$_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 @@
    }
  // 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 @@
      $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 @@
  
  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 @@
  $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_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));
  return $pefix.$body;
     $suffix = "</blockquote>";
  }
  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);
  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));
    $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_draft_body($body)
function rcmail_create_draft_body($body, $bodyIsHtml)
  {
  global $IMAP, $MESSAGE;
    
@@ -581,7 +657,7 @@
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_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;  
program/steps/mail/func.inc
@@ -689,7 +689,7 @@
  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 @@
        {
        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 @@
                            '/(<\/?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_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)
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 @@
  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 @@
  $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
program/steps/settings/edit_identity.inc
@@ -42,7 +42,17 @@
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 @@
                       '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 @@
  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']);
program/steps/settings/func.inc
@@ -147,6 +147,14 @@
                  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';
@@ -165,7 +173,6 @@
  return $out;  
  }
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 @@
                             $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')."
program/steps/settings/save_prefs.inc
@@ -28,6 +28,7 @@
$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 @@
// overwrite action variable  
$OUTPUT->add_script(sprintf("\n%s.set_env('action', '%s');", $JS_OBJECT_NAME, $_action));  
?>
?>
skins/default/editor_content.css
New file
@@ -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;
}
skins/default/editor_popup.css
New file
@@ -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;
}
*/
skins/default/editor_ui.css
New file
@@ -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;
}
skins/default/templates/compose.html
@@ -106,7 +106,9 @@
<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>
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" />