]> git.donarmstrong.com Git - roundcube.git/commitdiff
Imported Upstream version 0.1
authorJérémy Bobbio <lunar@debian.org>
Sat, 18 Jun 2011 15:00:48 +0000 (17:00 +0200)
committerJérémy Bobbio <lunar@debian.org>
Sat, 18 Jun 2011 15:00:48 +0000 (17:00 +0200)
227 files changed:
.htaccess
CHANGELOG
INSTALL
README
SQL/mysql.update-0.1a.sql [new file with mode: 0644]
SQL/postgres.update.sql
UPGRADING
bin/msgimport [new file with mode: 0755]
bin/quotaimg.php
config/db.inc.php.dist
config/main.inc.php.dist
index.php
installer/check.php [new file with mode: 0644]
installer/client.js [new file with mode: 0644]
installer/config.php [new file with mode: 0644]
installer/images/add.png [new file with mode: 0755]
installer/images/banner_bg.gif [new file with mode: 0644]
installer/images/banner_logo.gif [new file with mode: 0644]
installer/images/banner_right.gif [new file with mode: 0644]
installer/images/delete.png [new file with mode: 0755]
installer/index.php [new file with mode: 0644]
installer/rcube_install.php [new file with mode: 0644]
installer/styles.css [new file with mode: 0644]
installer/test.php [new file with mode: 0644]
installer/welcome.html [new file with mode: 0644]
program/include/main.inc
program/include/rcmail_template.inc
program/include/rcube_contacts.inc
program/include/rcube_db.inc
program/include/rcube_html.inc
program/include/rcube_imap.inc
program/include/rcube_ldap.inc
program/include/rcube_mdb2.inc
program/include/rcube_shared.inc
program/include/rcube_smtp.inc
program/include/rcube_user.inc [new file with mode: 0644]
program/include/session.inc
program/js/app.js
program/js/common.js
program/js/editor.js
program/js/editor_images.js [new file with mode: 0644]
program/js/list.js
program/js/tiny_mce/license.txt
program/js/tiny_mce/plugins/media/css/content.css
program/js/tiny_mce/plugins/media/css/media.css
program/js/tiny_mce/plugins/media/editor_plugin.js
program/js/tiny_mce/plugins/media/editor_plugin_src.js
program/js/tiny_mce/plugins/media/jscripts/embed.js
program/js/tiny_mce/plugins/media/jscripts/media.js
program/js/tiny_mce/plugins/media/langs/en.js
program/js/tiny_mce/plugins/media/media.htm
program/js/tiny_mce/plugins/readme.txt
program/js/tiny_mce/plugins/table/css/cell.css
program/js/tiny_mce/plugins/table/css/row.css
program/js/tiny_mce/plugins/table/css/table.css
program/js/tiny_mce/plugins/table/table.htm
program/js/tiny_mce/themes/advanced/css/editor_popup.css [new file with mode: 0644]
program/js/tiny_mce/themes/advanced/editor_template.js
program/js/tiny_mce/themes/advanced/editor_template_src.js
program/js/tiny_mce/themes/advanced/image.htm
program/js/tiny_mce/tiny_mce.js
program/js/tiny_mce/tiny_mce_popup.js
program/js/tiny_mce/tiny_mce_src.js
program/js/tiny_mce/utils/editable_selects.js
program/js/tiny_mce/utils/form_utils.js
program/js/tiny_mce/utils/mclayer.js
program/js/tiny_mce/utils/mctabs.js
program/js/tiny_mce/utils/validate.js
program/lib/imap.inc
program/lib/magic [new file with mode: 0644]
program/lib/rc_mail_mime.inc
program/localization/am/labels.inc
program/localization/am/messages.inc
program/localization/ar/labels.inc
program/localization/ar/messages.inc
program/localization/bg/labels.inc
program/localization/bg/messages.inc
program/localization/bs_BA/labels.inc [new file with mode: 0644]
program/localization/bs_BA/messages.inc [new file with mode: 0644]
program/localization/ca/labels.inc
program/localization/ca/messages.inc
program/localization/cz/labels.inc
program/localization/cz/messages.inc
program/localization/da/labels.inc
program/localization/da/messages.inc
program/localization/de_CH/labels.inc
program/localization/de_CH/messages.inc
program/localization/de_DE/labels.inc
program/localization/de_DE/messages.inc
program/localization/el/labels.inc
program/localization/el/messages.inc
program/localization/en_GB/labels.inc
program/localization/en_GB/messages.inc
program/localization/en_US/labels.inc
program/localization/en_US/messages.inc
program/localization/eo/labels.inc
program/localization/eo/messages.inc
program/localization/es/labels.inc
program/localization/es/messages.inc
program/localization/et_EE/labels.inc
program/localization/et_EE/messages.inc
program/localization/eu/labels.inc
program/localization/eu/messages.inc
program/localization/fa/labels.inc
program/localization/fa/messages.inc
program/localization/fi/labels.inc
program/localization/fi/messages.inc
program/localization/fr/labels.inc
program/localization/fr/messages.inc
program/localization/ga_IE/labels.inc
program/localization/ga_IE/messages.inc
program/localization/ge/labels.inc [new file with mode: 0755]
program/localization/ge/messages.inc [new file with mode: 0755]
program/localization/gl/labels.inc
program/localization/gl/messages.inc
program/localization/he/labels.inc [new file with mode: 0644]
program/localization/he/messages.inc [new file with mode: 0644]
program/localization/hi/labels.inc [new file with mode: 0644]
program/localization/hi/messages.inc [new file with mode: 0644]
program/localization/hr/labels.inc
program/localization/hr/messages.inc
program/localization/hu/labels.inc
program/localization/hu/messages.inc
program/localization/id_ID/labels.inc [new file with mode: 0644]
program/localization/id_ID/messages.inc [new file with mode: 0644]
program/localization/index.inc
program/localization/is/labels.inc [new file with mode: 0644]
program/localization/is/messages.inc [new file with mode: 0644]
program/localization/it/labels.inc
program/localization/it/messages.inc
program/localization/ja/labels.inc
program/localization/ja/messages.inc
program/localization/kr/labels.inc [new file with mode: 0644]
program/localization/kr/messages.inc [new file with mode: 0644]
program/localization/lt/labels.inc
program/localization/lt/messages.inc
program/localization/lv/labels.inc
program/localization/lv/messages.inc
program/localization/mk/labels.inc
program/localization/mk/messages.inc
program/localization/ms_MY/labels.inc
program/localization/ms_MY/messages.inc
program/localization/nb_NO/labels.inc
program/localization/nb_NO/messages.inc
program/localization/ne/labels.inc [new file with mode: 0644]
program/localization/ne/messages.inc [new file with mode: 0644]
program/localization/nl_BE/labels.inc [new file with mode: 0644]
program/localization/nl_BE/messages.inc [new file with mode: 0644]
program/localization/nl_NL/labels.inc
program/localization/nl_NL/messages.inc
program/localization/nn_NO/labels.inc [new file with mode: 0644]
program/localization/nn_NO/messages.inc [new file with mode: 0644]
program/localization/pl/labels.inc
program/localization/pl/messages.inc
program/localization/pt_BR/labels.inc
program/localization/pt_BR/messages.inc
program/localization/pt_PT/labels.inc
program/localization/pt_PT/messages.inc
program/localization/ro/labels.inc
program/localization/ro/messages.inc
program/localization/ru/labels.inc
program/localization/ru/messages.inc
program/localization/se/labels.inc
program/localization/se/messages.inc
program/localization/si/labels.inc
program/localization/si/messages.inc
program/localization/sk/labels.inc
program/localization/sk/messages.inc
program/localization/sl/labels.inc
program/localization/sl/messages.inc
program/localization/sq_AL/labels.inc [new file with mode: 0644]
program/localization/sq_AL/messages.inc [new file with mode: 0644]
program/localization/sr_cyrillic/labels.inc [new file with mode: 0644]
program/localization/sr_cyrillic/messages.inc [new file with mode: 0644]
program/localization/sr_latin/labels.inc [new file with mode: 0644]
program/localization/sr_latin/messages.inc [new file with mode: 0644]
program/localization/th_TH/labels.inc [new file with mode: 0644]
program/localization/th_TH/messages.inc [new file with mode: 0644]
program/localization/tr/labels.inc
program/localization/tr/messages.inc
program/localization/uk/labels.inc
program/localization/uk/messages.inc
program/localization/vn/labels.inc [new file with mode: 0644]
program/localization/vn/messages.inc [new file with mode: 0644]
program/localization/zh_CN/labels.inc
program/localization/zh_CN/messages.inc
program/localization/zh_TW/labels.inc
program/localization/zh_TW/messages.inc
program/steps/addressbook/func.inc
program/steps/mail/check_recent.inc
program/steps/mail/compose.inc
program/steps/mail/folders.inc
program/steps/mail/func.inc
program/steps/mail/get.inc
program/steps/mail/getunread.inc
program/steps/mail/list.inc
program/steps/mail/mark.inc
program/steps/mail/move_del.inc
program/steps/mail/rss.inc
program/steps/mail/search.inc
program/steps/mail/sendmail.inc
program/steps/mail/sendmdn.inc [new file with mode: 0644]
program/steps/mail/show.inc
program/steps/mail/upload.inc
program/steps/settings/delete_identity.inc
program/steps/settings/edit_identity.inc
program/steps/settings/func.inc
program/steps/settings/manage_folders.inc
program/steps/settings/save_identity.inc
program/steps/settings/save_prefs.inc
skins/default/common.css
skins/default/editor_content.css
skins/default/editor_popup.css [deleted file]
skins/default/images/buttons/markread_act.png [new file with mode: 0644]
skins/default/images/icons/edit.png [deleted file]
skins/default/images/icons/rename.png [new file with mode: 0644]
skins/default/mail.css
skins/default/settings.css
skins/default/splitter.js
skins/default/templates/addidentity.html
skins/default/templates/compose.html
skins/default/templates/editidentity.html
skins/default/templates/identities.html
skins/default/templates/login.html
skins/default/templates/mail.html
skins/default/templates/managefolders.html
skins/default/templates/messagepart.html

index b40b7ea8a5a909ece100624095dd5252e6130c77..ae20a9af0a3878d0e9f84caf2348bee4f37042ae 100644 (file)
--- a/.htaccess
+++ b/.htaccess
@@ -7,6 +7,10 @@ AddType text/x-component .htc
   php_value    error_log       logs/errors
   php_value    upload_max_filesize     5M
   php_value    post_max_size   6M
+  php_value    memory_limit    64M
+  php_value    session.auto_start      0
+  php_value    zlib.output_compression 0
+  php_value    magic_quotes_gpc        0
 </IfModule>
 
 <IfModule mod_php5.c>
@@ -15,6 +19,10 @@ AddType text/x-component .htc
   php_value    error_log       logs/errors
   php_value    upload_max_filesize     5M
   php_value    post_max_size   6M
+  php_value    memory_limit    64M
+  php_value    session.auto_start      0
+  php_value    zlib.output_compression 0
+  php_value    magic_quotes_gpc        0
 </IfModule>
 
 <FilesMatch "(\.inc|\~)$">
index 96c8b269c2c448af9fd2628dfc14518c0cefc1e7..dbf986d9860ae6eb0b96ed2c12de1b6e0bd101ae 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,44 @@
 CHANGELOG RoundCube Webmail
 ---------------------------
 
+- Added interactive installer script
+- Fix folder adding/renaming inspired by #1484800
+- Localize folder name in page title (#1484785)
+- Fix code using wrong variable name (#1484018)
+- Allow to send mail with BCC recipients only
+- condense TinyMCE toolbar down to one line, removing table buttons (#1484747)
+- Add function to mark the selected messages as read/unread (#1457360)
+- Also do charset decoding as suggested in RFC 2231 (fix #1484321)
+- Show message count in folder list and hint when creating a subfolder
+- Distinguish ssl and tls for imap connections (#1484667)
+- Added some charset aliases to fix typical mis-labelling (#1484565)
+- Remember decision to display images for a certain message during session (#1484754)
+- Truncate attachment filenames to 55 characters due to an IE bug (#1484757)
+- Make sending of read receipts configurable
+- Respect config when localize folder names (#1484707)
+- Also respect receipt and priority settings when re-opening a draft message
+- Remember search results (closes #1483883), patch by the_glu
+- Add Received header on outgoing mail
+- Upgrade to TinyMCE 2.1.3
+- Allow inserting image attachments into HTML messages while composing (#1484557)
+- Implement Message-Disposition-Notification (Receipts)
+- Fix overriding of session vars when register_globals is on (#1484670)
+- Fix bug with case-sensitive folder names (#1484245)
+- Don't create default folders by default
+- Fixed some potential security risks (audited by Andris)
+- Only show new messages if they match the current search (#1484176)
+- Switch to/from when searcing in Sent folder (#1484555)
+- Correctly read the References header (#1484646)
+- Unset old cookie before sending a new value (#1484639)
+- Correctly decode attachments when downloading them (#1484645 and #1484642)
+- Suppress IE errors when clearing attachments form (#1484356)
+- Log error when login fails due to auto_create_user turned off
+- Filter linked/imported CSS files (closes #1484056)
+- Improve message compose screen (closes #1484383)
+- Select next row after removing one from list (#1484387)
+
+RELEASE 0.1-RC2
+
 - Enable drag-&-dropping of folders to a new parent and allow to create subfolders (#1457344)
 - Suppress IE errors when clearing attachments form (#1484356)
 - Set preferences field in user table to NULL (#1484386)
@@ -50,7 +88,7 @@ CHANGELOG RoundCube Webmail
 - Prevent default events on subject links (#1484399)
 - Use HTTP-POST requests for actions that change state
 
-RELEASE 0.1.-RC1
+RELEASE 0.1-RC1
 
 - Use global filters and bind username/ for Ldap searches (#1484159)
 - Hide quota display if imap server does not support it
@@ -153,4 +191,3 @@ RELEASE 0.1.-RC1
 - Fixed some XSS and SQL injection issues
 - Fixed charset problems with folder renaming
 
-
diff --git a/INSTALL b/INSTALL
index 5032e4a428461319cb925754935cad40906d4f10..ada9daa6d8f40fced18630eeb5b85fdbe0c29fda 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,26 +1,35 @@
+INTRODUCTION
+============
+
+This file describes the basic steps to install RoundCube Webmail on your
+web server. For additional information, please also consult the project's
+wiki page at http://trac.roundcube.net/wiki
+
 
 REQUIREMENTS
 ============
 
-* The Apache Webserver
+* The Apache or Lighttpd Webserver
 * .htaccess support allowing overrides for DirectoryIndex
 * PHP Version 4.3.1 or greater including
    - PCRE (perl compatible regular expression)
-   - Mcrypt (supporting Triple DES)
-   - libiconv
+   - Libiconv
    - Multibyte String (mbstring)
-   - Database driver for either MySQL, Postgres or SQLite 
+   - Mcrypt (supporting Triple DES)
+   - Database driver for either MySQL, Postgres or SQLite
 * php.ini options:
    - error_reporting E_ALL & ~E_NOTICE (or lower)
    - file_uploads on (for attachment upload features)
    - memory_limit (increase as suitable to support large attachments)
+   - session.auto_start needs to be off/0
 * The PEAR framework with the following packages installed
-   - DB (1.7.11)
+   - MDB2
    - Mail_Mime (1.3.1)
    - Net_SMTP (1.2.10)
 * PHP compiled with Open SSL to connect to IMAPS and to use the spell checker
 * A MySQL or PostgreSQL database engine or the SQLite extension for PHP
-* A database with permission to create tables
+* One of the above databases with permission to create tables
+* An SMTP server or PHP configured for mail delivery
 
 
 INSTALLATION
@@ -32,10 +41,9 @@ INSTALLATION
    - /temp
    - /logs
 3. Create a new database and a database user for RoundCube (see DATABASE SETUP)
-4. Create database tables using the queries in file 'SQL/*.initial.sql'
-   (* stands for your database type)
-5. Rename the files config/*.inc.php.dist to config/*.inc.php
-6. Modify the files in config/* to suit your local environment
+4. Point your browser to http:///url-to-roundcube/installer/
+5. Follow the instructions of the install script (or see MANUAL CONFINGURATION)
+6. After creating and testing the configuration, remove the installer directory
 7. Done!
 
 
@@ -84,40 +92,39 @@ an example how you can setup the sqlite.db for roundcube:
 # sqlite -init SQL/sqlite.initial.sql sqlite.db
 
 Make sure your configuration points to the sqlite.db file and that the
-webserver can write to the file.
+webserver can write to the file and the directory containing the file.
 
 
 * PostgreSQL
 ------------
-To use RoundCube with PostgreSQL support you have to follow the next
-simple steps, which have to be done with the postgres system user (or
+To use RoundCube with PostgreSQL support you have to follow these
+simple steps, which have to be done as the postgres system user (or
 which ever is the database superuser):
 
-$ createuser roundcubemail
-$ createdb -O roundcubemail roundcubemail
+$ createuser roundcube
+$ createdb -O roundcube roundcubemail
 $ psql roundcubemail
 
 roundcubemail =# ALTER USER roundcube WITH PASSWORD 'the_new_password';
-roundcubemail =# \c - roundcubemail
+roundcubemail =# \c - roundcube
 roundcubemail => \i SQL/postgres.initial.sql
 
-All this has been tested with PostgreSQL 8.0.x and 7.4.x. Older
+All this has been tested with PostgreSQL 8.x and 7.4.x. Older
 versions don't have a -O option for the createdb, so if you are
 using that version you'll have to change ownership of the DB later.
 
 
-CONFIGURATION
-=============
+MANUAL CONFIGURATION
+====================
 
-Change the files in config/* according your to environment and your needs.
-Details about the config paramaters can be found in the config files.
+First of all, rename the files config/*.inc.php.dist to config/*.inc.php.
+You can then change these files according to your environment and your needs.
+Details about the config parameters can be found in the config files.
+See http://trac.roundcube.net/wiki/Howto_Install for even more guidance.
 
 You can also modify the default .htaccess file. This is necessary to
 increase the allowed size of file attachments, for example:
-  php_value       upload_max_filesize     2M
-
-To enable the experimental HTML editor you need to set the config
-parameter 'enable_htmleditor' to true.
+       php_value       upload_max_filesize     2M
 
 
 UPGRADING
diff --git a/README b/README
index da1bd2e1ddf54300cac5d5664e3bc83a17bbd893..e06318cdb090e7780b4c553781c97224c849499b 100644 (file)
--- a/README
+++ b/README
@@ -1,5 +1,6 @@
 RoundCube Webmail (http://roundcube.net)
 
+
 Introduction:
 -------------
 RoundCube Webmail is a browser-based multilingual IMAP client with an
@@ -23,10 +24,10 @@ Installation:
 -------------
 For detailed instructions on how to install RoundCube webmail on your server,
 please refer to the INSTALL document in the same directory as this document.
-Please carefully read the REQUIREMENTS section of the INSTALL instructions.
+Please carefully read the REQUIREMENTS section of the INSTALL instructions. 
 
 
-Licensing:
+Licensing: 
 ----------
 This product is distributed under the GPL. Please read through the file
 LICENSE for more information about our license.
@@ -64,8 +65,8 @@ program/include/rcube_shared.inc
 Contact:
 --------
 For any bug reports or feature requests please refer to the tracking system
-at trac.roundcube.net (http://trac.roundcube.net/trac.cgi/report) or 
-subscribe to our mailing list. See http://www.roundcube.net/?p=mailinglists
+at trac.roundcube.net (http://trac.roundcube.net/wiki/Howto_ReportIssues) or 
+subscribe to our mailing list. See http://roundcube.net/support
 for details.
 
 You're always welcome to send a message to the project admin:
diff --git a/SQL/mysql.update-0.1a.sql b/SQL/mysql.update-0.1a.sql
new file mode 100644 (file)
index 0000000..60f22b3
--- /dev/null
@@ -0,0 +1,51 @@
+-- RoundCube Webmail update script for MySQL databases
+-- Updates from version 0.1-20051007
+
+
+ALTER TABLE `session` ADD `ip` VARCHAR(40) NOT NULL AFTER changed;
+ALTER TABLE `users` ADD `alias` VARCHAR(128) NOT NULL AFTER mail_host;
+
+
+
+-- RoundCube Webmail update script for MySQL databases
+-- Updates from version 0.1-20051021
+
+ALTER TABLE `session` CHANGE `sess_id` `sess_id` VARCHAR(40) NOT NULL;
+
+ALTER TABLE `contacts` CHANGE `del` `del` TINYINT(1) NOT NULL;
+ALTER TABLE `contacts` ADD `changed` DATETIME NOT NULL AFTER `user_id`;
+
+UPDATE `contacts`  SET `del`=0 WHERE `del`=1;
+UPDATE `contacts`  SET `del`=1 WHERE `del`=2;
+
+ALTER TABLE `identities` CHANGE `default` `standard` TINYINT(1) NOT NULL;
+ALTER TABLE `identities` CHANGE `del` `del` TINYINT(1) NOT NULL;
+
+UPDATE `identities`  SET `del`=0 WHERE `del`=1;
+UPDATE `identities`  SET `del`=1 WHERE `del`=2;
+UPDATE `identities`  SET `standard`=0 WHERE `standard`=1;
+UPDATE `identities`  SET `standard`=1 WHERE `standard`=2;
+
+CREATE TABLE `messages` (
+  `message_id` int(11) unsigned NOT NULL auto_increment,
+  `user_id` int(11) unsigned NOT NULL default '0',
+  `del` tinyint(1) NOT NULL default '0',
+  `cache_key` varchar(128) NOT NULL default '',
+  `created` datetime NOT NULL default '0000-00-00 00:00:00',
+  `idx` int(11) unsigned NOT NULL default '0',
+  `uid` int(11) unsigned NOT NULL default '0',
+  `subject` varchar(255) NOT NULL default '',
+  `from` varchar(255) NOT NULL default '',
+  `to` varchar(255) NOT NULL default '',
+  `cc` varchar(255) NOT NULL default '',
+  `date` datetime NOT NULL default '0000-00-00 00:00:00',
+  `size` int(11) unsigned NOT NULL default '0',
+  `headers` text NOT NULL,
+  `structure` text,
+  PRIMARY KEY  (`message_id`),
+  KEY `user_id` (`user_id`),
+  KEY `idx` (`idx`),
+  KEY `uid` (`uid`),
+  UNIQUE `uniqueness` (`cache_key`, `uid`)
+) TYPE=MyISAM;
+
index 8f7054820d36429994e119211718b2660fc835e8..0d63cf93426497b3d7317f4751bfcbae4647fb5e 100644 (file)
@@ -5,5 +5,8 @@ ALTER TABLE "messages" DROP body;
 ALTER TABLE "messages" ADD structure TEXT;
 ALTER TABLE "messages" ADD UNIQUE (user_id, cache_key, uid);
 
-ALTER TABLE "identities" ADD html_signature integer DEFAULT 0 NOT NULL;
+ALTER TABLE "identities" ADD html_signature INTEGER;
+ALTER TABLE "identities" ALTER html_signature SET DEFAULT 0;
+UPDATE identities SET html_signature = 0;
+ALTER TABLE "identities" ALTER html_signature SET NOT NULL;
 
index a88f92d7ade7a2fc4d55b576892eb36ee77f8703..9d87a1e38e91321a415349c11ab6c91ac9875c9b 100644 (file)
--- a/UPGRADING
+++ b/UPGRADING
@@ -4,9 +4,18 @@ UPDATE instructions
 Follow these instructions if upgrading from a previous version
 of RoundCube Webmail.
 
+from version 0.1-rc2
+----------------------------------------
+* replace index.php
+* replace all files in folder /bin/
+* replace all files in folder /program/
+* replace all files in folder /skins/default/
+
+
 from version 0.1-rc1
 ----------------------------------------
 * replace index.php
+* replace all files in folder /bin/
 * replace all files in folder /program/
 * replace all files in folder /skins/default/
 * If you have LDAP servers configured you should re-configure
@@ -16,6 +25,7 @@ from version 0.1-rc1
 from version 0.1-beta2
 ----------------------------------------
 * replace index.php
+* replace all files in folder /bin/
 * replace all files in folder /program/
 * replace all files in folder /skins/default/
 * run all commands in SQL/[yourdbtype].update.sql or
@@ -30,6 +40,7 @@ from version 0.1-beta2
 form version 0.1-beta
 ----------------------------------------
 * replace index.php
+* replace all files in folder /bin/
 * replace all files in folder /program/
 * replace all files in folder /skins/default/
 * run all commands in SQL/[yourdbtype].update.sql or
diff --git a/bin/msgimport b/bin/msgimport
new file mode 100755 (executable)
index 0000000..0ed268f
--- /dev/null
@@ -0,0 +1,123 @@
+#!/usr/bin/php -qC 
+<?php
+
+$CWD = $INSTALL_PATH = preg_replace('/bin\/$/', '', getcwd() . '/');
+ini_set('include_path',  ini_get('include_path') . PATH_SEPARATOR . $CWD.'program/');
+
+require_once('include/rcube_shared.inc');
+require_once('include/rcube_imap.inc');
+require_once('include/main.inc');
+require_once('include/bugs.inc');
+
+/**
+ * Parse commandline arguments into a hash array
+ */
+function get_args($aliases=array())
+{
+       $args = array();
+       for ($i=1; $i<count($_SERVER['argv']); $i++)
+       {
+               $arg = $_SERVER['argv'][$i];
+               if (substr($arg, 0, 2) == '--')
+               {
+                       $sp = strpos($arg, '=');
+                       $key = substr($arg, 2, $sp - 2);
+                       $value = substr($arg, $sp+1);
+               }
+               else if ($arg{0} == '-')
+               {
+                       $key = substr($arg, 1);
+                       $value = $_SERVER['argv'][++$i];
+               }
+               else
+                       continue;
+
+               $args[$key] = preg_replace(array('/^["\']/', '/["\']$/'), '', $value);
+               
+               if ($alias = $aliases[$key])
+                       $args[$alias] = $args[$key];
+       }
+
+       return $args;
+}
+
+
+function print_usage()
+{
+       print "Usage:  msgimport -h imap-host -u user-name -f message-file\n";
+       print "--host   IMAP host\n";
+       print "--user   IMAP user name\n";
+       print "--file   Message file to upload\n";
+}
+
+
+// get arguments
+$args = get_args(array('h' => 'host', 'u' => 'user', 'p' => 'pass', 'f' => 'file')) + array('host' => 'localhost');
+
+if ($_SERVER['argv'][1] == 'help')
+{
+       print_usage();
+       exit;
+}
+else if (!($args['host'] && $args['file']))
+{
+       print "Missing required parameters.\n";
+       print_usage();
+       exit;
+}
+else if (!is_file($args['file']))
+{
+       print "Cannot read message file\n";
+       exit;
+}
+
+// prompt for username if not set
+if (empty($args['user']))
+{
+       //fwrite(STDOUT, "Please enter your name\n");
+       echo "IMAP user: ";
+       $args['user'] = trim(fgets(STDIN));
+}
+
+// prompt for password
+echo "Password: ";
+$args['pass'] = trim(fgets(STDIN));
+
+// clear password input
+echo chr(8)."\rPassword: ".str_repeat("*", strlen($args['pass']))."\n";
+
+// parse $host URL
+$a_host = parse_url($args['host']);
+if ($a_host['host'])
+{
+       $host = $a_host['host'];
+       $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? TRUE : FALSE;
+       $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : 143);
+}
+else
+{
+       $host = $args['host'];
+       $imap_port = 143;
+}
+
+// instantiate IMAP class
+$IMAP = new rcube_imap(null);
+
+// try to connect to IMAP server
+if ($IMAP->connect($host, $args['user'], $args['pass'], $imap_port, $imap_ssl))
+{
+       print "IMAP login successful.\n";
+       print "Uploading message...\n";
+       
+       // upload message from file
+       if  ($IMAP->save_message('INBOX', file_get_contents($args['file'])))
+               print "Message successfully added to INBOX.\n";
+       else
+               print "Adding message failed!\n";
+}
+else
+{
+       print "IMAP login failed.\n";
+}
+
+?>
\ No newline at end of file
index 5896eac129e28c29cf15c4321222f2da3c00c454..354f4ebdbfa96a0e1455ff3596baad3aa76ff249 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /*
  +-----------------------------------------------------------------------+
  | program/bin/quotaimg.php                                              |
  | Author: Brett Patterson <brett2@umbc.edu>                             |
  +-----------------------------------------------------------------------+
 
- $Id:  $
+ $Id: $
 
 */
 
-$used  = ((isset($_GET['u']) && !empty($_GET['u'])) || $_GET['u']=='0')?(int)$_GET['u']:'??';
-$quota = ((isset($_GET['q']) && !empty($_GET['q'])) || $_GET['q']=='0')?(int)$_GET['q']:'??';
-$width = empty($_GET['w']) ? 100 : (int)$_GET['w'];
+$used   = ((isset($_GET['u']) && !empty($_GET['u'])) || $_GET['u']=='0')?(int)$_GET['u']:'??';
+$quota  = ((isset($_GET['q']) && !empty($_GET['q'])) || $_GET['q']=='0')?(int)$_GET['q']:'??';
+$width  = empty($_GET['w']) ? 100 : (int)$_GET['w'];
 $height = empty($_GET['h']) ? 14 : (int)$_GET['h'];
 
+/**
+ * Quota display
+ * 
+ *     Modify the following few elements to change the display of the image.
+ *     Modifiable attributes are:
+ *     bool    border  ::      Defines whether you want to show a border around it?
+ *     bool    unknown ::      Leave default; Defines whether quota is "unknown"
+ *
+ *     int             height  ::      Defines height of the image
+ *     int             width   ::      Defines width of the image
+ *     int             font    ::      Changes the font size & font used in the GD library.
+ *                                             Available values are from 1 to 5.
+ *     int             padding ::      Changes the offset (in pixels) from the top of the image
+ *                      to where the top of the text will be aligned. User
+ *                      greater than 0 to ensure text is off the border.
+ *     array   limit   ::      Holds the integer values of in an associative array as
+ *                      to what defines the upper and lower levels for quota
+ *                      display.
+ *                                             High - Quota is nearing capacity.
+ *                                             Mid  - Quota is around the middle
+ *                                             Low  - Currently not used.
+ *     array   color   ::      An associative array of strings of comma separated
+ *                      values (R,G,B) for use in color creation.  Define the
+ *                      RGB values you'd like to use. A list of colors (and
+ *                      their RGB values) can be found here:
+ *                                             http://www.december.com/html/spec/colorcodes.html
+ * 
+ * @return void
+ * 
+ * @param mixed $used   The amount used, or ?? if unknown.
+ * @param mixed $total  The total available, or ?? if unknown.
+ * @param int   $width  Width of the image.
+ * @param int   $height Height of the image.
+ * 
+ * @see rcube_imap::get_quota()
+ * @see iil_C_GetQuota()
+ * 
+ * @todo Make colors a config option.
+ */
 function genQuota($used, $total, $width, $height)
 {
-       /**
-        *      Quota Display
-        *
-        *      Modify the following few elements to change the display of the image.
-        *      Modifiable attributes are:
-        *      bool    border  ::      Defines whether you want to show a border around it or not.
-        *      bool    unknown ::      Leave default; Defines whether quota is "unknown"
-        *
-        *      int             height  ::      Defines height of the image
-        *      int             width   ::      Defines width of the image
-        *      int             font    ::      Changes the font size & font used in the GD library.
-        *                                              Available values are from 1 to 5.
-        *      int             padding ::      Changes the offset (in pixels) from the top of the image to
-        *                                              where the top of the text will be aligned.  User greater than
-        *                                              0 to ensure text is off the border.
-        *      array   limit   ::      Holds the integer values of in an associative array as to what
-        *                                              defines the upper and lower levels for quota display.
-        *                                              High - Quota is nearing capacity.
-        *                                              Mid  - Quota is around the middle
-        *                                              Low  - Currently not used.
-        *      array   color   ::      An associative array of strings of comma separated values (R,G,B)
-        *                                              for use in color creation.  Define the RGB values you'd like to 
-        *                                              use.  A list of colors (and their RGB values) can be found here:
-        *                                              http://www.december.com/html/spec/colorcodes.html
-        **/
-
        $unknown = false;
-       $border = 0;
+       $border  = 0;
 
-       $font = 2;
+       $font    = 2;
        $padding = 0;
 
        $limit['high'] = 70;
-       $limit['mid'] = 45;
-       $limit['low'] = 0;
+       $limit['mid']  = 45;
+       $limit['low']  = 0;
 
        // Fill Colors
-       $color['fill']['high'] = '215, 13, 13'; // Near quota fill color
-       $color['fill']['mid'] = '126, 192, 238';// Mid-area of quota fill color
-       $color['fill']['low'] = '147, 225, 100';        // Far from quota fill color
+       $color['fill']['high'] = '215, 13, 13';   // Near quota fill color
+       $color['fill']['mid']  = '126, 192, 238'; // Mid-area of quota fill color
+       $color['fill']['low']  = '147, 225, 100'; // Far from quota fill color
 
        // Background colors
-       $color['bg']['OL'] = '215, 13, 13';             // Over limit bbackground
-       $color['bg']['Unknown'] = '238, 99, 99';// Unknown background
-       $color['bg']['quota'] = '255, 255, 255';// Normal quota background
+       $color['bg']['OL']      = '215, 13, 13';   // Over limit bbackground
+       $color['bg']['Unknown'] = '238, 99, 99';   // Unknown background
+       $color['bg']['quota']   = '255, 255, 255'; // Normal quota background
 
        // Misc. Colors
        $color['border'] = '0, 0, 0';
-       $color['text'] = '102, 102, 102';
+       $color['text']   = '102, 102, 102';
 
 
-       /****************************
+       /************************************
         *****  DO NOT EDIT BELOW HERE  *****
-        ****************************/
+        ***********************************/
 
-       if (ereg("^[^0-9?]*$", $used) || ereg("^[^0-9?]*$", $total))
+    // @todo: Set to "??" instead?
+       if (ereg("^[^0-9?]*$", $used) || ereg("^[^0-9?]*$", $total)) {
                return false; 
+    }
 
-       if (strpos($used, '?')!==false || strpos($total, '?')!==false && $used != 0)
+       if (strpos($used, '?') !== false || strpos($total, '?') !== false
+        && $used != 0) {
                $unknown = true; 
+    }
 
        $im = imagecreate($width, $height);
 
-       if ($border)
-       {
+       if ($border) {
                list($r, $g, $b) = explode(',', $color['border']);
+        
                $borderc = imagecolorallocate($im, $r, $g, $b);
+        
                imageline($im, 0, 0, $width, 0, $borderc);
                imageline($im, 0, $height-$border, 0, 0, $borderc);
                imageline($im, $width-1, 0, $width-$border, $height, $borderc);
@@ -102,46 +119,41 @@ function genQuota($used, $total, $width, $height)
        list($r, $g, $b) = explode(',', $color['text']);
        $text = imagecolorallocate($im, $r, $g, $b);
 
-       if ($unknown)
-       {
+       if ($unknown) {
                list($r, $g, $b) = explode(',', $color['bg']['Unknown']);
                $background = imagecolorallocate($im, $r, $g, $b);
                imagefilledrectangle($im, 0, 0, $width, $height, $background);
 
                $string = 'Unknown';
-               $mid = floor(($width-(strlen($string)*imagefontwidth($font)))/2)+1;
+               $mid    = floor(($width-(strlen($string)*imagefontwidth($font)))/2)+1;
                imagestring($im, $font, $mid, $padding, $string, $text);
-       }
-       else if ($used > $total)
-       {
+       } else if ($used > $total) {
                list($r, $g, $b) = explode(',', $color['bg']['OL']);
+        
                $background = imagecolorallocate($im, $r, $g, $b);
+        
                imagefilledrectangle($im, 0, 0, $width, $height, $background);
 
                $string = 'Over Limit';
-               $mid = floor(($width-(strlen($string)*imagefontwidth($font)))/2)+1;
+               $mid    = floor(($width-(strlen($string)*imagefontwidth($font)))/2)+1;
                imagestring($im, $font, $mid, $padding, $string, $text);
-       }
-       else
-       {
+       } else {
                list($r, $g, $b) = explode(',', $color['bg']['quota']);
+        
                $background = imagecolorallocate($im, $r, $b, $g);
+        
                imagefilledrectangle($im, 0, 0, $width, $height, $background);
                
                $quota = ($used==0)?0:(round($used/$total, 2)*100);
 
-               if ($quota >= $limit['high'])
-               {
+               if ($quota >= $limit['high']) {
                        list($r, $g, $b) = explode(',', $color['fill']['high']);
                        $fill = imagecolorallocate($im, $r, $g, $b);
-               }
-               elseif($quota >= $limit['mid'])
-               {
+               } elseif($quota >= $limit['mid']) {
                        list($r, $g, $b) = explode(',', $color['fill']['mid']);
                        $fill = imagecolorallocate($im, $r, $g, $b);
-               }
-               else // if($quota >= $limit['low'])
-               {
+               } else {
+                   // if($quota >= $limit['low'])
                        list($r, $g, $b) = explode(',', $color['fill']['low']);
                        $fill = imagecolorallocate($im, $r, $g, $b);
                }
@@ -149,21 +161,23 @@ function genQuota($used, $total, $width, $height)
                $quota_width = $quota / 100 * $width;
                imagefilledrectangle($im, $border, 0, $quota, $height-2*$border, $fill);
 
-               $string = $quota.'%';
-               $mid = floor(($width-(strlen($string)*imagefontwidth($font)))/2)+1;
-               imagestring($im, $font, $mid, $padding, $string, $text); // Print percent in black
+               $string = $quota . '%';
+               $mid    = floor(($width-(strlen($string)*imagefontwidth($font)))/2)+1;
+        // Print percent in black
+               imagestring($im, $font, $mid, $padding, $string, $text); 
        }
 
        header('Content-Type: image/gif');
-       header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+86400)." GMT");
-       header("Cache-Control: ");
-       header("Pragma: ");
+    
+    // @todo is harcoding GMT necessary?
+       header('Expires: ' . gmdate('D, d M Y H:i:s', mktime()+86400) . ' GMT');
+       header('Cache-Control: ');
+       header('Pragma: ');
        
        imagegif($im);
        imagedestroy($im);
 }
 
-
 genQuota($used, $quota, $width, $height);
 exit;
-?>
+?>
\ No newline at end of file
index e142dd71c835b3dec0e71212d72b7f55a42d9c95..442ef6ed41c12242625d0196a555f02e6a29f191 100644 (file)
@@ -5,7 +5,7 @@
  | Configuration file for database access                                |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -16,7 +16,7 @@ $rcmail_config = array();
 
 // PEAR database DSN for read/write operations
 // format is db_provider://user:password@host/databse
-// currently supported db_providers: mysql, sqlite
+// currently supported db_providers: mysql, mysqli, pgsql, sqlite, mssql
 
 $rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';
 // postgres example: 'pgsql://roundcube:pass@localhost/roundcubemail';
@@ -27,7 +27,7 @@ $rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';
 $rcmail_config['db_dsnr'] = '';
 
 // database backend to use (only db or mdb2 are supported)
-$rcmail_config['db_backend'] = 'db';
+$rcmail_config['db_backend'] = 'mdb2';
 
 // maximum length of a query in bytes
 $rcmail_config['db_max_length'] = 512000;  // 500K
index 926b4e0088c169571782a4aecf1d6c87cdb6c4e5..8475c816dd36c93fe64477d0cb296f921196b360 100644 (file)
@@ -5,7 +5,7 @@
  | Main configuration file                                               |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -130,7 +130,7 @@ $rcmail_config['date_long'] = 'd.m.Y H:i';
 $rcmail_config['date_today'] = 'H:i';
 
 // add this user-agent to message headers when sending
-$rcmail_config['useragent'] = 'RoundCube Webmail/0.1-rc2';
+$rcmail_config['useragent'] = 'RoundCube Webmail/0.1';
 
 // use this name to compose page titles
 $rcmail_config['product_name'] = 'RoundCube Webmail';
@@ -154,9 +154,12 @@ $rcmail_config['sent_mbox'] = 'Sent';
 $rcmail_config['trash_mbox'] = 'Trash';
 
 // display these folders separately in the mailbox list.
-// these folders will automatically be created if they do not exist
+// these folders will also be displayed with localized names
 $rcmail_config['default_imap_folders'] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash');
 
+// automatically create the above listed default folders on login
+$rcmail_config['create_default_folders'] = FALSE;
+
 // protect the default folders from renames, deletes, and subscription changes
 $rcmail_config['protect_default_folders'] = TRUE;
 
@@ -173,6 +176,10 @@ $rcmail_config['read_when_deleted'] = TRUE;
 // false causes deleted messages to be permanantly removed if there is no Trash folder
 $rcmail_config['flag_for_deletion'] = TRUE;
 
+// Behavior if a received message requests a message delivery notification (read receipt)
+// 0 = ask the user, 1 = send automatically, 2 = ignore (never send or ask)
+$rcmail_config['mdn_requests'] = 0;
+
 // Make use of the built-in spell checker. It is based on GoogieSpell.
 // Since Google only accepts connections over https your PHP installatation
 // requires to be compiled with Open SSL support
@@ -197,6 +204,9 @@ $rcmail_config['generic_message_footer'] = '';
 // leave empty for auto-detection
 $rcmail_config['mail_header_delimiter'] = NULL;
 
+// session domain: .example.org
+$rcmail_config['session_domain'] = '';
+
 // in order to enable public ldap search, create a config array
 // like the Verisign example below. if you would like to test, 
 // simply uncomment the Verisign example.
@@ -217,13 +227,10 @@ $rcmail_config['mail_header_delimiter'] = NULL;
  *  'surname_field' => 'sn',    // this field represents the contact's last name
  *  'firstname_field' => 'gn',  // this field represents the contact's first name
  *  'scope'         => 'sub',   // search mode: sub|base|list
- *  'filter'        => '',      // used for basic listing (if not empty) and will be &'d with search queries. ex: (status=act)
+ *  'filter'        => '',      // used for basic listing (if not empty) and will be &'d with search queries. example: status=act
  *  'fuzzy_search'  => true);   // server allows wildcard search
  */
 
-// enable composing html formatted messages (experimental)
-$rcmail_config['enable_htmleditor'] = FALSE;
-
 // don't allow these settings to be overriden by the user
 $rcmail_config['dont_override'] = array();
 
@@ -248,6 +255,9 @@ $rcmail_config['dst_active'] = (bool)date('I');
 // prefer displaying HTML messages
 $rcmail_config['prefer_html'] = TRUE;
 
+// compose html formatted messages by default
+$rcmail_config['htmleditor'] = FALSE;
+
 // show pretty dates as standard
 $rcmail_config['prettydate'] = TRUE;
 
@@ -260,8 +270,14 @@ $rcmail_config['message_sort_order'] = 'DESC';
 // save compose message every 300 seconds (5min)
 $rcmail_config['draft_autosave'] = 300;
 
+// default setting if preview pane is enabled
+$rcmail_config['preview_pane'] = FALSE;
+
 // don't let users set pagesize to more than this value if set
 $rcmail_config['max_pagesize'] = 200;
 
+// mime magic database
+$rcmail_config['mime_magic'] = '/usr/share/misc/magic';
+
 // end of config file
 ?>
index fd12c11c99fdf33806cf75d2e6c45aa20c7140af..b83ef45c6e34ccb4bcee96bc739883624746bdbe 100644 (file)
--- a/index.php
+++ b/index.php
@@ -2,7 +2,7 @@
 /*
  +-----------------------------------------------------------------------+
  | RoundCube Webmail IMAP Client                                         |
- | Version 0.1-rc2-dependent                                             |
+ | Version 0.1-20080302                                                  |
  |                                                                       |
  | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: index.php 903 2007-10-22 06:52:13Z thomasb $
+ $Id: index.php 1162 2008-03-02 13:20:21Z thomasb $
 
 */
 
 // application constants
-define('RCMAIL_VERSION', '0.1-rc2');
+define('RCMAIL_VERSION', '0.1-trunk');
 define('RCMAIL_CHARSET', 'UTF-8');
 define('JS_OBJECT_NAME', 'rcmail');
 
@@ -103,7 +103,7 @@ if (empty($_task) || !in_array($_task, $MAIN_TASKS))
 if ($_action != 'get' && $_action != 'viewsource')
 {
   // use gzip compression if supported
-  if (function_exists('ob_gzhandler') && ini_get('zlib.output_compression'))
+  if (function_exists('ob_gzhandler') && !ini_get('zlib.output_compression'))
     ob_start('ob_gzhandler');
   else
     ob_start();
@@ -196,7 +196,7 @@ else if ($_action != 'login' && $_SESSION['user_id'] && $_action != 'send')
 
 
 // log in to imap server
-if (!empty($_SESSION['user_id']) && $_task=='mail')
+if (!empty($USER->ID) && $_task=='mail')
 {
   $conn = $IMAP->connect($_SESSION['imap_host'], $_SESSION['username'], decrypt_passwd($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl']);
   if (!$conn)
@@ -210,7 +210,7 @@ if (!empty($_SESSION['user_id']) && $_task=='mail')
 
 
 // not logged in -> set task to 'login
-if (empty($_SESSION['user_id']))
+if (empty($USER->ID))
 {
   if ($OUTPUT->ajax_call)
     $OUTPUT->remote_response("setTimeout(\"location.href='\"+this.env.comm_path+\"'\", 2000);");
@@ -238,8 +238,19 @@ if (!empty($_action))
 
 
 // not logged in -> show login page
-if (!$_SESSION['user_id'])
+if (empty($USER->ID))
 {
+  // check if installer is still active
+  if (is_file('./installer/index.php'))
+    $OUTPUT->add_footer('
+  <div style="background:#ef9398; border:2px solid #dc5757; padding:0.5em; margin:2em auto; width:50em">
+  <h2 style="margin-top:0.2em">Installer script is still accessible</h2>
+  <p>The install script of your RoundCube installation is still stored in its default location!</p>
+  <p>Please <b>remove</b> the whole <tt>installer</tt> folder from the RoundCube directory because
+  these files may expose sensitive configuration data like server passwords and encryption keys
+  to the public. Make sure you cannot access the <a href="./installer/">installer script</a> from your browser.</p>
+  </div>');
+  
   $OUTPUT->task = 'login';
   $OUTPUT->send('login');
   exit;
@@ -274,13 +285,16 @@ if ($_task=='mail')
   if ($_action=='viewsource')
     include('program/steps/mail/viewsource.inc');
 
+  if ($_action=='sendmdn')
+    include('program/steps/mail/sendmdn.inc');
+
   if ($_action=='send')
     include('program/steps/mail/sendmail.inc');
 
   if ($_action=='upload')
     include('program/steps/mail/upload.inc');
 
-  if ($_action=='compose' || $_action=='remove-attachment')
+  if ($_action=='compose' || $_action=='remove-attachment' || $_action=='display-attachment')
     include('program/steps/mail/compose.inc');
 
   if ($_action=='addcontact')
diff --git a/installer/check.php b/installer/check.php
new file mode 100644 (file)
index 0000000..8352364
--- /dev/null
@@ -0,0 +1,156 @@
+<form action="index.php" method="get">
+<?php
+
+$required_php_exts = array('PCRE' => 'pcre', 'Session' => 'session', 'Sockets' => 'sockets');
+
+$optional_php_exts = array('FileInfo' => 'fileinfo', 'Libiconv' => 'iconv',
+    'Multibyte' => 'mbstring', 'OpenSSL' => 'openssl', 'Mcrypt' => 'mcrypt', 'GD' => 'gd');
+
+$required_libs = array('PEAR' => 'PEAR.php', 'DB' => 'DB.php', 'MDB2' => 'MDB2.php',
+    'Net_SMTP' => 'Net/SMTP.php', 'Mail_mime' => 'Mail/mime.php', 'iilConnection' => 'lib/imap.inc');
+
+$supported_dbs = array('MySQL' => 'mysql', 'MySQLi' => 'mysqli',
+    'PostgreSQL' => 'pgsql', 'SQLite (v2)' => 'sqlite');
+
+$ini_checks = array('file_uploads' => 1, 'session.auto_start' => 0,
+    'magic_quotes_gpc' => 0, 'magic_quotes_sybase' => 0);
+
+$source_urls = array(
+    'Sockets' => 'http://www.php.net/manual/en/ref.sockets.php',
+    'Session' => 'http://www.php.net/manual/en/ref.session.php',
+    'PCRE' => 'http://www.php.net/manual/en/ref.pcre.php',
+    'FileInfo' => 'http://www.php.net/manual/en/ref.fileinfo.php',
+    'Libiconv' => 'http://www.php.net/manual/en/ref.iconv.php',
+    'Multibyte' => 'http://www.php.net/manual/en/ref.mbstring.php',
+    'Mcrypt' => 'http://www.php.net/manual/en/ref.mcrypt.php',
+    'OpenSSL' => 'http://www.php.net/manual/en/ref.openssl.php',
+    'GD' => 'http://www.php.net/manual/en/ref.image.php',
+    'PEAR' => 'http://pear.php.net',
+    'MDB2' => 'http://pear.php.net/package/MDB2',
+    'Net_SMTP' => 'http://pear.php.net/package/Net_SMTP',
+    'Mail_mime' => 'http://pear.php.net/package/Mail_mime'
+);
+
+echo '<input type="hidden" name="_step" value="' . ($RCI->configured ? 3 : 2) . '" />';
+?>
+
+<h3>Checking PHP version</h3>
+<?php
+
+if (phpversion() > 4.3) {
+    $RCI->pass('Version', 'PHP ' . phpversion() . ' detected');
+}
+else {
+    $RCI->fail('Version', 'PHP Version 4.3.1 or greater is required');
+}
+
+?>
+
+<h3>Checking PHP extensions</h3>
+<p class="hint">The following modules/extensions are <em>required</em> to run RoundCube:</p>
+<?php
+    
+$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
+foreach ($required_php_exts AS $name => $ext) {
+    if (extension_loaded($ext)) {
+        $RCI->pass($name);
+    }
+    else {
+        $_ext = $prefix . $ext . '.' . PHP_SHLIB_SUFFIX;
+        $msg = @dl($_ext) ? 'Could be loaded. Please add in php.ini' : '';
+        $RCI->fail($name, $msg, $source_urls[$name]);
+    }
+    echo '<br />';
+}
+
+?>
+
+<p class="hint">These extensions are <em>optional</em> but recommended to get the best performance:</p>
+<?php
+
+foreach ($optional_php_exts AS $name => $ext) {
+    if (extension_loaded($ext)) {
+        $RCI->pass($name);
+    }
+    else {
+        $_ext = $prefix . $ext . '.' . PHP_SHLIB_SUFFIX;
+        $msg = @dl($_ext) ? 'Could be loaded. Please add in php.ini' : '';
+        $RCI->na($name, $msg, $source_urls[$name]);
+    }
+    echo '<br />';
+}
+
+?>
+
+
+<h3>Checking available databases</h3>
+<p class="hint">Check which of the supported extensions are installed. At least one of them is required.</p>
+
+<?php
+
+$prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
+foreach ($supported_dbs AS $database => $ext) {
+    if (extension_loaded($ext)) {
+        $RCI->pass($database);
+    }
+    else {
+        $_ext = $prefix . $ext . '.' . PHP_SHLIB_SUFFIX;
+        $msg = @dl($_ext) ? 'Could be loaded. Please add in php.ini' : 'Not installed';
+        $RCI->na($database, $msg, $source_urls[$database]);
+    }
+    echo '<br />';
+}
+
+?>
+
+
+<h3>Check for required 3rd party libs</h3>
+<p class="hint">This also checks if the include path is set correctly.</p>
+
+<?php
+
+foreach ($required_libs as $classname => $file) {
+    @include_once $file;
+    if (class_exists($classname)) {
+        $RCI->pass($classname);
+    }
+    else if ($classname == 'DB' || ($classname == 'MDB2' && class_exists('DB'))) {
+        $RCI->na($classname, 'Use ' . ($classname == 'DB' ? 'MDB2' : 'DB') . ' instead');
+    }
+    else {
+        $RCI->fail($classname, "Failed to load $file", $source_urls[$classname]);
+    }
+    echo "<br />";
+}
+
+
+?>
+
+<h3>Checking php.ini/.htaccess settings</h3>
+
+<?php
+
+foreach ($ini_checks as $var => $val) {
+    $status = ini_get($var);
+    if ($status == $val) {
+        $RCI->pass($var);
+    }
+    else {
+      $RCI->fail($var, "is '$status', should be '$val'");
+    }
+    echo '<br />';
+}
+?>
+
+<?php
+
+if ($RCI->failures) {
+  echo '<p class="warning">Sorry but your webserver does not meet the requirements for RoundCube!<br />
+            Please install the missing modules or fix the php.ini settings according to the above check results.<br />
+            Hint: only checks showing <span class="fail">NOT OK</span> need to be fixed.</p>';
+}
+echo '<p><br /><input type="submit" value="NEXT" ' . ($RCI->failures ? 'disabled' : '') . ' /></p>';
+
+?>
+
+</form>
diff --git a/installer/client.js b/installer/client.js
new file mode 100644 (file)
index 0000000..3121b26
--- /dev/null
@@ -0,0 +1,36 @@
+
+function toggleblock(id, link)
+{
+  var block = document.getElementById(id);
+  
+  return false;
+}
+
+
+function addhostfield()
+{
+  var container = document.getElementById('defaulthostlist');
+  var row = document.createElement('div');
+  var input = document.createElement('input');
+  var link = document.createElement('a');
+  
+  input.name = '_default_host[]';
+  input.size = '30';
+  link.href = '#';
+  link.onclick = function() { removehostfield(this.parentNode); return false };
+  link.className = 'removelink';
+  link.innerHTML = 'remove';
+  
+  row.appendChild(input);
+  row.appendChild(link);
+  container.appendChild(row);
+}
+
+
+function removehostfield(row)
+{
+  var container = document.getElementById('defaulthostlist');
+  container.removeChild(row);
+}
+
+
diff --git a/installer/config.php b/installer/config.php
new file mode 100644 (file)
index 0000000..5b365a5
--- /dev/null
@@ -0,0 +1,517 @@
+<form action="index.php" method="post">
+<input type="hidden" name="_step" value="2" />
+<?php
+
+ini_set('display_errors', 1);
+require_once 'include/rcube_html.inc';
+
+// also load the default config to fill in the fields
+$RCI->load_defaults();
+
+// register these boolean fields
+$RCI->config_props = array(
+  'ip_check' => 1,
+  'enable_caching' => 1,
+  'enable_spellcheck' => 1,
+  'auto_create_user' => 1,
+  'smtp_log' => 1,
+  'prefer_html' => 1,
+  'preview_pane' => 1,
+  'htmleditor' => 1,
+);
+
+if (!empty($_POST['submit'])) {
+  
+  echo '<p class="notice">Copy the following configurations and save them in two files (names above the text box)';
+  echo ' within the <tt>config/</tt> directory of your RoundCube installation.</p>';
+  
+  $textbox = new textarea(array('rows' => 16, 'cols' => 60, 'class' => "configfile"));
+  
+  echo '<div><em>main.inc.php</em></div>';
+  echo $textbox->show($RCI->create_config('main'));
+  
+  echo '<div style="margin-top:1em"><em>db.inc.php</em></div>';
+  echo $textbox->show($RCI->create_config('db'));
+
+  echo '<p class="hint">Of course there are more options to configure.
+    Have a look at the config files or visit <a href="http://trac.roundcube.net/wiki/Howto_Config">Howto_Config</a> to find out.</p>';
+
+  echo '<p><input type="button" onclick="location.href=\'./index.php?_step=3\'" value="CONTINUE" /></p>';
+  
+  // echo '<style type="text/css"> .configblock { display:none } </style>';
+  echo "\n<hr style='margin-bottom:1.6em' />\n";
+}
+
+?>
+<fieldset>
+<legend>General configuration</legend>
+<dl class="configblock">
+<!--
+<dt id="cgfblockgeneral" class="propname">debug_level</dt>
+<dd>
+<?php
+/*
+$value = $RCI->getprop('debug_level');
+$check_debug = new checkbox(array('name' => '_debug_level[]'));
+echo $check_debug->show(($value & 1) ? 1 : 0 , array('value' => 1, 'id' => 'cfgdebug1'));
+echo '<label for="cfgdebug1">Log errors</label><br />';
+
+echo $check_debug->show(($value & 4) ? 4 : 0, array('value' => 4, 'id' => 'cfgdebug4'));
+echo '<label for="cfgdebug4">Display errors</label><br />';
+
+echo $check_debug->show(($value & 8) ? 8 : 0, array('value' => 8, 'id' => 'cfgdebug8'));
+echo '<label for="cfgdebug8">Verbose display</label><br />';
+*/
+?>
+</dd>
+-->
+
+<dt class="propname">product_name</dt>
+<dd>
+<?php
+
+$input_prodname = new textfield(array('name' => '_product_name', 'size' => 30, 'id' => "cfgprodname"));
+echo $input_prodname->show($RCI->getprop('product_name'));
+
+?>
+<div>The name of your service (used to compose page titles)</div>
+</dd>
+
+<dt class="propname">skin_path</dt>
+<dd>
+<?php
+
+$input_skinpath = new textfield(array('name' => '_skin_path', 'size' => 30, 'id' => "cfgskinpath"));
+echo $input_skinpath->show($RCI->getprop('skin_path'));
+
+?>
+<div>Relative path to the skin folder</div>
+</dd>
+
+<dt class="propname">temp_dir</dt>
+<dd>
+<?php
+
+$input_tempdir = new textfield(array('name' => '_temp_dir', 'size' => 30, 'id' => "cfgtempdir"));
+echo $input_tempdir->show($RCI->getprop('temp_dir'));
+
+?>
+<div>Use this folder to store temp files (must be writebale for webserver)</div>
+</dd>
+
+<dt class="propname">log_dir</dt>
+<dd>
+<?php
+
+$input_logdir = new textfield(array('name' => '_log_dir', 'size' => 30, 'id' => "cfglogdir"));
+echo $input_logdir->show($RCI->getprop('log_dir'));
+
+?>
+<div>Use this folder to store log files (must be writebale for webserver)</div>
+</dd>
+
+<dt class="propname">ip_check</dt>
+<dd>
+<?php
+
+$check_ipcheck = new checkbox(array('name' => '_ip_check', 'id' => "cfgipcheck"));
+echo $check_ipcheck->show(intval($RCI->getprop('ip_check')), array('value' => 1));
+
+?>
+<label for="cfgipcheck">Check client IP in session authorization</label><br />
+
+<p class="hint">This increases security but can cause sudden logouts when someone uses a proxy with changeing IPs.</p>
+</dd>
+
+<dt class="propname">des_key</dt>
+<dd>
+<?php
+
+$input_deskey = new textfield(array('name' => '_des_key', 'size' => 30, 'id' => "cfgdeskey"));
+echo $input_deskey->show($RCI->getprop('des_key'));
+
+?>
+<div>This key is used to encrypt the users imap password before storing in the session record</div>
+<p class="hint">It's a random generated string to ensure that every installation has it's own key.
+If you enter it manually please provide a string of exactly 24 chars.</p>
+</dd>
+
+<dt class="propname">enable_caching</dt>
+<dd>
+<?php
+
+$check_caching = new checkbox(array('name' => '_enable_caching', 'id' => "cfgcache"));
+echo $check_caching->show(intval($RCI->getprop('enable_caching')), array('value' => 1));
+
+?>
+<label for="cfgcache">Cache messages in local database</label><br />
+</dd>
+
+<dt class="propname">enable_spellcheck</dt>
+<dd>
+<?php
+
+$check_caching = new checkbox(array('name' => '_enable_spellcheck', 'id' => "cfgspellcheck"));
+echo $check_caching->show(intval($RCI->getprop('enable_spellcheck')), array('value' => 1));
+
+?>
+<label for="cfgspellcheck">Make use of the built-in spell checker</label><br />
+
+<p class="hint">It is based on GoogieSpell what implies that the message content will be sent to Google in order to check the spelling.</p>
+</dd>
+
+<dt class="propname">mdn_requests</dt>
+<dd>
+<?php
+
+$select_mdnreq = new select(array('name' => '_mdn_requests', 'id' => "cfgmdnreq"));
+$select_mdnreq->add(array('ask the user', 'send automatically', 'ignore'), array(0, 1, 2));
+echo $select_mdnreq->show(intval($RCI->getprop('mdn_requests')));
+
+?>
+<div>Behavior if a received message requests a message delivery notification (read receipt)</div>
+</dd>
+
+</dl>
+</fieldset>
+
+<fieldset>
+<legend>Database setup</legend>
+<dl class="configblock" id="cgfblockdb">
+<dt class="propname">db_dsnw</dt>
+<dd>
+<p>Database settings for read/write operations:</p>
+<?php
+
+require_once 'DB.php';
+
+$supported_dbs = array('MySQL' => 'mysql', 'MySQLi' => 'mysqli',
+    'PgSQL' => 'pgsql', 'SQLite' => 'sqlite');
+
+$select_dbtype = new select(array('name' => '_dbtype', 'id' => "cfgdbtype"));
+foreach ($supported_dbs AS $database => $ext) {
+    if (extension_loaded($ext)) {
+        $select_dbtype->add($database, $ext);
+    }
+}
+
+$input_dbhost = new textfield(array('name' => '_dbhost', 'size' => 20, 'id' => "cfgdbhost"));
+$input_dbname = new textfield(array('name' => '_dbname', 'size' => 20, 'id' => "cfgdbname"));
+$input_dbuser = new textfield(array('name' => '_dbuser', 'size' => 20, 'id' => "cfgdbuser"));
+$input_dbpass = new textfield(array('name' => '_dbpass', 'size' => 20, 'id' => "cfgdbpass"));
+
+$dsnw = DB::parseDSN($RCI->getprop('db_dsnw'));
+
+echo $select_dbtype->show($RCI->is_post ? $_POST['_dbtype'] : $dsnw['phptype']);
+echo '<label for="cfgdbtype">Database type</label><br />';
+echo $input_dbhost->show($RCI->is_post ? $_POST['_dbhost'] : $dsnw['hostspec']);
+echo '<label for="cfgdbhost">Database server</label><br />';
+echo $input_dbname->show($RCI->is_post ? $_POST['_dbname'] : $dsnw['database']);
+echo '<label for="cfgdbname">Database name</label><br />';
+echo $input_dbuser->show($RCI->is_post ? $_POST['_dbuser'] : $dsnw['username']);
+echo '<label for="cfgdbuser">Database user name (needs write permissions)</label><br />';
+echo $input_dbpass->show($RCI->is_post ? $_POST['_dbpass'] : $dsnw['password']);
+echo '<label for="cfgdbpass">Database password</label><br />';
+
+?>
+</dd>
+
+<dt class="propname">db_backend</dt>
+<dd>
+<?php
+
+// check for existing PEAR classes
+@include_once 'DB.php';
+@include_once 'MDB2.php';
+
+$select_dbba = new select(array('name' => '_db_backend', 'id' => "cfgdbba"));
+
+if (class_exists('DB'))
+  $select_dbba->add('DB', 'db');
+if (class_exists('MDB2'))
+  $select_dbba->add('MDB2', 'mdb2');
+
+echo $select_dbba->show($RCI->getprop('db_backend'));
+
+?>
+<div>PEAR Database backend to use</div>
+</dd>
+
+</dl>
+</fieldset>
+
+
+<fieldset>
+<legend>IMAP Settings</legend>
+<dl class="configblock" id="cgfblockimap">
+<dt class="propname">default_host</dt>
+<dd>
+<div>The IMAP host(s) chosen to perform the log-in</div>
+<div id="defaulthostlist">
+<?php
+
+$text_imaphost = new textfield(array('name' => '_default_host[]', 'size' => 30));
+$default_hosts = $RCI->get_hostlist();
+
+if (empty($default_hosts))
+  $default_hosts = array('');
+
+$i = 0;
+foreach ($default_hosts as $host) {
+  echo '<div id="defaulthostentry'.$i.'">' . $text_imaphost->show($host);
+  if ($i++ > 0)
+    echo '<a href="#" onclick="removehostfield(this.parentNode);return false" class="removelink" title="Remove this entry">remove</a>';
+  echo '</div>';
+}
+
+?>
+</div>
+<div><a href="javascript:addhostfield()" class="addlink" title="Add another field">add</a></div>
+
+<p class="hint">Leave blank to show a textbox at login. To use SSL/IMAPS connection, type ssl://hostname</p>
+</dd>
+
+<dt class="propname">default_port</dt>
+<dd>
+<?php
+
+$text_imapport = new textfield(array('name' => '_default_port', 'size' => 6, 'id' => "cfgimapport"));
+echo $text_imapport->show($RCI->getprop('default_port'));
+
+?>
+<div>TCP port used for IMAP connections</div>
+</dd>
+
+<dt class="propname">username_domain</dt>
+<dd>
+<?php
+
+$text_userdomain = new textfield(array('name' => '_username_domain', 'size' => 30, 'id' => "cfguserdomain"));
+echo $text_userdomain->show($RCI->getprop('username_domain'));
+
+?>
+<div>Automatically add this domain to user names for login</div>
+
+<p class="hint">Only for IMAP servers that require full e-mail addresses for login</p>
+</dd>
+
+<dt class="propname">auto_create_user</dt>
+<dd>
+<?php
+
+$check_autocreate = new checkbox(array('name' => '_auto_create_user', 'id' => "cfgautocreate"));
+echo $check_autocreate->show(intval($RCI->getprop('auto_create_user')), array('value' => 1));
+
+?>
+<label for="cfgautocreate">Automatically create a new RoundCube user when log-in the first time</label><br />
+
+<p class="hint">A user is authenticated by the IMAP server but it requires a local record to store settings
+and contacts. With this option enabled a new user record will automatically be created once the IMAP login succeeds.</p>
+
+<p class="hint">If this option is disabled, the login only succeeds if there's a matching user-record in the local RoundCube database
+what means that you have to create those records manually or disable this option after the first login.</p>
+</dd>
+
+<dt class="propname">sent_mbox</dt>
+<dd>
+<?php
+
+$text_sentmbox = new textfield(array('name' => '_sent_mbox', 'size' => 20, 'id' => "cfgsentmbox"));
+echo $text_sentmbox->show($RCI->getprop('sent_mbox'));
+
+?>
+<div>Store sent messages is this folder</div>
+
+<p class="hint">Leave blank if sent messages should not be stored</p>
+</dd>
+
+<dt class="propname">trash_mbox</dt>
+<dd>
+<?php
+
+$text_trashmbox = new textfield(array('name' => '_trash_mbox', 'size' => 20, 'id' => "cfgtrashmbox"));
+echo $text_trashmbox->show($RCI->getprop('trash_mbox'));
+
+?>
+<div>Move messages to this folder when deleting them</div>
+
+<p class="hint">Leave blank if they should be deleted directly</p>
+</dd>
+
+<dt class="propname">drafts_mbox</dt>
+<dd>
+<?php
+
+$text_draftsmbox = new textfield(array('name' => '_drafts_mbox', 'size' => 20, 'id' => "cfgdraftsmbox"));
+echo $text_draftsmbox->show($RCI->getprop('drafts_mbox'));
+
+?>
+<div>Store draft messages is this folder</div>
+</dd>
+
+</dl>
+</fieldset>
+
+
+<fieldset>
+<legend>SMTP Settings</legend>
+<dl class="configblock" id="cgfblocksmtp">
+<dt class="propname">smtp_server</dt>
+<dd>
+<?php
+
+$text_smtphost = new textfield(array('name' => '_smtp_server', 'size' => 30, 'id' => "cfgsmtphost"));
+echo $text_smtphost->show($RCI->getprop('smtp_server'));
+
+?>
+<div>Use this host for sending mails</div>
+
+<p class="hint">To use SSL connection, set ssl://smtp.host.com. If left blank, the PHP mail() function is used</p>
+</dd>
+
+<dt class="propname">smtp_port</dt>
+<dd>
+<?php
+
+$text_smtpport = new textfield(array('name' => '_smtp_port', 'size' => 6, 'id' => "cfgsmtpport"));
+echo $text_smtpport->show($RCI->getprop('smtp_port'));
+
+?>
+<div>SMTP port (default is 25; 465 for SSL)</div>
+</dd>
+
+<dt class="propname">smtp_user/smtp_pass</dt>
+<dd>
+<?php
+
+$text_smtpuser = new textfield(array('name' => '_smtp_user', 'size' => 20, 'id' => "cfgsmtpuser"));
+$text_smtppass = new textfield(array('name' => '_smtp_pass', 'size' => 20, 'id' => "cfgsmtppass"));
+echo $text_smtpuser->show($RCI->getprop('smtp_user'));
+echo $text_smtppass->show($RCI->getprop('smtp_pass'));
+
+?>
+<div>SMTP username and password (if required)</div>
+<p>
+<?php
+
+$check_smtpuser = new checkbox(array('name' => '_smtp_user_u', 'id' => "cfgsmtpuseru"));
+echo $check_smtpuser->show($RCI->getprop('smtp_user') == '%u' || $_POST['_smtp_user_u'] ? 1 : 0, array('value' => 1));
+
+?>
+<label for="cfgsmtpuseru">Use the current IMAP username and password for SMTP authentication</label>
+</p>
+</dd>
+<!--
+<dt class="propname">smtp_auth_type</dt>
+<dd>
+<?php
+/*
+$select_smtpauth = new select(array('name' => '_smtp_auth_type', 'id' => "cfgsmtpauth"));
+$select_smtpauth->add(array('(auto)', 'PLAIN', 'DIGEST-MD5', 'CRAM-MD5', 'LOGIN'), array('0', 'PLAIN', 'DIGEST-MD5', 'CRAM-MD5', 'LOGIN'));
+echo $select_smtpauth->show(intval($RCI->getprop('smtp_auth_type')));
+*/
+?>
+<div>Method to authenticate at the SMTP server. Choose (auto) if you don't know what this is</div>
+</dd>
+-->
+<dt class="propname">smtp_log</dt>
+<dd>
+<?php
+
+$check_smtplog = new checkbox(array('name' => '_smtp_log', 'id' => "cfgsmtplog"));
+echo $check_smtplog->show(intval($RCI->getprop('smtp_log')), array('value' => 1));
+
+?>
+<label for="cfgsmtplog">Log sent messages in <tt>logs/sendmail</tt></label><br />
+</dd>
+
+</dl>
+</fieldset>
+
+
+<fieldset>
+<legend>Display settings &amp; user prefs</legend>
+<dl class="configblock" id="cgfblockdisplay">
+
+<dt class="propname">locale_string</dt>
+<dd>
+<?php
+
+$input_locale = new textfield(array('name' => '_locale_string', 'size' => 6, 'id' => "cfglocale"));
+echo $input_locale->show($RCI->getprop('locale_string'));
+
+?>
+<div>The default locale setting. This also defines the language of the login screen.</div>
+<p class="hint">Enter a <a href="http://www.faqs.org/rfcs/rfc1766">RFC1766</a> formatted locale name. Examples: en_US, de, de_CH, fr, pt_BR</p>
+</dd>
+
+<dt class="propname">pagesize <span class="userconf">*</span></dt>
+<dd>
+<?php
+
+$input_pagesize = new textfield(array('name' => '_pagesize', 'size' => 6, 'id' => "cfgpagesize"));
+echo $input_pagesize->show($RCI->getprop('pagesize'));
+
+?>
+<div>Show up to X items in list view.</div>
+</dd>
+
+<dt class="propname">prefer_html <span class="userconf">*</span></dt>
+<dd>
+<?php
+
+$check_htmlview = new checkbox(array('name' => '_prefer_html', 'id' => "cfghtmlview", 'value' => 1));
+echo $check_htmlview->show(intval($RCI->getprop('prefer_html')));
+
+?>
+<label for="cfghtmlview">Prefer displaying HTML messages</label><br />
+</dd>
+
+<dt class="propname">preview_pane <span class="userconf">*</span></dt>
+<dd>
+<?php
+
+$check_prevpane = new checkbox(array('name' => '_preview_pane', 'id' => "cfgprevpane", 'value' => 1));
+echo $check_prevpane->show(intval($RCI->getprop('preview_pane')));
+
+?>
+<label for="cfgprevpane">If preview pane is enabled</label><br />
+</dd>
+
+<dt class="propname">htmleditor <span class="userconf">*</span></dt>
+<dd>
+<?php
+
+$check_htmlcomp = new checkbox(array('name' => '_htmleditor', 'id' => "cfghtmlcompose", 'value' => 1));
+echo $check_htmlcomp->show(intval($RCI->getprop('htmleditor')));
+
+?>
+<label for="cfghtmlcompose">Compose HTML formatted messages</label><br />
+</dd>
+
+<dt class="propname">draft_autosave <span class="userconf">*</span></dt>
+<dd>
+<label for="cfgautosave">Save compose message every</label>
+<?php
+
+$select_autosave = new select(array('name' => '_draft_autosave', 'id' => 'cfgautosave'));
+$select_autosave->add('never', 0);
+foreach (array(3, 5, 10) as $i => $min)
+  $select_autosave->add("$min min", $min*60);
+
+echo $select_autosave->show(intval($RCI->getprop('draft_autosave')));
+
+?>
+</dd>
+
+</dl>
+
+<p class="hint"><span class="userconf">*</span>&nbsp; These settings are defaults for the user preferences</p>
+</fieldset>
+
+<?php
+
+echo '<p><input type="submit" name="submit" value="' . ($RCI->configured ? 'UPDATE' : 'CREATE') . ' CONFIG" ' . ($RCI->failures ? 'disabled' : '') . ' /></p>';
+
+?>
+</form>
diff --git a/installer/images/add.png b/installer/images/add.png
new file mode 100755 (executable)
index 0000000..6332fef
Binary files /dev/null and b/installer/images/add.png differ
diff --git a/installer/images/banner_bg.gif b/installer/images/banner_bg.gif
new file mode 100644 (file)
index 0000000..9cef8a7
Binary files /dev/null and b/installer/images/banner_bg.gif differ
diff --git a/installer/images/banner_logo.gif b/installer/images/banner_logo.gif
new file mode 100644 (file)
index 0000000..a7dd114
Binary files /dev/null and b/installer/images/banner_logo.gif differ
diff --git a/installer/images/banner_right.gif b/installer/images/banner_right.gif
new file mode 100644 (file)
index 0000000..3248668
Binary files /dev/null and b/installer/images/banner_right.gif differ
diff --git a/installer/images/delete.png b/installer/images/delete.png
new file mode 100755 (executable)
index 0000000..08f2493
Binary files /dev/null and b/installer/images/delete.png differ
diff --git a/installer/index.php b/installer/index.php
new file mode 100644 (file)
index 0000000..264cefc
--- /dev/null
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<title>RoundCube Webmail Installer</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="styles.css" />
+<script type="text/javascript" src="client.js"></script>
+</head>
+
+<body>
+
+<div id="banner">
+  <div id="header">
+    <div class="banner-logo"><a href="http://www.roundcube.net"><img src="images/banner_logo.gif" width="200" height="56" border="0" alt="RoundCube Webmal Project" /></a></div>
+    <div class="banner-right"><img src="images/banner_right.gif" width="10" height="56" alt="" /></div>
+  </div>
+  <div id="topnav">
+    <a href="http://trac.roundcube.net/wiki/Howto_Install">How-to Wiki</a>
+  </div>
+ </div>
+
+<div id="content">
+
+<h1>RoundCube Webmail Installer</h1>
+
+<?php
+
+  ini_set('error_reporting', E_ALL&~E_NOTICE);
+  ini_set('display_errors', 1);
+
+  $docroot = realpath(dirname(__FILE__) . '/../');
+  $include_path  = $docroot . '/program/lib' . PATH_SEPARATOR . $docroot . '/program' . PATH_SEPARATOR . ini_get('include_path');
+  set_include_path($include_path);
+
+  require_once 'rcube_install.php';
+  $RCI = rcube_install::get_instance();
+  $RCI->load_config();
+  
+?>
+
+<ol id="progress">
+<?php
+  
+  foreach (array('Check environment', 'Create config', 'Test config') as $i => $item) {
+    $j = $i + 1;
+    $link = ($RCI->step >= $j || $RCI->configured) ? '<a href="./index.php?_step='.$j.'">' . Q($item) . '</a>' : Q($item);
+    printf('<li class="step%d%s">%s</li>', $j+1, $RCI->step > $j ? ' passed' : ($RCI->step == $j ? ' current' : ''), $link);
+  }
+?>
+</ol>
+
+<?php
+
+$include_steps = array('welcome.html', 'check.php', 'config.php', 'test.php');
+
+if ($include_steps[$RCI->step]) {
+  include $include_steps[$RCI->step];
+}
+else {
+  header("HTTP/1.0 404 Not Found");
+  echo '<h2 class="error">Invalid step</h2>';
+}
+
+?>
+</div>
+
+<div id="footer">
+  Installer by the RoundCube Dev Team. Copyright &copy; 2008 - Published under the GNU Public License;&nbsp;
+  Icons by <a href="http://famfamfam.com">famfamfam</a>
+</div>
+</body>
+</html>
diff --git a/installer/rcube_install.php b/installer/rcube_install.php
new file mode 100644 (file)
index 0000000..8caa79d
--- /dev/null
@@ -0,0 +1,374 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | rcube_install.php                                                     |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail package                    |
+ | Copyright (C) 2008, RoundCube Dev. - Switzerland                      |
+ | Licensed under the GNU Public License                                 |
+ +-----------------------------------------------------------------------+
+
+ $Id:  $
+
+*/
+
+
+/**
+ * Class to control the installation process of the RoundCube Webmail package
+ *
+ * @category Install
+ * @package  RoundCube
+ * @author Thomas Bruederli
+ */
+class rcube_install
+{
+  var $step;
+  var $is_post = false;
+  var $failures = 0;
+  var $config = array();
+  var $configured = false;
+  var $last_error = null;
+  var $email_pattern = '([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9])';
+  var $config_props = array();
+  
+  /**
+   * Constructor
+   */
+  function rcube_install()
+  {
+    $this->step = intval($_REQUEST['_step']);
+    $this->is_post = $_SERVER['REQUEST_METHOD'] == 'POST';
+  }
+  
+  /**
+   * Singleton getter
+   */
+  function get_instance()
+  {
+    static $inst;
+    
+    if (!$inst)
+      $inst = new rcube_install();
+    
+    return $inst;
+  }
+  
+  /**
+   * Read the default config files and store properties
+   */
+  function load_defaults()
+  {
+    $this->_load_config('.php.dist');
+  }
+
+
+  /**
+   * Read the local config files and store properties
+   */
+  function load_config()
+  {
+    $this->config = array();
+    $this->_load_config('.php');
+    $this->configured = !empty($this->config);
+  }
+
+  /**
+   * Read the default config file and store properties
+   * @access private
+   */
+  function _load_config($suffix)
+  {
+    @include '../config/main.inc' . $suffix;
+    if (is_array($rcmail_config)) {
+      $this->config += $rcmail_config;
+    }
+      
+    @include '../config/db.inc'. $suffix;
+    if (is_array($rcmail_config)) {
+      $this->config += $rcmail_config;
+    }
+  }
+  
+  
+  /**
+   * Getter for a certain config property
+   *
+   * @param string Property name
+   * @param string Default value
+   * @return string The property value
+   */
+  function getprop($name, $default = '')
+  {
+    $value = $this->is_post && (isset($_POST["_$name"]) || $this->config_props[$name]) ? $_POST["_$name"] : $this->config[$name];
+    
+    if ($name == 'des_key' && !isset($_REQUEST["_$name"]))
+      $value = rcube_install::random_key(24);
+    
+    return $value !== null && $value !== '' ? $value : $default;
+  }
+  
+  
+  /**
+   * Take the default config file and replace the parameters
+   * with the submitted form data
+   *
+   * @param string Which config file (either 'main' or 'db')
+   * @return string The complete config file content
+   */
+  function create_config($which)
+  {
+    $out = file_get_contents("../config/{$which}.inc.php.dist");
+    
+    if (!$out)
+      return '[Warning: could not read the template file]';
+    
+    foreach ($this->config as $prop => $default) {
+      $value = (isset($_POST["_$prop"]) || $this->config_props[$prop]) ? $_POST["_$prop"] : $default;
+      
+      // convert some form data
+      if ($prop == 'debug_level' && is_array($value)) {
+        $val = 0;
+        foreach ($value as $i => $dbgval)
+          $val += intval($dbgval);
+        $value = $val;
+      }
+      else if ($prop == 'db_dsnw' && !empty($_POST['_dbtype'])) {
+        if ($_POST['_dbtype'] == 'sqlite')
+          $value = sprintf('%s://%s?mode=0646', $_POST['_dbtype'], $_POST['_dbname']{0} == '/' ? '/' . $_POST['_dbname'] : $_POST['_dbname']);
+        else
+          $value = sprintf('%s://%s:%s@%s/%s', $_POST['_dbtype'], $_POST['_dbuser'], $_POST['_dbpass'], $_POST['_dbhost'], $_POST['_dbname']);
+      }
+      else if ($prop == 'smtp_auth_type' && $value == '0') {
+        $value = '';
+      }
+      else if ($prop == 'default_host' && is_array($value)) {
+        $value = rcube_install::_clean_array($value);
+        if (count($value) <= 1)
+          $value = $value[0];
+      }
+      else if ($prop == 'smtp_user' && !empty($_POST['_smtp_user_u'])) {
+        $value = '%u';
+      }
+      else if ($prop == 'smtp_pass' && !empty($_POST['_smtp_user_u'])) {
+        $value = '%p';
+      }
+      else if (is_bool($default)) {
+        $value = (bool)$value;
+      }
+      else if (is_numeric($value)) {
+        $value = intval($value);
+      }
+      
+      // skip this property
+      if ($value == $default)
+        continue;
+      
+      // replace the matching line in config file
+      $out = preg_replace(
+        '/(\$rcmail_config\[\''.preg_quote($prop).'\'\])\s+=\s+(.+);/Uie',
+        "'\\1 = ' . var_export(\$value, true) . ';'",
+        $out);
+    }
+    
+    return $out;
+  }
+  
+  
+  /**
+   * Getter for the last error message
+   *
+   * @return string Error message or null if none exists
+   */
+  function get_error()
+  {
+      return $this->last_error['message'];
+  }
+  
+  
+  /**
+   * Return a list with all imap hosts configured
+   *
+   * @return array Clean list with imap hosts
+   */
+  function get_hostlist()
+  {
+    $default_hosts = (array)$this->getprop('default_host');
+    $out = array();
+    
+    foreach ($default_hosts as $key => $name) {
+      if (!empty($name))
+        $out[] = is_numeric($key) ? $name : $key;
+    }
+    
+    return $out;
+  }
+  
+  
+  /**
+   * Display OK status
+   *
+   * @param string Test name
+   * @param string Confirm message
+   */
+  function pass($name, $message = '')
+  {
+    echo Q($name) . ':&nbsp; <span class="success">OK</span>';
+    $this->_showhint($message);
+  }
+  
+  
+  /**
+   * Display an error status and increase failure count
+   *
+   * @param string Test name
+   * @param string Error message
+   * @param string URL for details
+   */
+  function fail($name, $message = '', $url = '')
+  {
+    $this->failures++;
+    
+    echo Q($name) . ':&nbsp; <span class="fail">NOT OK</span>';
+    $this->_showhint($message, $url);
+  }
+  
+  
+  /**
+   * Display warning status
+   *
+   * @param string Test name
+   * @param string Warning message
+   * @param string URL for details
+   */
+  function na($name, $message = '', $url = '')
+  {
+    echo Q($name) . ':&nbsp; <span class="na">NOT AVAILABLE</span>';
+    $this->_showhint($message, $url);
+  }
+  
+  
+  function _showhint($message, $url = '')
+  {
+    $hint = Q($message);
+    
+    if ($url)
+      $hint .= ($hint ? '; ' : '') . 'See <a href="' . Q($url) . '" target="_blank">' . Q($url) . '</a>';
+      
+    if ($hint)
+      echo '<span class="indent">(' . $hint . ')</span>';
+  }
+  
+  
+  function _clean_array($arr)
+  {
+    $out = array();
+    
+    foreach (array_unique($arr) as $i => $val)
+      if (!empty($val))
+        $out[] = $val;
+    
+    return $out;
+  }
+  
+  
+  /**
+   * Initialize the database with the according schema
+   *
+   * @param object rcube_db Database connection
+   * @return boolen True on success, False on error
+   */
+  function init_db($DB)
+  {
+    $db_map = array('pgsql' => 'postgres', 'mysqli' => 'mysql');
+    $engine = isset($db_map[$DB->db_provider]) ? $db_map[$DB->db_provider] : $DB->db_provider;
+    
+    // find out db version
+    if ($engine == 'mysql') {
+      $DB->query('SELECT VERSION() AS version');
+      $sql_arr = $DB->fetch_assoc();
+      $version = floatval($sql_arr['version']);
+      
+      if ($version >= 4.1)
+        $engine = 'mysql5';
+    }
+    
+    // read schema file from /SQL/*
+    $fname = "../SQL/$engine.initial.sql";
+    if ($lines = @file($fname, FILE_SKIP_EMPTY_LINES)) {
+      $buff = '';
+      foreach ($lines as $i => $line) {
+        if (eregi('^--', $line))
+          continue;
+          
+        $buff .= $line . "\n";
+        if (eregi(';$', trim($line))) {
+          $DB->query($buff);
+          $buff = '';
+        }
+      }
+    }
+    else {
+      $this->fail('DB Schema', "Cannot read the schema file: $fname");
+      return false;
+    }
+    
+    if ($err = $this->get_error()) {
+      $this->fail('DB Schema', "Error creating database schema: $err");
+      return false;
+    }
+
+    return true;
+  }
+  
+  /**
+   * Handler for RoundCube errors
+   */
+  function raise_error($p)
+  {
+      $this->last_error = $p;
+  }
+  
+  
+  /**
+   * Generarte a ramdom string to be used as encryption key
+   *
+   * @param int Key length
+   * @return string The generated random string
+   * @static
+   */
+  function random_key($length)
+  {
+    $alpha = 'ABCDEFGHIJKLMNOPQERSTUVXYZabcdefghijklmnopqrtsuvwxyz0123456789+*%&?!$-_=';
+    $out = '';
+    
+    for ($i=0; $i < $length; $i++)
+      $out .= $alpha{rand(0, strlen($alpha)-1)};
+    
+    return $out;
+  }
+  
+}
+
+
+/**
+ * Shortcut function for htmlentities()
+ *
+ * @param string String to quote
+ * @return string The html-encoded string
+ */
+function Q($string)
+{
+  return htmlentities($string);
+}
+
+
+/**
+ * Fake rinternal error handler to catch errors
+ */
+function raise_error($p)
+{
+  $rci = rcube_install::get_instance();
+  $rci->raise_error($p);
+}
+
diff --git a/installer/styles.css b/installer/styles.css
new file mode 100644 (file)
index 0000000..ed64ff0
--- /dev/null
@@ -0,0 +1,231 @@
+
+body {
+  margin: 1em 2em 2em 2em;
+  background-color: #fff;
+}
+
+body, td, th, div, p {
+  font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+  font-size: small;
+  color: #000;
+}
+
+#banner {
+  position: relative;
+}
+
+#header {
+  position: relative;
+  height: 56px;
+  background: url('images/banner_bg.gif') top left repeat-x #fff;
+}
+
+#header div.banner-logo {
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  width: 200px;
+  height: 56px;
+}
+
+#header div.banner-right {
+  position: absolute;
+  right: 0px;
+  top: 0px;
+  width: 10px;
+  height: 56px;
+}
+
+#topnav {
+  position: absolute;
+  right: 20px;
+  bottom: 8px;
+  text-align: right;
+  color: #ebebeb;
+  font-size: smaller;
+}
+
+#topnav a {
+  color: #ebebeb;
+  font-size: 11px;
+  text-decoration: none;
+}
+
+#topnav a:hover {
+  text-decoration: underline;
+}
+
+#content {
+  margin: 8px 20px;
+}
+
+#footer {
+  margin: 2em 20px 1em 20px;
+  padding-top: 0.6em;
+  font-size: smaller;
+  text-align: center;
+  border-top: 1px dotted #999;
+}
+
+#progress {
+  margin-bottom: 2em;
+  border: 1px solid #aaa;
+  background-color: #f9f9f9;
+}
+
+#progress:after {
+  content: ".";
+  display: block;
+  height: 0;
+  font-size: 0;
+  clear: both;
+  visibility: hidden;
+}
+
+#progress li {
+  float: left;
+  color: #999;
+  padding: 1em 5em 1em 0.2em;
+}
+
+#progress li a {
+  color: #999;
+  text-decoration: none;
+}
+
+#progress li a:hover {
+  text-decoration: underline;
+}
+
+#progress li.current {
+  color: #000;
+  font-weight: bold;
+}
+
+#progress li.passed,
+#progress li.passed a,
+#progress li.current a {
+  color: #333;
+}
+
+fieldset {
+  margin-bottom: 1.5em;
+  border: 1px solid #aaa;
+  background-color: #f9f9f9;
+}
+
+fieldset p.hint {
+  margin-top: 0.5em;
+}
+
+legend {
+  font-size: 1.1em;
+  font-weight: bold;
+}
+
+textarea.configfile {
+  background-color: #f9f9f9;
+  font-family: monospace;
+  font-size: 9pt;
+  width: 100%;
+  height: 30em;
+}
+
+dt.propname {
+  font-family: monospace;
+  font-size: 9pt;
+  margin-top: 1em;
+  margin-bottom: 0.6em;
+}
+
+dd div {
+  margin-top: 0.3em;
+}
+
+dd label {
+  padding-left: 0.5em;
+}
+
+th {
+  text-align: left;
+}
+
+ul li {
+  margin: 0.3em 0 0.4em -1em;
+}
+
+ul li ul li {
+  margin-bottom: 0.2em;
+}
+
+h3 {
+  font-size: 1.1em;
+  margin-top: 1.5em;
+  margin-bottom: 0.6em;
+}
+
+h4 {
+  margin-bottom: 0.2em;
+}
+
+a.blocktoggle {
+  color: #666;
+  text-decoration: none;
+}
+
+a.addlink {
+  color: #999;
+  font-size: 0.9em;
+  padding: 1px 0 1px 20px;
+  background: url('images/add.png') top left no-repeat;
+  text-decoration: none;
+}
+
+a.removelink {
+  color: #999;
+  font-size: 0.9em;
+  padding: 1px 0 1px 24px;
+  background: url('images/delete.png') 4px 0 no-repeat;
+  text-decoration: none;
+}
+
+.hint {
+  color: #666;
+  font-size: 0.95em;
+}
+
+.success {
+  color: #006400;
+  font-weight: bold !important;
+}
+
+.fail {
+  color: #ff0000 !important;
+  font-weight: bold !important;
+}
+
+.na {
+  color: #f60;
+  font-weight: bold;
+}
+
+.indent {
+  padding-left: 0.8em;
+}
+
+.notice {
+  padding: 1em;
+  background-color: #f7fdcb;
+  border: 2px solid #c2d071;
+}
+
+.warning {
+  padding: 1em;
+  background-color: #ef9398;
+  border: 2px solid #dc5757;
+}
+
+.userconf {
+  color: #00c;
+  font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+}
diff --git a/installer/test.php b/installer/test.php
new file mode 100644 (file)
index 0000000..7e99039
--- /dev/null
@@ -0,0 +1,324 @@
+<form action="index.php?_step=3" method="post">
+
+<h3>Check config files</h3>
+<?php
+
+require_once 'include/rcube_html.inc';
+
+$read_main = is_readable('../config/main.inc.php');
+$read_db = is_readable('../config/db.inc.php');
+
+if ($read_main && !empty($RCI->config)) {
+  $RCI->pass('main.inc.php');
+}
+else if ($read_main) {
+  $RCI->fail('main.inc.php', 'Syntax error');
+}
+else if (!$read_main) {
+  $RCI->fail('main.inc.php', 'Unable to read file. Did you create the config files?');
+}
+echo '<br />';
+
+if ($read_db && !empty($RCI->config['db_table_users'])) {
+  $RCI->pass('db.inc.php');
+}
+else if ($read_db) {
+  $RCI->fail('db.inc.php', 'Syntax error');
+}
+else if (!$read_db) {
+  $RCI->fail('db.inc.php', 'Unable to read file. Did you create the config files?');
+}
+
+?>
+
+<h3>Check configured database settings</h3>
+<?php
+
+$db_working = false;
+if (!empty($RCI->config)) {
+    if (!empty($RCI->config['db_backend']) && !empty($RCI->config['db_dsnw'])) {
+
+        echo 'Backend: ';
+        echo 'PEAR::' . strtoupper($RCI->config['db_backend']) . '<br />';
+
+        $_class = 'rcube_' . strtolower($RCI->config['db_backend']);
+        require_once 'include/' . $_class . '.inc';
+
+        $DB = new $_class($RCI->config['db_dsnw'], '', false);
+        $DB->db_connect('w');
+        if (!($db_error_msg = $DB->is_error())) {
+            $RCI->pass('DSN (write)');
+            echo '<br />';
+            $db_working = true;
+        }
+        else {
+            $RCI->fail('DSN (write)', $db_error_msg);
+            echo '<p class="hint">Make sure that the configured database extists and that the user as write privileges<br />';
+            echo 'DSN: ' . $RCI->config['db_dsnw'] . '</p>';
+            if ($RCI->config['db_backend'] == 'mdb2')
+              echo '<p class="hint">There are known problems with MDB2 running on PHP 4. Try setting <tt>db_backend</tt> to \'db\' instead</p>';
+        }
+    }
+    else {
+        $RCI->fail('DSN (write)', 'not set');
+    }
+}
+else {
+    $RCI->fail('Config', 'Could not read config files');
+}
+
+// initialize db with schema found in /SQL/*
+if ($db_working && $_POST['initdb']) {
+    if (!($success = $RCI->init_db($DB))) {
+        $db_working = false;
+        echo '<p class="warning">Please try to inizialize the database manually as described in the INSTALL guide.
+          Make sure that the configured database extists and that the user as write privileges</p>';
+    }
+}
+
+// test database
+if ($db_working) {
+    $db_read = $DB->query("SELECT count(*) FROM {$RCI->config['db_table_users']}");
+    if (!$db_read) {
+        $RCI->fail('DB Schema', "Database not initialized");
+        $db_working = false;
+        echo '<p><input type="submit" name="initdb" value="Initialize database" /></p>';
+    }
+    else {
+        $RCI->pass('DB Schema');
+    }
+    echo '<br />';
+}
+
+// more database tests
+if ($db_working) {
+    // write test
+    $db_write = $DB->query("INSERT INTO {$RCI->config['db_table_cache']} (session_id, cache_key, data, user_id) VALUES (?, ?, ?, 0)", '1234567890abcdef', 'test', 'test');
+    $insert_id = $DB->insert_id($RCI->config['db_sequence_cache']);
+    
+    if ($db_write && $insert_id) {
+      $RCI->pass('DB Write');
+      $DB->query("DELETE FROM {$RCI->config['db_table_cache']} WHERE cache_id=?", $insert_id);
+    }
+    else {
+      $RCI->fail('DB Write', $RCI->get_error());
+    }
+    echo '<br />';    
+    
+    // check timezone settings
+    $tz_db = 'SELECT ' . $DB->unixtimestamp($DB->now()) . ' AS tz_db';
+    $tz_db = $DB->query($tz_db);
+    $tz_db = $DB->fetch_assoc($tz_db);
+    $tz_db = (int) $tz_db['tz_db'];
+    $tz_local = (int) time();
+    $tz_diff  = $tz_local - $tz_db;
+
+    // sometimes db and web servers are on separate hosts, so allow a 30 minutes delta
+    if (abs($tz_diff) > 1800) {
+        $RCI->fail('DB Time', "Database time differs {$td_ziff}s from PHP time");
+    }
+    else {
+        $RCI->pass('DB Time');
+    }
+}
+
+?>
+
+<h3>Test SMTP settings</h3>
+
+<p>
+Server: <?php echo $RCI->getprop('smtp_server', 'PHP mail()'); ?><br />
+Port: <?php echo $RCI->getprop('smtp_port'); ?><br />
+
+<?php
+
+if ($RCI->getprop('smtp_server')) {
+  $user = $RCI->getprop('smtp_user', '(none)');
+  $pass = $RCI->getprop('smtp_pass', '(none)');
+  
+  if ($user == '%u') {
+    $user_field = new textfield(array('name' => '_user'));
+    $user = $user_field->show($_POST['_user']);
+  }
+  if ($pass == '%p') {
+    $pass_field = new passwordfield(array('name' => '_pass'));
+    $pass = $pass_field->show();
+  }
+  
+  echo "User: $user<br />";
+  echo "Password: $pass<br />";
+}
+
+$from_field = new textfield(array('name' => '_from', 'id' => 'sendmailfrom'));
+$to_field = new textfield(array('name' => '_to', 'id' => 'sendmailto'));
+
+?>
+</p>
+
+<?php
+
+if (isset($_POST['sendmail']) && !empty($_POST['_from']) && !empty($_POST['_to'])) {
+  
+  require_once 'lib/rc_mail_mime.inc';
+  require_once 'include/rcube_smtp.inc';
+  
+  echo '<p>Trying to send email...<br />';
+  
+  if (preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_from'])) &&
+      preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_to']))) {
+  
+    $headers = array(
+      'From' => trim($_POST['_from']),
+      'To'  => trim($_POST['_to']),
+      'Subject' => 'Test message from RoundCube',
+    );
+
+    $body = 'This is a test to confirm that RoundCube can send email.';
+    $smtp_response = array();
+    
+    // send mail using configured SMTP server
+    if ($RCI->getprop('smtp_server')) {
+      $CONFIG = $RCI->config;
+      
+      if (!empty($_POST['_user']))
+        $CONFIG['smtp_user'] = $_POST['_user'];
+      if (!empty($_POST['_pass']))
+        $CONFIG['smtp_pass'] = $_POST['_pass'];
+      
+      $mail_object  = new rc_mail_mime();
+      $send_headers = $mail_object->headers($headers);
+      
+      $status = smtp_mail($headers['From'], $headers['To'],
+          ($foo = $mail_object->txtHeaders($send_headers)),
+          $body, $smtp_response);
+    }
+    else {    // use mail()
+      $header_str = 'From: ' . $headers['From'];
+      
+      if (ini_get('safe_mode'))
+        $status = mail($headers['To'], $headers['Subject'], $body, $header_str);
+      else
+        $status = mail($headers['To'], $headers['Subject'], $body, $header_str, '-f'.$headers['From']);
+      
+      if (!$status)
+        $smtp_response[] = 'Mail delivery with mail() failed. Check your error logs for details';
+    }
+
+    if ($status) {
+        $RCI->pass('SMTP send');
+    }
+    else {
+        $RCI->fail('SMTP send', join('; ', $smtp_response));
+    }
+  }
+  else {
+    $RCI->fail('SMTP send', 'Invalid sender or recipient');
+  }
+}
+
+echo '</p>';
+
+?>
+
+<table>
+<tbody>
+  <tr>
+    <td><label for="sendmailfrom">Sender</label></td>
+    <td><?php echo $from_field->show($_POST['_from']); ?></td>
+  </tr>
+  <tr>
+    <td><label for="sendmailto">Recipient</label></td>
+    <td><?php echo $to_field->show($_POST['_to']); ?></td>
+  </tr>
+</tbody>
+</table>
+
+<p><input type="submit" name="sendmail" value="Send test mail" /></p>
+
+
+<h3>Test IMAP configuration</h3>
+
+<?php
+
+$default_hosts = $RCI->get_hostlist();
+if (!empty($default_hosts)) {
+  $host_field = new select(array('name' => '_host', 'id' => 'imaphost'));
+  $host_field->add($default_hosts);
+}
+else {
+  $host_field = new textfield(array('name' => '_host', 'id' => 'imaphost'));
+}
+
+$user_field = new textfield(array('name' => '_user', 'id' => 'imapuser'));
+$pass_field = new passwordfield(array('name' => '_pass', 'id' => 'imappass'));
+
+?>
+
+<table>
+<tbody>
+  <tr>
+    <td><label for="imaphost">Server</label></td>
+    <td><?php echo $host_field->show($_POST['_host']); ?></td>
+  </tr>
+  <tr>
+    <td>Port</td>
+    <td><?php echo $RCI->getprop('default_port'); ?></td>
+  </tr>
+    <tr>
+      <td><label for="imapuser">Username</label></td>
+      <td><?php echo $user_field->show($_POST['_user']); ?></td>
+    </tr>
+    <tr>
+      <td><label for="imappass">Password</label></td>
+      <td><?php echo $pass_field->show(); ?></td>
+    </tr>
+</tbody>
+</table>
+
+<?php
+
+if (isset($_POST['imaptest']) && !empty($_POST['_host']) && !empty($_POST['_user'])) {
+  
+  require_once 'include/rcube_imap.inc';
+  
+  echo '<p>Connecting to ' . Q($_POST['_host']) . '...<br />';
+  
+  $a_host = parse_url($_POST['_host']);
+  if ($a_host['host']) {
+    $imap_host = $a_host['host'];
+    $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null;
+    $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : $CONFIG['default_port']);
+  }
+  else {
+    $imap_host = trim($_POST['_host']);
+    $imap_port = $RCI->getprop('default_port');
+  }
+  
+  $imap = new rcube_imap(null);
+  if ($imap->connect($imap_host, $_POST['_user'], $_POST['_pass'], $imap_port, $imap_ssl)) {
+    $RCI->pass('IMAP connect', 'SORT capability: ' . ($imap->get_capability('SORT') ? 'yes' : 'no'));
+    $imap->close();
+  }
+  else {
+    $RCI->fail('IMAP connect', $RCI->get_error());
+  }
+}
+
+?>
+
+<p><input type="submit" name="imaptest" value="Check login" /></p>
+
+</form>
+
+<hr />
+
+<p class="warning">
+
+After completing the installation and the final tests please <b>remove</b> the whole
+installer folder from the document root of the webserver.<br />
+<br />
+
+These files may expose sensitive configuration data like server passwords and encryption keys
+to the public. Make sure you cannot access this installer from your browser.
+
+</p>
diff --git a/installer/welcome.html b/installer/welcome.html
new file mode 100644 (file)
index 0000000..a0c88e5
--- /dev/null
@@ -0,0 +1,35 @@
+<form action="index.php" methond="get">
+<input type="hidden" name="_step" value="1" />
+
+<p>Welcome to the interactive install script for the RoundCube Webmail package</p>
+<p>First let's check your local environment and find out if everything RoundCube needs is available.</p>
+
+<p>The basic requirements are:</p>
+<ul>
+  <li>PHP Version 4.3.1 or greater including
+    <ul>
+      <li>PCRE (perl compatible regular expression)</li>
+      <li>Session support</li>
+      <li>Sockets enabled</li>
+      <li>Libiconv (recommended)</li>
+      <li>OpenSSL (recommended)</li>
+      <li>FileInfo (optional)</li>
+      <li>Multibyte/mbstring (optional)</li>
+      <li>Mcrypt (optional)</li>
+      </ul>
+    </li>
+    <li>php.ini options:
+      <ul>
+        <li>error_reporting E_ALL &amp; ~E_NOTICE (or lower)</li>
+        <li>file_uploads on (for attachment upload features)</li>
+        <li>session.auto_start needs to be off</li>
+        <li>magic_quotes_gpc off</li>
+      </ul>
+    </li>
+    <li>A MySQL or PostgreSQL database engine or the SQLite extension for PHP</li>
+    <li>An SMTP server (recommended) or PHP configured for mail delivery</li>
+</ul>
+
+<input type="submit" value="START INSTALLATION" />
+
+</form>
index 55135eb8cc682fc2faaf18c0f0c976522d0f7445..5af2379bb192e1bc0f2252305048ce1ad12b2018 100644 (file)
@@ -5,7 +5,7 @@
  | program/include/main.inc                                              |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev, - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: main.inc 903 2007-10-22 06:52:13Z thomasb $
+ $Id: main.inc 1145 2008-02-27 13:39:22Z thomasb $
 
 */
 
  */
 
 require_once('lib/utf7.inc');
+require_once('include/rcube_user.inc');
 require_once('include/rcube_shared.inc');
 require_once('include/rcmail_template.inc');
 
-
 // define constannts for input reading
 define('RCUBE_INPUT_GET', 0x0101);
 define('RCUBE_INPUT_POST', 0x0102);
@@ -46,7 +46,7 @@ define('RCUBE_INPUT_GPC', 0x0103);
 function rcmail_startup($task='mail')
   {
   global $sess_id, $sess_user_lang;
-  global $CONFIG, $INSTALL_PATH, $BROWSER, $OUTPUT, $_SESSION, $IMAP, $DB;
+  global $CONFIG, $INSTALL_PATH, $BROWSER, $OUTPUT, $_SESSION, $IMAP, $DB, $USER;
 
   // check client
   $BROWSER = rcube_browser();
@@ -54,6 +54,11 @@ function rcmail_startup($task='mail')
   // load configuration
   $CONFIG = rcmail_load_config();
 
+  // set session domain
+  if (isset($CONFIG['session_domain']) && !empty($CONFIG['session_domain'])) {
+    ini_set('session.cookie_domain', $CONFIG['session_domain']);
+  }
+
   // set session garbage collecting time according to session_lifetime
   if (!empty($CONFIG['session_lifetime']))
     ini_set('session.gc_maxlifetime', ($CONFIG['session_lifetime']) * 120);
@@ -85,10 +90,11 @@ function rcmail_startup($task='mail')
   // set session vars global
   $sess_user_lang = rcube_language_prop($_SESSION['user_lang']);
 
+  // create user object
+  $USER = new rcube_user($_SESSION['user_id']);
 
   // overwrite config with user preferences
-  if (is_array($_SESSION['user_prefs']))
-    $CONFIG = array_merge($CONFIG, $_SESSION['user_prefs']);
+  $CONFIG = array_merge($CONFIG, (array)$USER->get_prefs());
 
 
   // reset some session parameters when changing task
@@ -231,7 +237,8 @@ function rcmail_authenticate_session()
     $valid = $CONFIG['ip_check'] ? $_SERVER['REMOTE_ADDR'] == $SESS_CLIENT_IP : true;
   
   // check session filetime
-  if (!empty($CONFIG['session_lifetime']) && isset($SESS_CHANGED) && $SESS_CHANGED + $CONFIG['session_lifetime']*60 < time())
+  if (!empty($CONFIG['session_lifetime']) && isset($SESS_CHANGED)
+      && $SESS_CHANGED + $CONFIG['session_lifetime']*60 < time())
     $valid = false;
   
   return $valid;
@@ -319,21 +326,18 @@ function rcmail_shutdown()
  */
 function rcmail_kill_session()
   {
-  // save user preferences
-  $a_user_prefs = $_SESSION['user_prefs'];
-  if (!is_array($a_user_prefs))
-    $a_user_prefs = array();
-    
+  global $USER;
+  
   if ((isset($_SESSION['sort_col']) && $_SESSION['sort_col']!=$a_user_prefs['message_sort_col']) ||
       (isset($_SESSION['sort_order']) && $_SESSION['sort_order']!=$a_user_prefs['message_sort_order']))
     {
-    $a_user_prefs['message_sort_col'] = $_SESSION['sort_col'];
-    $a_user_prefs['message_sort_order'] = $_SESSION['sort_order'];
-    rcmail_save_user_prefs($a_user_prefs);
+    $a_user_prefs = array('message_sort_col' => $_SESSION['sort_col'], 'message_sort_order' => $_SESSION['sort_order']);
+    $USER->save_prefs($a_user_prefs);
     }
 
   $_SESSION = array('user_lang' => $GLOBALS['sess_user_lang'], 'auth_time' => time(), 'temp' => true);
   setcookie('sessauth', '-del-', time()-60);
+  $USER->reset();
   }
 
 
@@ -374,7 +378,7 @@ function get_sequence_name($sequence)
   if (strlen($CONFIG[$config_key]))
     return $CONFIG[$config_key];
   
-  return $table;
+  return $sequence;
   }
 
 
@@ -529,7 +533,7 @@ function rcmail_autoselect_host()
  */
 function rcmail_login($user, $pass, $host=NULL)
   {
-  global $CONFIG, $IMAP, $DB, $sess_user_lang;
+  global $CONFIG, $IMAP, $DB, $USER, $sess_user_lang;
   $user_id = NULL;
   
   if (!$host)
@@ -560,7 +564,7 @@ function rcmail_login($user, $pass, $host=NULL)
   if ($a_host['host'])
     {
     $host = $a_host['host'];
-    $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? TRUE : FALSE;
+    $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null;
     $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : $CONFIG['default_port']);
     }
   else
@@ -581,58 +585,50 @@ function rcmail_login($user, $pass, $host=NULL)
 
   // try to resolve email address from virtuser table    
   if (!empty($CONFIG['virtuser_file']) && strpos($user, '@'))
-    $user = rcmail_email2user($user);
+    $user = rcube_user::email2user($user);
 
   // lowercase username if it's an e-mail address (#1484473)
   if (strpos($user, '@'))
     $user = strtolower($user);
 
   // query if user already registered
-  $sql_result = $DB->query(
-    "SELECT user_id, username, language, preferences
-     FROM ".get_table_name('users')."
-     WHERE  mail_host=? AND (username=? OR alias=?)",
-    $host,
-    $user,
-    $user);
+  if ($existing = rcube_user::query($user, $host))
+    $USER = $existing;
 
   // user already registered -> overwrite username
-  if ($sql_arr = $DB->fetch_assoc($sql_result))
+  if ($USER->ID)
     {
-    $user_id = $sql_arr['user_id'];
-    $user = $sql_arr['username'];
+    $user_id = $USER->ID;
+    $user = $USER->data['username'];
     }
 
   // exit if IMAP login failed
   if (!($imap_login  = $IMAP->connect($host, $user, $pass, $imap_port, $imap_ssl)))
-    return FALSE;
+    return false;
 
   // user already registered
-  if ($user_id && !empty($sql_arr))
+  if ($USER->ID)
     {
     // get user prefs
-    if (strlen($sql_arr['preferences']))
-      {
-      $user_prefs = unserialize($sql_arr['preferences']);
-      $_SESSION['user_prefs'] = $user_prefs;
-      array_merge($CONFIG, $user_prefs);
-      }
-
+    $CONFIG = array_merge($CONFIG, (array)$USER->get_prefs());
 
     // set user specific language
-    if (strlen($sql_arr['language']))
-      $sess_user_lang = $_SESSION['user_lang'] = $sql_arr['language'];
+    if (!empty($USER->data['language']))
+      $sess_user_lang = $_SESSION['user_lang'] = $USER->data['language'];
       
     // update user's record
-    $DB->query("UPDATE ".get_table_name('users')."
-                SET    last_login=".$DB->now()."
-                WHERE  user_id=?",
-                $user_id);
+    $USER->touch();
     }
   // create new system user
   else if ($CONFIG['auto_create_user'])
     {
-    $user_id = rcmail_create_user($user, $host);
+    if ($created = rcube_user::create($user, $host))
+    {
+      $USER = $created;
+      
+      // get existing mailboxes
+      $a_mailboxes = $IMAP->list_mailboxes();
+    }
     }
   else
     {
@@ -644,13 +640,13 @@ function rcmail_login($user, $pass, $host=NULL)
       ), true, false);
     }
 
-  if ($user_id)
+  if ($USER->ID)
     {
-    $_SESSION['user_id']   = $user_id;
+    $_SESSION['user_id']   = $USER->ID;
+    $_SESSION['username']  = $USER->data['username'];
     $_SESSION['imap_host'] = $host;
     $_SESSION['imap_port'] = $imap_port;
     $_SESSION['imap_ssl']  = $imap_ssl;
-    $_SESSION['username']  = $user;
     $_SESSION['user_lang'] = $sess_user_lang;
     $_SESSION['password']  = encrypt_passwd($pass);
     $_SESSION['login_time'] = mktime();
@@ -658,7 +654,9 @@ function rcmail_login($user, $pass, $host=NULL)
     // force reloading complete list of subscribed mailboxes
     rcmail_set_imap_prop();
     $IMAP->clear_cache('mailboxes');
-    $IMAP->create_default_folders();
+
+    if ($CONFIG['create_default_folders'])
+        $IMAP->create_default_folders();
 
     return TRUE;
     }
@@ -667,83 +665,6 @@ function rcmail_login($user, $pass, $host=NULL)
   }
 
 
-/**
- * Create new entry in users and identities table
- *
- * @param string User name
- * @param string IMAP host
- * @return mixed New user ID or False on failure
- */
-function rcmail_create_user($user, $host)
-{
-  global $DB, $CONFIG, $IMAP;
-
-  $user_email = '';
-
-  // try to resolve user in virtusertable
-  if (!empty($CONFIG['virtuser_file']) && !strpos($user, '@'))
-    $user_email = rcmail_user2email($user);
-
-  $DB->query("INSERT INTO ".get_table_name('users')."
-              (created, last_login, username, mail_host, alias, language)
-              VALUES (".$DB->now().", ".$DB->now().", ?, ?, ?, ?)",
-              strip_newlines($user),
-              strip_newlines($host),
-              strip_newlines($user_email),
-              $_SESSION['user_lang']);
-
-  if ($user_id = $DB->insert_id(get_sequence_name('users')))
-  {
-    $mail_domain = rcmail_mail_domain($host);
-   
-    if ($user_email=='')
-      $user_email = strpos($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
-
-    $user_name = $user!=$user_email ? $user : '';
-
-    // try to resolve the e-mail address from the virtuser table
-    if (!empty($CONFIG['virtuser_query']) &&
-        ($sql_result = $DB->query(preg_replace('/%u/', $DB->quote($user), $CONFIG['virtuser_query']))) &&
-        ($DB->num_rows()>0))
-    {
-      while ($sql_arr = $DB->fetch_array($sql_result))
-      {
-        $DB->query("INSERT INTO ".get_table_name('identities')."
-                   (user_id, del, standard, name, email)
-                   VALUES (?, 0, 1, ?, ?)",
-                   $user_id,
-                   strip_newlines($user_name),
-                   preg_replace('/^@/', $user . '@', $sql_arr[0]));
-      }
-    }
-    else
-    {
-      // also create new identity records
-      $DB->query("INSERT INTO ".get_table_name('identities')."
-                  (user_id, del, standard, name, email)
-                  VALUES (?, 0, 1, ?, ?)",
-                  $user_id,
-                  strip_newlines($user_name),
-                  strip_newlines($user_email));
-    }
-                       
-    // get existing mailboxes
-    $a_mailboxes = $IMAP->list_mailboxes();
-  }
-  else
-  {
-    raise_error(array(
-      'code' => 500,
-      'type' => 'php',
-      'line' => __LINE__,
-      'file' => __FILE__,
-      'message' => "Failed to create new user"), TRUE, FALSE);
-  }
-    
-  return $user_id;
-}
-
-
 /**
  * Load virtuser table in array
  *
@@ -789,90 +710,6 @@ function rcmail_findinvirtual($pattern)
   }
 
 
-/**
- * Resolve username using a virtuser table
- *
- * @param string E-mail address to resolve
- * @return string Resolved IMAP username
- */
-function rcmail_email2user($email)
-  {
-  $user = $email;
-  $r = rcmail_findinvirtual("^$email");
-
-  for ($i=0; $i<count($r); $i++)
-    {
-    $data = $r[$i];
-    $arr = preg_split('/\s+/', $data);
-    if(count($arr)>0)
-      {
-      $user = trim($arr[count($arr)-1]);
-      break;
-      }
-    }
-
-  return $user;
-  }
-
-
-/**
- * Resolve e-mail address from virtuser table
- *
- * @param string User name
- * @return string Resolved e-mail address
- */
-function rcmail_user2email($user)
-  {
-  $email = "";
-  $r = rcmail_findinvirtual("$user$");
-
-  for ($i=0; $i<count($r); $i++)
-    {
-    $data=$r[$i];
-    $arr = preg_split('/\s+/', $data);
-    if (count($arr)>0)
-      {
-      $email = trim($arr[0]);
-      break;
-      }
-    }
-
-  return $email;
-  } 
-
-
-/**
- * Write the given user prefs to the user's record
- *
- * @param mixed User prefs to save
- * @return boolean True on success, False on failure
- */
-function rcmail_save_user_prefs($a_user_prefs)
-  {
-  global $DB, $CONFIG, $sess_user_lang;
-  
-  // merge (partial) prefs array with existing settings
-  $a_user_prefs += (array)$_SESSION['user_prefs'];
-  
-  $DB->query("UPDATE ".get_table_name('users')."
-              SET    preferences=?,
-                     language=?
-              WHERE  user_id=?",
-              serialize($a_user_prefs),
-              $sess_user_lang,
-              $_SESSION['user_id']);
-
-  if ($DB->affected_rows())
-    {
-    $_SESSION['user_prefs'] = $a_user_prefs;  
-    $CONFIG = array_merge($CONFIG, $a_user_prefs);
-    return TRUE;
-    }
-    
-  return FALSE;
-  }
-
-
 /**
  * Overwrite action variable
  *
@@ -926,15 +763,30 @@ function show_message($message, $type='notice', $vars=NULL)
  * @return string Encryprted string
  */
 function encrypt_passwd($pass)
-  {
-  $td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, "");
-  $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
-  mcrypt_generic_init($td, get_des_key(), $iv);
-  $cypher = mcrypt_generic($td, $pass);
-  mcrypt_generic_deinit($td);
-  mcrypt_module_close($td);
-  return base64_encode($cypher);
+{
+  if (function_exists('mcrypt_module_open') && ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, ""))) {
+    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
+    mcrypt_generic_init($td, get_des_key(), $iv);
+    $cypher = mcrypt_generic($td, $pass);
+    mcrypt_generic_deinit($td);
+    mcrypt_module_close($td);
+  }
+  else if (function_exists('des')) {
+    $cypher = des(get_des_key(), $pass, 1, 0, NULL);
   }
+  else {
+    $cypher = $pass;
+    
+    raise_error(array(
+      'code' => 500,
+      'type' => 'php',
+      'file' => __FILE__,
+      'message' => "Could not convert encrypt password. Make sure Mcrypt is installed or lib/des.inc is available"
+      ), true, false);
+  }
+  
+  return base64_encode($cypher);
+}
 
 
 /**
@@ -944,13 +796,21 @@ function encrypt_passwd($pass)
  * @return string Plain password
  */
 function decrypt_passwd($cypher)
-  {
-  $td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, "");
-  $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
-  mcrypt_generic_init($td, get_des_key(), $iv);
-  $pass = mdecrypt_generic($td, base64_decode($cypher));
-  mcrypt_generic_deinit($td);
-  mcrypt_module_close($td);
+{
+  if (function_exists('mcrypt_module_open') && ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, ""))) {
+    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
+    mcrypt_generic_init($td, get_des_key(), $iv);
+    $pass = mdecrypt_generic($td, base64_decode($cypher));
+    mcrypt_generic_deinit($td);
+    mcrypt_module_close($td);
+  }
+  else if (function_exists('des')) {
+    $pass = des(get_des_key(), base64_decode($cypher), 0, 0, NULL);
+  }
+  else {
+    $pass = base64_decode($cypher);
+  }
+  
   return preg_replace('/\x00/', '', $pass);
   }
 
@@ -1076,42 +936,83 @@ function rcmail_message_cache_gc()
 function rcube_charset_convert($str, $from, $to=NULL)
   {
   global $MBSTRING;
+  static $convert_warning = false;
 
   $from = strtoupper($from);
   $to = $to==NULL ? strtoupper(RCMAIL_CHARSET) : strtoupper($to);
+  $error = false; $conv = null;
 
   if ($from==$to || $str=='' || empty($from))
     return $str;
+    
+  $aliases = array(
+    'UNKNOWN-8BIT'   => 'ISO-8859-15',
+    'X-UNKNOWN'      => 'ISO-8859-15',
+    'X-USER-DEFINED' => 'ISO-8859-15',
+    'ISO-8859-8-I'   => 'ISO-8859-8',
+    'KS_C_5601-1987' => 'EUC-KR',
+    'GB2312'         => 'GB18030'
+  );
 
   // convert charset using iconv module  
   if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7')
     {
-    $iconv_map = array('KS_C_5601-1987' => 'EUC-KR');
-    return iconv(($iconv_map[$from] ? $iconv_map[$from] : $from), ($iconv_map[$to] ? $iconv_map[$to] : $to) . "//IGNORE", $str);
+    return iconv(($aliases[$from] ? $aliases[$from] : $from), ($aliases[$to] ? $aliases[$to] : $to) . "//IGNORE", $str);
     }
 
   // convert charset using mbstring module  
   if ($MBSTRING)
     {
-    $mb_map = array('UTF-7' => 'UTF7-IMAP', 'KS_C_5601-1987' => 'EUC-KR');
+    $mb_map = $aliases + array('UTF-7' => 'UTF7-IMAP');
     
     // return if convert succeeded
     if (($out = mb_convert_encoding($str, ($mb_map[$to] ? $mb_map[$to] : $to), ($mb_map[$from] ? $mb_map[$from] : $from))) != '')
       return $out;
     }
+    
+  
+  if (class_exists('utf8'))
+    $conv = new utf8();
 
   // convert string to UTF-8
-  if ($from=='UTF-7')
+  if ($from == 'UTF-7')
     $str = utf7_to_utf8($str);
-  else if (($from=='ISO-8859-1') && function_exists('utf8_encode'))
+  else if (($from == 'ISO-8859-1') && function_exists('utf8_encode'))
     $str = utf8_encode($str);
+  else if ($from != 'UTF-8' && $conv)
+    {
+    $conv->loadCharset($from);
+    $str = $conv->strToUtf8($str);
+    }
+  else if ($from != 'UTF-8')
+    $error = true;
 
   // encode string for output
-  if ($to=='UTF-7')
+  if ($to == 'UTF-7')
     return utf8_to_utf7($str);
-  else if ($to=='ISO-8859-1' && function_exists('utf8_decode'))
+  else if ($to == 'ISO-8859-1' && function_exists('utf8_decode'))
     return utf8_decode($str);
+  else if ($to != 'UTF-8' && $conv)
+    {
+    $conv->loadCharset($to);
+    return $conv->utf8ToStr($str);
+    }
+  else if ($to != 'UTF-8')
+    $error = true;
 
+  // report error
+  if ($error && !$convert_warning)
+    {
+    raise_error(array(
+      'code' => 500,
+      'type' => 'php',
+      'file' => __FILE__,
+      'message' => "Could not convert string charset. Make sure iconv is installed or lib/utf8.class is available"
+      ), true, false);
+    
+    $convert_warning = true;
+    }
+  
   // return UTF-8 string
   return $str;
   }
@@ -1273,6 +1174,14 @@ function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL)
     return $value;
   }
 
+/**
+ * Remove all non-ascii and non-word chars
+ * except . and -
+ */
+function asciiwords($str)
+{
+  return preg_replace('/[^a-z0-9.-_]/i', '', $str);
+}
 
 /**
  * Remove single and double quotes from given string
@@ -1426,7 +1335,7 @@ function rcmail_get_edit_field($col, $value, $attrib, $type='text')
 
   // use value from post
   if (!empty($_POST[$fname]))
-    $value = $_POST[$fname];
+    $value = get_input_value($fname, RCUBE_INPUT_POST);
 
   $out = $input->show($value);
          
@@ -1500,6 +1409,26 @@ function rcmail_mod_css_styles($source, $container_id, $base_url = '')
   return $styles;
   }
 
+/**
+ * Try to autodetect operating system and find the correct line endings
+ *
+ * @return string The appropriate mail header delimiter
+ */
+function rcmail_header_delm()
+{
+  global $CONFIG;
+  
+  // use the configured delimiter for headers
+  if (!empty($CONFIG['mail_header_delimiter']))
+    return $CONFIG['mail_header_delimiter'];
+  else if (strtolower(substr(PHP_OS, 0, 3)=='win')) 
+    return "\r\n";
+  else if (strtolower(substr(PHP_OS, 0, 3)=='mac'))
+    return "\r\n";
+  else    
+    return "\n";
+}
+
 
 /**
  * Compose a valid attribute string for HTML tags
@@ -1758,10 +1687,6 @@ function rcmail_mailbox_list($attrib)
   // get mailbox list
   $mbox_name = $IMAP->get_mailbox_name();
   
-  // for these mailboxes we have localized labels
-  $special_mailboxes = array('inbox', 'sent', 'drafts', 'trash', 'junk');
-
-
   // build the folders tree
   if (empty($a_mailboxes))
     {
@@ -1779,9 +1704,9 @@ function rcmail_mailbox_list($attrib)
 // var_dump($a_mailboxes);
 
   if ($type=='select')
-    $out .= rcmail_render_folder_tree_select($a_mailboxes, $special_mailboxes, $mbox_name, $attrib['maxlength']);
+    $out .= rcmail_render_folder_tree_select($a_mailboxes, $mbox_name, $attrib['maxlength']);
    else
-    $out .= rcmail_render_folder_tree_html($a_mailboxes, $special_mailboxes, $mbox_name, $attrib['maxlength']);
+    $out .= rcmail_render_folder_tree_html($a_mailboxes, $mbox_name, $attrib['maxlength']);
 
 // rcube_print_time($mboxlist_start, 'render_folder_tree()');
 
@@ -1831,7 +1756,7 @@ function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='')
  * Return html for a structured list &lt;ul&gt; for the mailbox tree
  * @access private
  */
-function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $maxlength, $nestLevel=0)
+function rcmail_render_folder_tree_html(&$arrFolders, &$mbox_name, $maxlength, $nestLevel=0)
   {
   global $COMM_PATH, $IMAP, $CONFIG, $OUTPUT;
 
@@ -1842,9 +1767,8 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $m
     $zebra_class = ($nestLevel*$idx)%2 ? 'even' : 'odd';
     $title = '';
 
-    $folder_lc = strtolower($folder['id']);
-    if (in_array($folder_lc, $special))
-      $foldername = rcube_label($folder_lc);
+    if ($folder_class = rcmail_folder_classname($folder['id']))
+      $foldername = rcube_label($folder_class);
     else
       {
       $foldername = $folder['name'];
@@ -1852,7 +1776,7 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $m
       // shorten the folder name to a given length
       if ($maxlength && $maxlength>1)
         {
-        $fname = abbrevate_string($foldername, $maxlength);
+        $fname = abbreviate_string($foldername, $maxlength);
         if ($fname != $foldername)
           $title = ' title="'.Q($foldername).'"';
         $foldername = $fname;
@@ -1865,7 +1789,7 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $m
 
     // make folder name safe for ids and class names
     $folder_id = preg_replace('/[^A-Za-z0-9\-_]/', '', $folder['id']);
-    $class_name = preg_replace('/[^a-z0-9\-_]/', '', $folder_lc);
+    $class_name = preg_replace('/[^a-z0-9\-_]/', '', $folder_class ? $folder_class : strtolower($folder['id']));
 
     // set special class for Sent, Drafts, Trash and Junk
     if ($folder['id']==$CONFIG['sent_mbox'])
@@ -1901,7 +1825,7 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $m
                     Q($foldername));
 
     if (!empty($folder['folders']))
-      $out .= "\n<ul>\n" . rcmail_render_folder_tree_html($folder['folders'], $special, $mbox_name, $maxlength, $nestLevel+1) . "</ul>\n";
+      $out .= "\n<ul>\n" . rcmail_render_folder_tree_html($folder['folders'], $mbox_name, $maxlength, $nestLevel+1) . "</ul>\n";
 
     $out .= "</li>\n";
     $idx++;
@@ -1915,7 +1839,7 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $m
  * Return html for a flat list <select> for the mailbox tree
  * @access private
  */
-function rcmail_render_folder_tree_select(&$arrFolders, &$special, &$mbox_name, $maxlength, $nestLevel=0)
+function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength, $nestLevel=0)
   {
   global $IMAP, $OUTPUT;
 
@@ -1923,16 +1847,15 @@ function rcmail_render_folder_tree_select(&$arrFolders, &$special, &$mbox_name,
   $out = '';
   foreach ($arrFolders as $key=>$folder)
     {
-    $folder_lc = strtolower($folder['id']);
-    if (in_array($folder_lc, $special))
-      $foldername = rcube_label($folder_lc);
+    if ($folder_class = rcmail_folder_classname($folder['id']))
+      $foldername = rcube_label($folder_class);
     else
       {
       $foldername = $folder['name'];
       
       // shorten the folder name to a given length
       if ($maxlength && $maxlength>1)
-        $foldername = abbrevate_string($foldername, $maxlength);
+        $foldername = abbreviate_string($foldername, $maxlength);
       }
 
     $out .= sprintf('<option value="%s">%s%s</option>'."\n",
@@ -1941,7 +1864,7 @@ function rcmail_render_folder_tree_select(&$arrFolders, &$special, &$mbox_name,
                     Q($foldername));
 
     if (!empty($folder['folders']))
-      $out .= rcmail_render_folder_tree_select($folder['folders'], $special, $mbox_name, $maxlength, $nestLevel+1);
+      $out .= rcmail_render_folder_tree_select($folder['folders'], $mbox_name, $maxlength, $nestLevel+1);
 
     $idx++;
     }
@@ -1949,4 +1872,43 @@ function rcmail_render_folder_tree_select(&$arrFolders, &$special, &$mbox_name,
   return $out;
   }
 
+
+/**
+ * Return internal name for the given folder if it matches the configured special folders
+ * @access private
+ */
+function rcmail_folder_classname($folder_id)
+{
+  global $CONFIG;
+
+  $cname = null;
+  $folder_lc = strtolower($folder_id);
+  
+  // for these mailboxes we have localized labels and css classes
+  foreach (array('inbox', 'sent', 'drafts', 'trash', 'junk') as $smbx)
+  {
+    if ($folder_lc == $smbx || $folder_id == $CONFIG[$smbx.'_mbox'])
+      $cname = $smbx;
+  }
+  
+  return $cname;
+}
+
+
+/**
+ * Try to localize the given IMAP folder name.
+ * UTF-7 decode it in case no localized text was found
+ *
+ * @param string Folder name
+ * @return string Localized folder name in UTF-8 encoding
+ */
+function rcmail_localize_foldername($name)
+{
+  if ($folder_class = rcmail_folder_classname($name))
+    return rcube_label($folder_class);
+  else
+    return rcube_charset_convert($name, 'UTF-7');
+}
+
+
 ?>
index 15752f8bc4ea04b8d64e671de57af686491c8e42..301b3f20d80e4e3ddc75f7378089ac5aca5b7f7c 100644 (file)
@@ -312,6 +312,13 @@ class rcmail_template extends rcube_html_page
     if (!$this->framed && !empty($this->js_env))
       $out .= ($this->ajax_call ? 'this' : JS_OBJECT_NAME) . '.set_env('.json_serialize($this->js_env).");\n";
     
+    // add command to set page title
+    if ($this->ajax_call && !empty($this->pagetitle))
+      $out .= sprintf(
+        "this.set_pagetitle('%s');\n",
+        JQ((!empty($this->config['product_name']) ? $this->config['product_name'].' :: ' : '') . $this->pagetitle)
+      );
+
     foreach ($this->js_commands as $i => $args)
     {
       $method = array_shift($args);
@@ -326,12 +333,7 @@ class rcmail_template extends rcube_html_page
         join(',', $args));
     }
     
-    // add command to set page title
-    if ($this->ajax_call && !empty($this->pagetitle))
-      $out .= sprintf(
-        "this.set_pagetitle('%s');\n",
-        JQ((!empty($this->config['product_name']) ? $this->config['product_name'].' :: ' : '') . $this->pagetitle)
-      );
+
     
     return $out;
   }
@@ -356,7 +358,7 @@ class rcmail_template extends rcube_html_page
    */
   function parse_with_globals($input)
   {
-    $GLOBALS['__comm_path'] = urlencode($GLOBALS['COMM_PATH']);
+    $GLOBALS['__comm_path'] = Q($GLOBALS['COMM_PATH']);
     return preg_replace('/\$(__[a-z0-9_\-]+)/e', '$GLOBALS["\\1"]', $input);
   }
   
@@ -451,8 +453,7 @@ class rcmail_template extends rcube_html_page
     {
       // return a button
       case 'button':
-        if ($attrib['command'])
-          return $this->button($attrib);
+        return $this->button($attrib);
         break;
 
       // show a label
@@ -580,7 +581,7 @@ class rcmail_template extends rcube_html_page
 
     $skin_path = $this->config['skin_path'];
 
-    if (!($attrib['command'] || $attrib['name']))
+    if (!($attrib['command'] || $attrib['name'] || $attrib['onclick']))
       return '';
 
     // try to find out the button type
@@ -761,27 +762,15 @@ function rcmail_message_container($attrib)
  */
 function rcmail_current_username($attrib)
   {
-  global $DB;
+  global $USER;
   static $s_username;
 
   // alread fetched  
   if (!empty($s_username))
     return $s_username;
 
-  // get e-mail address form default identity
-  $sql_result = $DB->query(
-    "SELECT email AS mailto
-     FROM ".get_table_name('identities')."
-     WHERE  user_id=?
-     AND    standard=1
-     AND    del<>1",
-    $_SESSION['user_id']);
-                                   
-  if ($DB->num_rows($sql_result))
-    {
-    $sql_arr = $DB->fetch_assoc($sql_result);
-    $s_username = $sql_arr['mailto'];
-    }
+  if ($sql_arr = $USER->get_identity())
+    $s_username = $sql_arr['email'];
   else if (strstr($_SESSION['username'], '@'))
     $s_username = $_SESSION['username'];
   else
@@ -831,12 +820,12 @@ function rcmail_login_form($attrib)
         }
     }
       
-    $fields['host'] = isset($select_host) ? $select_host->show($_POST['_host']) : null;
+    $fields['host'] = isset($select_host) ? $select_host->show(get_input_value('_host', RCUBE_INPUT_POST)) : null;
     }
   else if (!strlen($CONFIG['default_host']))
     {
     $input_host = new textfield(array('name' => '_host', 'id' => 'rcmloginhost', 'size' => 30));
-    $fields['host'] = $input_host->show($_POST['_host']);
+    $fields['host'] = $input_host->show(get_input_value('_host', RCUBE_INPUT_POST));
     }
 
   $form_name = strlen($attrib['form']) ? $attrib['form'] : 'form';
index f01d2227960a5c7cfcc76b50ce843371c8919b79..6a4865662f2ee846987870090ec1a41ca02348b9 100644 (file)
@@ -386,6 +386,19 @@ class rcube_contacts
 
     return $this->db->affected_rows();
   }
+  
+  
+  /**
+   * Remove all records from the database
+   */
+  function delete_all()
+  {
+    if (is_array($ids))
+      $ids = join(',', $ids);
+
+    $this->db->query("DELETE FROM {$this->db_name} WHERE  user_id=?", $this->user_id);
+    return $this->db->affected_rows();
+  }
 
 }
 
index 9c3eaa88fd1d9037df93c6440c60868dcdee81bf..38788161d49f03c77ee607cac86abd4209bc671f 100644 (file)
@@ -17,7 +17,7 @@
  |         Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_db.inc 666 2007-08-07 21:02:12Z thomasb $
+ $Id: rcube_db.inc 1089 2008-02-15 13:20:07Z till $
 
 */
 
@@ -25,8 +25,7 @@
 /**
  * Obtain the PEAR::DB class that is used for abstraction
  */
-require_once('DB.php');
-
+require_once 'DB.php';
 
 /**
  * Database independent query interface
@@ -426,6 +425,22 @@ class rcube_db
     }
 
 
+  /**
+   * Escapes a string
+   *
+   * @param  string  The string to be escaped
+   * @return string  The escaped string
+   * @access public
+   */
+  function escapeSimple($str)
+    {
+    if (!$this->db_handle)
+      $this->db_connect('r');
+
+    return $this->db_handle->escapeSimple($str);
+    }
+
+
   /*
    * Return SQL function for current time and date
    *
@@ -580,4 +595,4 @@ class rcube_db
 
   }  // end class rcube_db
 
-?>
\ No newline at end of file
+?>
index a31594a56654d826e6b7cde054f4b9bbf080d6c6..d23760ade9d40ba6de410f5767cc72de846be1cb 100644 (file)
@@ -292,10 +292,6 @@ class rcube_form_element
       if ((strpos($key,'on')===0 && $value==''))
         continue;
 
-      // encode textarea content
-      if ($key=='value')
-        $value = Q($value, 'strict', FALSE);
-
       // attributes with no value
       if (in_array($key, array('checked', 'multiple', 'disabled', 'selected', 'nowrap')))
       {
@@ -304,11 +300,11 @@ class rcube_form_element
       }
       // don't convert size of value attribute
       else if ($key=='value')
-        $attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $value);
+        $attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), Q($value, 'strict', false));
         
       // regular tag attributes
       else
-        $attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $this->_conv_case($value, 'value'));
+        $attrib_arr[] = sprintf('%s="%s"', $this->_conv_case($key, 'attrib'), $this->_conv_case(Q($value), 'value'));
     }
 
     return sizeof($attrib_arr) ? ' '.implode(' ', $attrib_arr) : '';
@@ -620,10 +616,10 @@ class select extends rcube_form_element
     if (is_array($names))
     {
       foreach ($names as $i => $text)
-        $this->options[] = array('text' => $text, 'value' => (string)$values[$i]);
+        $this->options[] = array('text' => $text, 'value' => $values[$i]);
     }
     else
-      $this->options[] = array('text' => $names, 'value' => (string)$values);
+      $this->options[] = array('text' => $names, 'value' => $values);
   }
 
 
@@ -640,7 +636,7 @@ class select extends rcube_form_element
     $value_str = $this->_conv_case(' value="%s"', 'attrib');
     
     if (!is_array($select))
-      $select = array((string)$select);
+      $select = array($select);
 
     foreach ($this->options as $option)
     {
@@ -651,7 +647,7 @@ class select extends rcube_form_element
                    
       $options_str .= sprintf("<%s%s%s>%s</%s>\n",
                              $this->_conv_case('option', 'tag'),
-                             !empty($option['value']) ? sprintf($value_str, Q($option['value'])) : '',
+                             isset($option['value']) ? sprintf($value_str, Q($option['value'])) : '',
                              $selected, 
                              Q($option['text'], 'strict', FALSE),
                              $this->_conv_case('option', 'tag'));
index 7c6caf3773e79485ab069b765d97aa7b3995d7cd..a41f231f1e1045eb49d477e024dece8a4f23812a 100644 (file)
@@ -5,7 +5,7 @@
  | program/include/rcube_imap.inc                                        |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2006, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -16,7 +16,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_imap.inc 883 2007-10-17 21:27:20Z thomasb $
+ $Id: rcube_imap.inc 1050 2008-02-12 14:06:26Z thomasb $
 
 */
 
@@ -35,7 +35,7 @@ require_once('lib/mime.inc');
  *
  * @package    Mail
  * @author     Thomas Bruederli <roundcube@gmail.com>
- * @version    1.39
+ * @version    1.40
  * @link       http://ilohamail.org
  */
 class rcube_imap
@@ -97,17 +97,17 @@ class rcube_imap
    * @param  string   Username for IMAP account
    * @param  string   Password for IMAP account
    * @param  number   Port to connect to
-   * @param  boolean  Use SSL connection
+   * @param  string   SSL schema (either ssl or tls) or null if plain connection
    * @return boolean  TRUE on success, FALSE on failure
    * @access public
    */
-  function connect($host, $user, $pass, $port=143, $use_ssl=FALSE)
+  function connect($host, $user, $pass, $port=143, $use_ssl=null)
     {
     global $ICL_SSL, $ICL_PORT, $IMAP_USE_INTERNAL_DATE;
     
     // check for Open-SSL support in PHP build
     if ($use_ssl && in_array('openssl', get_loaded_extensions()))
-      $ICL_SSL = TRUE;
+      $ICL_SSL = $use_ssl == 'imaps' ? 'ssl' : $use_ssl;
     else if ($use_ssl)
       {
       raise_error(array('code' => 403, 'type' => 'imap', 'file' => __FILE__,
@@ -441,7 +441,7 @@ class rcube_imap
       $mailbox = $this->mailbox;
       
     // count search set
-    if ($this->search_string && $mailbox == $this->mailbox && $mode == 'ALL')
+    if ($this->search_string && $mailbox == $this->mailbox && $mode == 'ALL' && !$force)
       return count((array)$this->search_set);
 
     $a_mailbox_cache = $this->get_cache('messagecount');
@@ -527,10 +527,7 @@ class rcube_imap
     if ($this->search_string && $mailbox == $this->mailbox)
       return $this->_list_header_set($mailbox, $this->search_set, $page, $sort_field, $sort_order);
 
-    if ($sort_field!=NULL)
-      $this->sort_field = $sort_field;
-    if ($sort_order!=NULL)
-      $this->sort_order = strtoupper($sort_order);
+    $this->_set_sort_order($sort_field, $sort_order);
 
     $max = $this->_messagecount($mailbox);
     $start_msg = ($this->list_page-1) * $this->page_size;
@@ -647,10 +644,7 @@ class rcube_imap
     if (!strlen($mailbox) || empty($msgs))
       return array();
 
-    if ($sort_field!=NULL)
-      $this->sort_field = $sort_field;
-    if ($sort_order!=NULL)
-      $this->sort_order = strtoupper($sort_order);
+    $this->_set_sort_order($sort_field, $sort_order);
 
     $max = count($msgs);
     $start_msg = ($this->list_page-1) * $this->page_size;
@@ -764,13 +758,20 @@ class rcube_imap
    */
   function message_index($mbox_name='', $sort_field=NULL, $sort_order=NULL)
     {
-    if ($sort_field!=NULL)
-      $this->sort_field = $sort_field;
-    if ($sort_order!=NULL)
-      $this->sort_order = strtoupper($sort_order);
+    $this->_set_sort_order($sort_field, $sort_order);
 
     $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox;
-    $key = "$mbox:".$this->sort_field.":".$this->sort_order.".msgi";
+    $key = "{$mailbox}:{$this->sort_field}:{$this->sort_order}:{$this->search_string}.msgi";
+
+    // we have a saved search result. get index from there
+    if (!isset($this->cache[$key]) && $this->search_string && $mailbox == $this->mailbox)
+    {
+      $this->cache[$key] = $a_msg_headers = array();
+      $this->_fetch_headers($mailbox, join(',', $this->search_set), $a_msg_headers, NULL);
+
+      foreach (iil_SortHeaders($a_msg_headers, $this->sort_field, $this->sort_order) as $i => $msg)
+        $this->cache[$key][] = $msg->uid;
+    }
 
     // have stored it in RAM
     if (isset($this->cache[$key]))
@@ -943,6 +944,20 @@ class rcube_imap
       
     return $this->get_search_set();
     }
+  
+  
+  /**
+   * Check if the given message ID is part of the current search set
+   *
+   * @return boolean True on match or if no search request is stored
+   */
+  function in_searchset($msgid)
+  {
+    if (!empty($this->search_string))
+      return in_array("$msgid", (array)$this->search_set, true);
+    else
+      return true;
+  }
 
 
   /**
@@ -967,8 +982,8 @@ class rcube_imap
     // write headers cache
     if ($headers)
       {
-      if ($is_uid)
-        $this->uid_id_map[$mbox_name][$uid] = $headers->id;
+      if ($headers->uid && $headers->id)
+        $this->uid_id_map[$mailbox][$headers->uid] = $headers->id;
 
       $this->add_message_cache($mailbox.'.msg', $headers->id, $headers);
       }
@@ -1005,7 +1020,7 @@ class rcube_imap
     if (!empty($structure))
       {
       $this->_msg_id = $msg_id;
-      $headers = $this->get_headers($msg_id, NULL, FALSE);
+      $headers = $this->get_headers($uid);
       
       $struct = &$this->_structure_part($structure);
       $struct->headers = get_object_vars($headers);
@@ -1130,10 +1145,14 @@ class rcube_imap
       }
       
     // normalize filename property
-    if (!empty($struct->d_parameters['filename']))
-      $struct->filename = $this->decode_mime_string($struct->d_parameters['filename']);
-    else if (!empty($struct->ctype_parameters['name']))
-      $struct->filename = $this->decode_mime_string($struct->ctype_parameters['name']);
+    if ($filename_mime = $struct->d_parameters['filename'] ? $struct->d_parameters['filename'] : $struct->ctype_parameters['name'])
+      $struct->filename = $this->decode_mime_string($filename_mime);
+    else if ($filename_encoded = $struct->d_parameters['filename*'] ? $struct->d_parameters['filename*'] : $struct->ctype_parameters['name*'])
+    {
+      // decode filename according to RFC 2231, Section 4
+      list($filename_charset,, $filename_urlencoded) = split('\'', $filename_encoded);
+      $struct->filename = rcube_charset_convert(urldecode($filename_urlencoded), $filename_charset);
+    }
     else if (!empty($struct->headers['content-description']))
       $struct->filename = $this->decode_mime_string($struct->headers['content-description']);
       
@@ -1201,15 +1220,22 @@ class rcube_imap
 
     if ($print)
       {
-      iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, ($o_part->encoding=='base64'?3:2));
-      $body = TRUE;
+      $mode = $o_part->encoding == 'base64' ? 3 : ($o_part->encoding == 'quoted-printable' ? 1 : 2);
+      $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, $mode);
+      
+      // we have to decode the part manually before printing
+      if ($mode == 1)
+        {
+        echo $this->mime_decode($body, $o_part->encoding);
+        $body = true;
+        }
       }
     else
       {
       $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, 1);
 
       // decode part body
-      if ($o_part->encoding=='base64' || $o_part->encoding=='quoted-printable')
+      if ($o_part->encoding)
         $body = $this->mime_decode($body, $o_part->encoding);
 
       // convert charset (if text or message part)
@@ -1278,7 +1304,7 @@ class rcube_imap
    * Set message flag to one or several messages
    *
    * @param mixed  Message UIDs as array or as comma-separated string
-   * @param string Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT
+   * @param string Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT, MDNSENT
    * @return boolean True on success, False on failure
    */
   function set_flag($uids, $flag)
@@ -1759,13 +1785,17 @@ class rcube_imap
           $deleted = TRUE;
 
         foreach ($all_mboxes as $c_mbox)
-          if (preg_match('/^'.preg_quote($mailbox.$this->delimiter).'/', $c_mbox))
+          {
+          $regex = preg_quote($mailbox . $this->delimiter, '/');
+          $regex = '/^' . $regex . '/';
+          if (preg_match($regex, $c_mbox))
             {
             iil_C_UnSubscribe($this->conn, $c_mbox);
             $result = iil_C_DeleteFolder($this->conn, $c_mbox);
             if ($result>=0)
               $deleted = TRUE;
             }
+          }
         }
 
     // clear mailboxlist cache
@@ -2059,10 +2089,8 @@ class rcube_imap
    */
   function &get_cached_message($key, $uid, $struct=false)
     {
-    if (!$this->caching_enabled)
-      return FALSE;
-
     $internal_key = '__single_msg';
+    
     if ($this->caching_enabled && (!isset($this->cache[$internal_key][$uid]) ||
         ($struct && empty($this->cache[$internal_key][$uid]->structure))))
       {
@@ -2123,9 +2151,17 @@ class rcube_imap
    */
   function add_message_cache($key, $index, $headers, $struct=null)
     {
-    if (!$this->caching_enabled || empty($key) || !is_object($headers) || empty($headers->uid))
+    if (empty($key) || !is_object($headers) || empty($headers->uid))
+        return;
+    
+    // add to internal (fast) cache
+    $this->cache['__single_msg'][$headers->uid] = $headers;
+    $this->cache['__single_msg'][$headers->uid]->structure = $struct;
+    
+    // no further caching
+    if (!$this->caching_enabled)
       return;
-      
+    
     // check for an existing record (probly headers are cached but structure not)
     $sql_result = $this->db->query(
         "SELECT message_id
@@ -2432,6 +2468,17 @@ class rcube_imap
     return $mbox_name;
     }
 
+  /**
+   * Validate the given input and save to local properties
+   * @access private
+   */
+  function _set_sort_order($sort_field, $sort_order)
+  {
+    if ($sort_field != null)
+      $this->sort_field = asciiwords($sort_field);
+    if ($sort_order != null)
+      $this->sort_order = strtoupper($sort_order) == 'DESC' ? 'DESC' : 'ASC';
+  }
 
   /**
    * Sort mailboxes first by default folders and then in alphabethical order
@@ -2447,7 +2494,7 @@ class rcube_imap
       if ($folder{0}=='.')
         continue;
 
-      if (($p = array_search(strtolower($folder), $this->default_folders_lc))!==FALSE)
+      if (($p = array_search(strtolower($folder), $this->default_folders_lc)) !== false && !$a_defaults[$p])
         $a_defaults[$p] = $folder;
       else
         $a_out[] = $folder;
@@ -2481,7 +2528,16 @@ class rcube_imap
     if (!$mbox_name)
       $mbox_name = $this->mailbox;
       
-    return iil_C_ID2UID($this->conn, $mbox_name, $id);
+    $index = array_flip((array)$this->uid_id_map[$mbox_name]);
+    if (isset($index[$id]))
+      $uid = $index[$id];
+    else
+      {
+      $uid = iil_C_ID2UID($this->conn, $mbox_name, $id);
+      $this->uid_id_map[$mbox_name][$uid] = $id;
+      }
+    
+    return $uid;
     }
 
 
index f3828eb65c45e7c02dbc24907d2352ea3dce20ac..f1b21085cc88b74517991d02f51bcc9f1a8819a4 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /*
  +-----------------------------------------------------------------------+
  | program/include/rcube_ldap.inc                                        |
@@ -15,7 +14,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_ldap.inc 787 2007-09-09 17:58:13Z thomasb $
+ $Id: rcube_ldap.inc 1152 2008-02-28 20:01:57Z thomasb $
 
 */
 
@@ -286,9 +285,12 @@ class rcube_ldap
     }
     $filter .= ')';
     
+    // avoid double-wildcard if $value is empty
+    $filter = preg_replace('/\*+/', '*', $filter);
+    
     // add general filter to query
     if (!empty($this->prop['filter']))
-      $filter = '(&'.$this->prop['filter'] . $filter . ')';
+      $filter = '(&(' . preg_replace('/^\(|\)$/', '', $this->prop['filter']) . ')' . $filter . ')';
 
     // set filter string and execute search
     $this->set_search_set($filter);
index 02206c62b8a91df50aef17ff9df19a13f15aef45..0b2feffbe1839f1f2fc9824210d55e3eaa750f5b 100644 (file)
@@ -16,7 +16,7 @@
  | Author: Lukas Kahwe Smith <smith@pooteeweet.org>                      |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_mdb2.inc 850 2007-10-03 00:13:32Z ihug $
+ $Id: rcube_mdb2.inc 1084 2008-02-14 23:12:23Z till $
 
 */
 
@@ -94,15 +94,17 @@ class rcube_mdb2
   function dsn_connect($dsn)
     {
     // Use persistent connections if available
-    $dbh = MDB2::connect($dsn, array('persistent' => $this->db_pconn, 'portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL));
+    $dbh = MDB2::connect($dsn,
+      array('persistent' => $this->db_pconn,
+        'portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL));
 
-    if (PEAR::isError($dbh))
+    if (MDB2::isError($dbh))
       {
       $this->db_error = TRUE;
       $this->db_error_msg = $dbh->getMessage();
       
-      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__,
-                        'message' => $dbh->getMessage()), TRUE, FALSE);
+      raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__,
+        'file' => __FILE__, 'message' => $dbh->getUserInfo()), TRUE, FALSE);
       }
     else if ($this->db_provider=='sqlite')
       {
index fa871765d6ba1e58fdbaa8da894ca39210ef2943..adef24ca1238db778304b57ce0505a8eb6796381 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_shared.inc 839 2007-09-29 18:15:05Z thomasb $
+ $Id: rcube_shared.inc 1078 2008-02-14 01:33:02Z till $
 
 */
 
@@ -246,8 +246,8 @@ function send_modified_header($mdate, $etag=null)
     $iscached = true;
   
   $etag = $etag ? "\"$etag\"" : null;
-  if ($etag && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
-    $iscached = true;
+  if ($etag)
+    $iscached = ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag);
   
   if ($iscached)
     header("HTTP/1.x 304 Not Modified");
@@ -557,9 +557,9 @@ function rc_request_header($name)
  * @param string Input string
  * @param int    Max. length
  * @param string Replace removed chars with this
- * @return string Abbrevated string
+ * @return string Abbreviated string
  */
-function abbrevate_string($str, $maxlength, $place_holder='...')
+function abbreviate_string($str, $maxlength, $place_holder='...')
 {
   $length = rc_strlen($str);
   $first_part_length = floor($maxlength/2) - rc_strlen($place_holder);
@@ -674,5 +674,42 @@ function strrstr($haystack, $needle)
   }
 }
 
+/**
+ * A method to guess the mime_type of an attachment.
+ *
+ * @param string $path     Path to the file.
+ * @param string $failover Mime type supplied for failover.
+ *
+ * @return string
+ * @author Till Klampaeckel <till@php.net>
+ * @see    http://de2.php.net/manual/en/ref.fileinfo.php
+ * @see    http://de2.php.net/mime_content_type
+ */
+function rc_mime_content_type($path, $failover = 'unknown/unknown')
+{
+    global $CONFIG;
+
+    $mime_magic = $CONFIG['mime_magic'];
+
+    if (function_exists('mime_content_type')) {
+        return mime_content_type($path);
+    }
+    if (!extension_loaded('fileinfo')) { 
+        if (!dl('fileinfo.' . PHP_SHLIB_SUFFIX)) {
+            return $failover;
+        }
+    }
+    $finfo = finfo_open(FILEINFO_MIME, $mime_magic);
+    if (!$finfo) {
+        return $failover;
+    }
+    $mime_type = finfo_file($finfo,$path);
+    if (!$mime_type) {
+        return $failover;
+    }
+    finfo_close($finfo);
+
+    return $mime_type;
+}
 
-?>
+?>
\ No newline at end of file
index 55ac8f5a370350780152135e25f474e86436ea5b..bbc886923e54c6a7edab4505b7ca8872def2318e 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: rcube_smtp.inc 805 2007-09-20 13:36:57Z robin $
+ $Id: rcube_smtp.inc 1136 2008-02-25 10:17:35Z till $
 
 */
 
@@ -62,19 +62,19 @@ function smtp_mail($from, $recipients, &$headers, &$body, &$response)
   $smtp_host_url = parse_url($CONFIG['smtp_server']);
   
   // overwrite port
-  if ($smtp_host_url['host'] && $smtp_host_url['port'])
+  if (isset($smtp_host_url['host']) && isset($smtp_host_url['port']))
     {
     $smtp_host = $smtp_host_url['host'];
     $smtp_port = $smtp_host_url['port'];
     }
 
   // re-write smtp host
-  if ($smtp_host_url['host'] && $smtp_host_url['scheme'])
+  if (isset($smtp_host_url['host']) && isset($smtp_host_url['scheme']))
     $smtp_host = sprintf('%s://%s', $smtp_host_url['scheme'], $smtp_host_url['host']);
 
 
   // create Net_SMTP object and connect to server
-  if (!is_object($smtp_conn))
+  if (!is_object($SMTP_CONN))
     {
     $helo_host = empty($CONFIG['smtp_helo_host']) ? (empty($_SERVER['SERVER_NAME']) ? 'localhost' : $_SERVER['SERVER_NAME']) : $CONFIG['smtp_helo_host'];
     $SMTP_CONN = new Net_SMTP($smtp_host, $smtp_port, $helo_host);
@@ -112,7 +112,7 @@ function smtp_mail($from, $recipients, &$headers, &$body, &$response)
       if (PEAR::isError($result))
         {
         smtp_reset();
-        $response[] .= "Authentication failure: ".$result->getMessage();
+        $response[] .= 'Authentication failure: ' . $result->getMessage() . ' (Code: ' . $result->getCode() . ')';
         return FALSE;
         }
       }
diff --git a/program/include/rcube_user.inc b/program/include/rcube_user.inc
new file mode 100644 (file)
index 0000000..41b424f
--- /dev/null
@@ -0,0 +1,482 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_user.inc                                        |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   This class represents a system user linked and provides access      |
+ |   to the related database records.                                    |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: rcube_user.inc 933 2007-11-29 14:17:32Z thomasb $
+
+*/
+
+
+/**
+ * Class representing a system user
+ *
+ * @package    core
+ * @author     Thomas Bruederli <roundcube@gmail.com>
+ */
+class rcube_user
+{
+  var $ID = null;
+  var $data = null;
+  
+  
+  /**
+   * Object constructor
+   *
+   * @param object DB Database connection
+   */
+  function __construct($id = null, $sql_arr = null)
+  {
+    global $DB;
+    
+    if ($id && !$sql_arr)
+    {
+      $sql_result = $DB->query("SELECT * FROM ".get_table_name('users')." WHERE  user_id=?", $id);
+      $sql_arr = $DB->fetch_assoc($sql_result);
+    }
+    
+    if (!empty($sql_arr))
+    {
+      $this->ID = $sql_arr['user_id'];
+      $this->data = $sql_arr;
+    }
+  }
+
+  /**
+   * PHP 4 object constructor
+   *
+   * @see  rcube_user::__construct
+   */
+  function rcube_user($id = null, $sql_arr = null)
+  {
+    $this->__construct($id, $sql_arr);
+  }
+  
+  
+  /**
+   * Build a user name string (as e-mail address)
+   *
+   * @return string Full user name
+   */
+  function get_username()
+  {
+    return $this->data['username'] ? $this->data['username'] . (!strpos($this->data['username'], '@') ? '@'.$this->data['mail_host'] : '') : false;
+  }
+  
+  
+  /**
+   * Get the preferences saved for this user
+   *
+   * @return array Hash array with prefs
+   */
+  function get_prefs()
+  {
+    if ($this->ID && $this->data['preferences'])
+      return unserialize($this->data['preferences']);
+    else
+      return array();
+  }
+  
+  
+  /**
+   * Write the given user prefs to the user's record
+   *
+   * @param mixed User prefs to save
+   * @return boolean True on success, False on failure
+   */
+  function save_prefs($a_user_prefs)
+  {
+    global $DB, $CONFIG, $sess_user_lang;
+    
+    if (!$this->ID)
+      return false;
+
+    // merge (partial) prefs array with existing settings
+    $a_user_prefs += (array)$this->get_prefs();
+
+    $DB->query(
+      "UPDATE ".get_table_name('users')."
+       SET    preferences=?,
+              language=?
+       WHERE  user_id=?",
+      serialize($a_user_prefs),
+      $sess_user_lang,
+      $this->ID);
+
+    if ($DB->affected_rows())
+    {
+      $CONFIG = array_merge($CONFIG, $a_user_prefs);
+      return true;
+    }
+
+    return false;
+  }
+  
+  
+  /**
+   * Get default identity of this user
+   *
+   * @param int  Identity ID. If empty, the default identity is returned
+   * @return array Hash array with all cols of the 
+   */
+  function get_identity($id = null)
+  {
+    global $DB;
+    
+    $sql_result = $this->list_identities($id ? sprintf('AND identity_id=%d', $id) : '');
+    return $DB->fetch_assoc($sql_result);
+  }
+  
+  
+  /**
+   * Return a list of all identities linked with this user
+   *
+   * @return array List of identities
+   */
+  function list_identities($sql_add = '')
+  {
+    global $DB;
+    
+    // get contacts from DB
+    $sql_result = $DB->query(
+      "SELECT * FROM ".get_table_name('identities')."
+       WHERE  del<>1
+       AND    user_id=?
+       $sql_add
+       ORDER BY ".$DB->quoteIdentifier('standard')." DESC, name ASC",
+      $this->ID);
+    
+    return $sql_result;
+  }
+  
+  
+  /**
+   * Update a specific identity record
+   *
+   * @param int    Identity ID
+   * @param array  Hash array with col->value pairs to save
+   * @return boolean True if saved successfully, false if nothing changed
+   */
+  function update_identity($iid, $data)
+  {
+    global $DB;
+    
+    if (!$this->ID)
+      return false;
+    
+    $write_sql = array();
+    
+    foreach ((array)$data as $col => $value)
+    {
+      $write_sql[] = sprintf("%s=%s",
+        $DB->quoteIdentifier($col),
+        $DB->quote($value));
+    }
+    
+    $DB->query(
+      "UPDATE ".get_table_name('identities')."
+       SET ".join(', ', $write_sql)."
+       WHERE  identity_id=?
+       AND    user_id=?
+       AND    del<>1",
+      $iid,
+      $this->ID);
+    
+    return $DB->affected_rows();
+  }
+  
+  
+  /**
+   * Create a new identity record linked with this user
+   *
+   * @param array  Hash array with col->value pairs to save
+   * @return int  The inserted identity ID or false on error
+   */
+  function insert_identity($data)
+  {
+    global $DB;
+    
+    if (!$this->ID)
+      return false;
+
+    $insert_cols = $insert_values = array();
+    foreach ((array)$data as $col => $value)
+    {
+      $insert_cols[] = $DB->quoteIdentifier($col);
+      $insert_values[] = $DB->quote($value);
+    }
+
+    $DB->query(
+      "INSERT INTO ".get_table_name('identities')."
+        (user_id, ".join(', ', $insert_cols).")
+       VALUES (?, ".join(', ', $insert_values).")",
+      $this->ID);
+
+    return $DB->insert_id(get_sequence_name('identities'));
+  }
+  
+  
+  /**
+   * Mark the given identity as deleted
+   *
+   * @param int  Identity ID
+   * @return boolean True if deleted successfully, false if nothing changed
+   */
+  function delete_identity($iid)
+  {
+    global $DB;
+    
+    if (!$this->ID)
+      return false;
+
+    if (!$this->ID || $this->ID == '')
+      return false;
+
+    $sql_result = $DB->query("SELECT count(*) AS ident_count FROM " .
+      get_table_name('identities') .
+      " WHERE user_id = ? AND del <> 1",
+      $this->ID);
+
+    $sql_arr = $DB->fetch_assoc($sql_result);
+    if ($sql_arr['ident_count'] <= 1)
+      return false;
+    
+    $DB->query(
+      "UPDATE ".get_table_name('identities')."
+       SET    del=1
+       WHERE  user_id=?
+       AND    identity_id=?",
+      $this->ID,
+      $iid);
+
+    return $DB->affected_rows();
+  }
+  
+  
+  /**
+   * Make this identity the default one for this user
+   *
+   * @param int The identity ID
+   */
+  function set_default($iid)
+  {
+    global $DB;
+    
+    if ($this->ID && $iid)
+    {
+      $DB->query(
+        "UPDATE ".get_table_name('identities')."
+         SET ".$DB->quoteIdentifier('standard')."='0'
+         WHERE  user_id=?
+         AND    identity_id<>?
+         AND    del<>1",
+        $this->ID,
+        $iid);
+    }
+  }
+  
+  
+  /**
+   * Update user's last_login timestamp
+   */
+  function touch()
+  {
+    global $DB;
+    
+    if ($this->ID)
+    {
+      $DB->query(
+        "UPDATE ".get_table_name('users')."
+         SET    last_login=".$DB->now()."
+         WHERE  user_id=?",
+        $this->ID);
+    }
+  }
+  
+  
+  /**
+   * Clear the saved object state
+   */
+  function reset()
+  {
+    $this->ID = null;
+    $this->data = null;
+  }
+  
+  
+  /**
+   * Find a user record matching the given name and host
+   *
+   * @param string IMAP user name
+   * @param string IMAP host name
+   * @return object rcube_user New user instance
+   * @static
+   */
+  function query($user, $host)
+  {
+    global $DB;
+    
+    // query if user already registered
+    $sql_result = $DB->query(
+      "SELECT * FROM ".get_table_name('users')."
+       WHERE  mail_host=? AND (username=? OR alias=?)",
+      $host,
+      $user,
+      $user);
+      
+    // user already registered -> overwrite username
+    if ($sql_arr = $DB->fetch_assoc($sql_result))
+      return new rcube_user($sql_arr['user_id'], $sql_arr);
+    else
+      return false;
+  }
+  
+  
+  /**
+   * Create a new user record and return a rcube_user instance
+   *
+   * @param string IMAP user name
+   * @param string IMAP host
+   * @return object rcube_user New user instance
+   * @static
+   */
+  function create($user, $host)
+  {
+    global $DB, $CONFIG;
+    
+    $user_email = '';
+
+    // try to resolve user in virtusertable
+    if (!empty($CONFIG['virtuser_file']) && !strpos($user, '@'))
+      $user_email = self::user2email($user);
+
+    $DB->query(
+      "INSERT INTO ".get_table_name('users')."
+        (created, last_login, username, mail_host, alias, language)
+       VALUES (".$DB->now().", ".$DB->now().", ?, ?, ?, ?)",
+      strip_newlines($user),
+      strip_newlines($host),
+      strip_newlines($user_email),
+      $_SESSION['user_lang']);
+
+    if ($user_id = $DB->insert_id(get_sequence_name('users')))
+    {
+      $mail_domain = rcmail_mail_domain($host);
+
+      if ($user_email=='')
+        $user_email = strpos($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
+
+      $user_name = $user != $user_email ? $user : '';
+
+      // try to resolve the e-mail address from the virtuser table
+      if (!empty($CONFIG['virtuser_query']) &&
+          ($sql_result = $DB->query(preg_replace('/%u/', $DB->escapeSimple($user), $CONFIG['virtuser_query']))) &&
+          ($DB->num_rows()>0))
+      {
+        while ($sql_arr = $DB->fetch_array($sql_result))
+        {
+          $DB->query(
+            "INSERT INTO ".get_table_name('identities')."
+              (user_id, del, standard, name, email)
+             VALUES (?, 0, 1, ?, ?)",
+            $user_id,
+            strip_newlines($user_name),
+            preg_replace('/^@/', $user . '@', $sql_arr[0]));
+        }
+      }
+      else
+      {
+        // also create new identity records
+        $DB->query(
+          "INSERT INTO ".get_table_name('identities')."
+            (user_id, del, standard, name, email)
+           VALUES (?, 0, 1, ?, ?)",
+          $user_id,
+          strip_newlines($user_name),
+          strip_newlines($user_email));
+      }
+    }
+    else
+    {
+      raise_error(array(
+        'code' => 500,
+        'type' => 'php',
+        'line' => __LINE__,
+        'file' => __FILE__,
+        'message' => "Failed to create new user"), true, false);
+    }
+    
+    return $user_id ? new rcube_user($user_id) : false;
+  }
+  
+  
+  /**
+   * Resolve username using a virtuser table
+   *
+   * @param string E-mail address to resolve
+   * @return string Resolved IMAP username
+   * @static
+   */
+  function email2user($email)
+  {
+    $user = $email;
+    $r = rcmail_findinvirtual("^$email");
+
+    for ($i=0; $i<count($r); $i++)
+    {
+      $data = $r[$i];
+      $arr = preg_split('/\s+/', $data);
+      if (count($arr) > 0)
+      {
+        $user = trim($arr[count($arr)-1]);
+        break;
+      }
+    }
+
+    return $user;
+  }
+
+
+  /**
+   * Resolve e-mail address from virtuser table
+   *
+   * @param string User name
+   * @return string Resolved e-mail address
+   * @static
+   */
+  function user2email($user)
+  {
+    $email = "";
+    $r = rcmail_findinvirtual("$user$");
+
+    for ($i=0; $i<count($r); $i++)
+    {
+      $data = $r[$i];
+      $arr = preg_split('/\s+/', $data);
+      if (count($arr) > 0)
+      {
+        $email = trim($arr[0]);
+        break;
+      }
+    }
+
+    return $email;
+  }
+
+}
+
+
+?>
index e76da0cf09de6161da60ba31132eb1bc3e3a9efd..6b0eeab7e179da7958b1e0a7180f6fe08199961f 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: session.inc 850 2007-10-03 00:13:32Z ihug $
+ $Id: session.inc 1063 2008-02-13 05:26:47Z till $
 
 */
 
@@ -172,8 +172,13 @@ function sess_regenerate_id()
   sess_destroy(session_id());
 
   session_id($random);
-  $cookie = session_get_cookie_params();
-  setcookie(session_name(), $random, $cookie['lifetime'], $cookie['path']);
+
+  $cookie    = session_get_cookie_params();
+  $_lifetime = $cookie['lifetime'] ? time() + $cookie['lifetime'] : 0;
+
+  setcookie(session_name(), '', time() - 3600);
+  setcookie(session_name(), $random, $_lifetime, $cookie['path'],
+    $cookie['domain']);
 
   return true;
   }
index fba54e5acc13e79425bdc728c81950c2a33feb85..19dbc351740735eb2e05f218337f71ecd3d63766 100644 (file)
@@ -3,7 +3,7 @@
  | RoundCube Webmail Client Script                                       |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev, - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -13,7 +13,7 @@
  | Requires: common.js, list.js                                          |
  +-----------------------------------------------------------------------+
 
-  $Id: app.js 888 2007-10-19 14:04:43Z robin $
+  $Id: app.js 1170 2008-03-03 09:06:53Z thomasb $
 */
 
 
@@ -146,13 +146,19 @@ function rcube_webmail()
           else
             this.message_list.focus();
           }
+          
+        if (this.env.coltypes)
+          this.set_message_coltypes(this.env.coltypes);
 
         // enable mail commands
         this.enable_command('list', 'checkmail', 'compose', 'add-contact', 'search', 'reset-search', true);
+
+        if (this.env.search_text != null && document.getElementById('quicksearchbox') != null)
+          document.getElementById('quicksearchbox').value = this.env.search_text;
         
         if (this.env.action=='show' || this.env.action=='preview')
           {
-          this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'viewsource', 'print', 'load-attachment', true);
+          this.enable_command('show', 'reply', 'reply-all', 'forward', 'moveto', 'delete', 'mark', 'viewsource', 'print', 'load-attachment', true);
           if (this.env.next_uid)
             {
             this.enable_command('nextmessage', true);
@@ -223,6 +229,16 @@ function rcube_webmail()
           this.gui_objects.folderlist = this.gui_objects.mailboxlist;
           this.http_request('getunread', '');
         }
+        
+        // ask user to send MDN
+        if (this.env.mdn_request && this.env.uid)
+        {
+          var mdnurl = '_uid='+this.env.uid+'&_mbox='+urlencode(this.env.mailbox);
+          if (confirm(this.get_label('mdnrequest')))
+            this.http_post('sendmdn', mdnurl);
+          else
+            this.http_post('mark', mdnurl+'&_flag=mdnsent');
+        }
 
         break;
 
@@ -295,8 +311,8 @@ function rcube_webmail()
         break;
 
       case 'login':
-        var input_user = rcube_find_object('_user');
-        var input_pass = rcube_find_object('_pass');
+        var input_user = rcube_find_object('rcmloginuser');
+        var input_pass = rcube_find_object('rcmloginpwd');
         if (input_user)
           input_user.onkeypress = function(e){ return rcmail.login_user_keypress(e); };
         if (input_user && input_user.value=='')
@@ -487,7 +503,7 @@ function rcube_webmail()
       case 'list':
         if (this.task=='mail')
           {
-          if (this.env.search_request<0 || (this.env.search_request && props != this.env.mailbox))
+          if (this.env.search_request<0 || (props != '' && (this.env.search_request && props != this.env.mailbox)))
             this.reset_qsearch();
 
           this.list_mailbox(props);
@@ -663,7 +679,12 @@ function rcube_webmail()
         else if (this.task == 'addressbook' && this.drag_active)
           this.copy_contact(null, props);
         break;
-        
+
+      case 'mark':
+        if (props)
+          this.mark_message(props);
+        break;
+      
       case 'toggle_status':
         if (props && !props._row)
           break;
@@ -674,7 +695,7 @@ function rcube_webmail()
         if (props._row.uid)
           {
           uid = props._row.uid;
-          this.message_list.dont_select = true;
+          
           // toggle read/unread
           if (this.message_list.rows[uid].deleted) {
             flag = 'undelete';
@@ -820,7 +841,7 @@ function rcube_webmail()
 
         if (!this.check_compose_input())
           break;
-          
+
         // Reset the auto-save timer
         self.clearTimeout(this.save_timer);
 
@@ -865,11 +886,15 @@ function rcube_webmail()
       case 'print':
         var uid;
         if (uid = this.get_single_uid())
-          {
+        {
           ref.printwin = window.open(this.env.comm_path+'&_action=print&_uid='+uid+'&_mbox='+urlencode(this.env.mailbox)+(this.env.safemode ? '&_safe=1' : ''));
           if (this.printwin)
+          {
             setTimeout(function(){ ref.printwin.focus(); }, 20);
+            if (this.env.action != 'show')
+              this.toggle_read_status('read', [uid]);
           }
+        }
         break;
 
       case 'viewsource':
@@ -1075,10 +1100,6 @@ function rcube_webmail()
       this.unfocus_folder(id);
       this.command('moveto', id);
       }
-
-    // Hide message command buttons until a message is selected 
-    this.enable_command('reply', 'reply-all', 'forward', 'delete', 'print', false); 
-    return false;
     };
 
   this.click_on_list = function(e)
@@ -1108,12 +1129,12 @@ function rcube_webmail()
       {
       this.enable_command('reply', 'reply-all', 'forward', false);
       this.enable_command('show', selected);
-      this.enable_command('delete', 'moveto', (list.selection.length > 0 ? true : false));
+      this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false));
       }
     else
       {
       this.enable_command('show', 'reply', 'reply-all', 'forward', 'print', selected);
-      this.enable_command('delete', 'moveto', (list.selection.length > 0 ? true : false));
+      this.enable_command('delete', 'moveto', 'mark', (list.selection.length > 0 ? true : false));
       }
 
     // start timer for message preview (wait for double click)
@@ -1143,6 +1164,8 @@ function rcube_webmail()
       this.command('show');
     else if (list.key_pressed == list.DELETE_KEY)
       this.command('delete');
+    else
+      list.shiftkey = false;
     };
 
 
@@ -1187,6 +1210,10 @@ function rcube_webmail()
     if (safe)
       add_url = '&_safe=1';
 
+    // also send search request to get the right messages
+    if (this.env.search_request)
+      add_url += '&_search='+this.env.search_request;
+
     if (id)
       {
       var url = '&_action='+action+'&_uid='+id+'&_mbox='+urlencode(this.env.mailbox)+add_url;
@@ -1356,11 +1383,8 @@ function rcube_webmail()
   this.move_messages = function(mbox)
     {
     // exit if current or no mailbox specified or if selection is empty
-    if (!mbox || !this.env.uid || mbox==this.env.mailbox)
-      {
-      if (!this.message_list || !this.message_list.get_selection().length)
-        return;
-      }
+    if (!mbox || mbox == this.env.mailbox || (!this.env.uid && (!this.message_list || !this.message_list.get_selection().length)))
+      return;
 
     var lock = false;
     var add_url = '&_target_mbox='+urlencode(mbox)+'&_from='+(this.env.action ? this.env.action : '');
@@ -1374,6 +1398,9 @@ function rcube_webmail()
     else
       this.show_contentframe(false);
 
+    // Hide message command buttons until a message is selected
+    this.enable_command('reply', 'reply-all', 'forward', 'delete', 'mark', 'print', false);
+
     this._with_selected_messages('moveto', lock, add_url);
     };
 
@@ -1668,11 +1695,14 @@ function rcube_webmail()
     {
     // check input fields
     var input_to = rcube_find_object('_to');
+    var input_cc = rcube_find_object('_cc');
+    var input_bcc = rcube_find_object('_bcc');
     var input_subject = rcube_find_object('_subject');
     var input_message = rcube_find_object('_message');
 
     // check for empty recipient
-    if (input_to && !rcube_check_email(input_to.value, true))
+    var recipients = input_to.value ? input_to.value : (input_cc.value ? input_cc.value : input_bcc.value);
+    if (!rcube_check_email(recipients.replace(/^\s+/, '').replace(/[\s,;]+$/, ''), true))
       {
       alert(this.get_label('norecipientwarning'));
       input_to.focus();
@@ -1805,6 +1835,10 @@ function rcube_webmail()
       var eid = tinyMCE.getEditorId('_message');
       // editor is a TinyMCE_Control object
       var editor = tinyMCE.getInstanceById(eid);
+      // if this is null, we should exit
+      if (editor == null) {
+        return false;
+      }
       var msgDoc = editor.getDoc();
       var msgBody = msgDoc.body;
 
@@ -1872,7 +1906,6 @@ function rcube_webmail()
   // upload attachment file
   this.upload_file = function(form)
     {
-    
     if (!form)
       return false;
       
@@ -2360,6 +2393,7 @@ function rcube_webmail()
       return;
       
     var a_cids = new Array();
+    var qs = '';
 
     if (this.env.cid)
       a_cids[a_cids.length] = this.env.cid;
@@ -2378,8 +2412,12 @@ function rcube_webmail()
         this.show_contentframe(false);
       }
 
+    // also send search request to get the right records from the next page
+    if (this.env.search_request) 
+      qs += '&_search='+this.env.search_request;
+
     // send request to server
-    this.http_post('delete', '_cid='+urlencode(a_cids.join(','))+'&_from='+(this.env.action ? this.env.action : ''));
+    this.http_post('delete', '_cid='+urlencode(a_cids.join(','))+'&_from='+(this.env.action ? this.env.action : '')+qs);
     return true;
     };
 
@@ -2416,9 +2454,9 @@ function rcube_webmail()
       {
       var anchors = row.obj.getElementsByTagName('A');
       if (anchors[0])
-        anchors[0].onclick = function() { p.rename_folder(row.id); };
+        anchors[0].onclick = function() { p.rename_folder(row.id); return false; };
       if (anchors[1])
-        anchors[1].onclick = function() { p.delete_folder(row.id); };
+        anchors[1].onclick = function() { p.delete_folder(row.id); return false; };
       row.obj.onmouseover = function() { p.focus_subscription(row.id); };
       row.obj.onmouseout = function() { p.unfocus_subscription(row.id); };
       }
@@ -2519,6 +2557,9 @@ function rcube_webmail()
       this.set_env('folder', folder);
     else
       this.set_env('folder', null);
+      
+    if (this.gui_objects.createfolderhint)
+      this.gui_objects.createfolderhint.innerHTML = this.env.folder ? this.get_label('addsubfolderhint') : '';
     };
 
 
@@ -2541,13 +2582,13 @@ function rcube_webmail()
   // tell server to create and subscribe a new mailbox
   this.create_folder = function(name)
     {
-  if (this.edit_folder)
-    this.reset_folder_rename();
+    if (this.edit_folder)
+      this.reset_folder_rename();
 
     var form;
     if ((form = this.gui_objects.editform) && form.elements['_folder_name'])
       name = form.elements['_folder_name'].value;
-    if (this.env.folder)
+    if (this.env.folder && name != '')
       name = this.env.folder+this.env.delimiter+name;
 
     if (name)
@@ -2562,7 +2603,6 @@ function rcube_webmail()
   this.rename_folder = function(id)
     {
     var temp, row, form;
-    var folder = this.env.subscriptionrows[id][0];
 
     // reset current renaming
   if (temp = this.edit_folder)
@@ -2572,14 +2612,15 @@ function rcube_webmail()
       return;
     }
 
-    if (id && (row = document.getElementById(id)))
+    if (id && this.env.subscriptionrows[id] && (row = document.getElementById(id)))
       {
       var reg = new RegExp('.*['+RegExp.escape(this.env.delimiter)+']');
       this.name_input = document.createElement('INPUT');
-      this.name_input.value = folder.replace(reg, '');
+      this.name_input.value = this.env.subscriptionrows[id][1].replace(reg, '');
       this.name_input.style.width = '100%';
+      
       reg = new RegExp('['+RegExp.escape(this.env.delimiter)+']?[^'+RegExp.escape(this.env.delimiter)+']+$');
-      this.name_input.setAttribute('parent', folder.replace(reg, ''));
+      this.name_input.__parent = this.env.subscriptionrows[id][0].replace(reg, '');
       this.name_input.onkeypress = function(e){ rcmail.name_input_keypress(e); };
       
       row.cells[0].replaceChild(this.name_input, row.cells[0].firstChild);
@@ -2617,9 +2658,9 @@ function rcube_webmail()
       var newname = this.name_input ? this.name_input.value : null;
       if (this.edit_folder && newname)
         {
-        if (this.name_input.getAttribute('parent') && this.name_input.getAttribute('parent')!='')
-          newname = this.name_input.getAttribute('parent')+this.env.delimiter+newname;
-          this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname));
+        if (this.name_input.__parent)
+          newname = this.name_input.__parent + this.env.delimiter + newname;
+        this.http_post('rename-folder', '_folder_oldname='+urlencode(this.env.subscriptionrows[this.edit_folder][0])+'&_folder_newname='+urlencode(newname));
         }
       }
     // escape
@@ -2657,8 +2698,14 @@ function rcube_webmail()
 
     var refrow, form;
     var tbody = this.gui_objects.subscriptionlist.tBodies[0];
-    var id = replace && replace.id ? replace.id : 'rcmrow'+(tbody.childNodes.length+1);
+    var id = 'rcmrow'+(tbody.childNodes.length+1);
     var selection = this.subscription_list.get_single_selection();
+    
+    if (replace && replace.id)
+    {
+      id = replace.id;
+      refid = replace.id;
+    }
 
     if (!id || !(refrow = document.getElementById(refid)))
       {
@@ -2675,18 +2722,23 @@ function rcube_webmail()
       else
         tbody.appendChild(row);
       }
-
+    
     // add to folder/row-ID map
     this.env.subscriptionrows[row.id] = [name, display_name];
 
     // set folder name
     row.cells[0].innerHTML = display_name;
-    if (row.cells[1] && row.cells[1].firstChild.tagName=='INPUT')
+    
+    // set messages count to zero
+    if (!replace)
+      row.cells[1].innerHTML = '*';
+    
+    if (!replace && row.cells[2] && row.cells[2].firstChild.tagName=='INPUT')
       {
-      row.cells[1].firstChild.value = name;
-      row.cells[1].firstChild.checked = true;
+      row.cells[2].firstChild.value = name;
+      row.cells[2].firstChild.checked = true;
       }
-       
+    
     // add new folder to rename-folder list and clear input field
     if (!replace && (form = this.gui_objects.editform))
       {
@@ -3148,8 +3200,10 @@ function rcube_webmail()
 
         cell.id = 'rcmHead'+col;
         }
+        
+      if (col == 'subject' && this.message_list)
+        this.message_list.subject_col = n+1;
       }
-
   };
 
   // create a table row in the message list
@@ -3229,11 +3283,8 @@ function rcube_webmail()
     if (!this.gui_objects.mailboxlist)
       return false;
 
-    var reg, text_obj;
-    var item = this.get_folder_li(mbox);
-    mbox = String(mbox).toLowerCase().replace(this.identifier_expr, '');
-
-    if (item && item.className && item.className.indexOf('mailbox '+mbox)>=0)
+    var reg, text_obj, item;
+    if (item = this.get_folder_li(mbox))
       {
       // set new text
       text_obj = item.firstChild;
@@ -3477,13 +3528,10 @@ function rcube_webmail()
   this.check_for_recent = function()
     {
     if (this.busy)
-      {
-      this.send_keep_alive();
       return;
-      }
 
     this.set_busy(true, 'checkingmail');
-    this.http_request('check-recent', '_t='+(new Date().getTime()), true);
+    this.http_request('check-recent', (this.env.search_request ? '_search='+this.env.search_request+'&' : '') + '_t='+(new Date().getTime()), true);
     };
 
 
index f6ddadb8c78e606e484e416f6f8cc7548a6c4110..0cb6614a3fea22e8844d1e2f2e929b26f7ce18e1 100644 (file)
@@ -3,14 +3,14 @@
  | RoundCube common js library                                           |
  |                                                                       |
  | This file is part of the RoundCube web development suite              |
- | Copyright (C) 2005-2006, RoundCube Dev, - Switzerland                 |
+ | Copyright (C) 2005-2007, RoundCube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
  
- $Id: common.js 811 2007-09-25 07:33:37Z robin $
+ $Id: common.js 1064 2008-02-13 05:33:41Z till $
 */
 
 // Constants
@@ -52,16 +52,12 @@ function roundcube_browser()
 
   this.mz = (this.dom && this.ver>=5);  // (this.dom && this.product=='Gecko')
   this.ns = ((this.ver<5 && this.name=='Netscape') || (this.ver>=5 && this.vendor.indexOf('Netscape')>=0));
-  this.ns4 = (this.ns && parseInt(this.ver)==4);
   this.ns6 = (this.ns && parseInt(this.vendver)==6);  // (this.mz && this.ns) ? true : false;
   this.ns7 = (this.ns && parseInt(this.vendver)==7);  // this.agent.indexOf('Netscape/7')>0);
   this.safari = (this.agent.toLowerCase().indexOf('safari')>0 || this.agent.toLowerCase().indexOf('applewebkit')>0);
   this.konq   = (this.agent.toLowerCase().indexOf('konqueror')>0);
 
   this.opera = (window.opera) ? true : false;
-  this.opera5 = (this.opera5 && this.agent.indexOf('Opera 5')>0) ? true : false;
-  this.opera6 = (this.opera && this.agent.indexOf('Opera 6')>0) ? true : false;
-  this.opera7 = (this.opera && this.agent.indexOf('Opera 7')>0) ? true : false;
 
   if(this.opera && window.RegExp)
     this.vendver = (/opera(\s|\/)([0-9\.]+)/i.test(navigator.userAgent)) ? parseFloat(RegExp.$2) : -1;
@@ -80,11 +76,7 @@ function roundcube_browser()
     this.lang = RegExp.$1;
 
   this.dhtml = ((this.ie4 && this.win) || this.ie5 || this.ie6 || this.ns4 || this.mz);
-  this.layers = this.ns4;  // (document.layers);
-  this.div = (this.ie4 || this.dom);
   this.vml = (this.win && this.ie && this.dom && !this.opera);
-  this.linkborder = (this.ie || this.mz);
-  this.rollover = (this.ver>=4 || (this.ns && this.ver>=3));  // (document.images) ? true : false;
   this.pngalpha = (this.mz || (this.opera && this.vendver>=6) || (this.ie && this.mac && this.vendver>=5) ||
                    (this.ie && this.win && this.vendver>=5.5) || this.safari);
   this.opacity = (this.mz || (this.ie && this.vendver>=5.5 && !this.opera) || (this.safari && this.vendver>=100));
@@ -103,14 +95,23 @@ function roundcube_browser()
 // static functions for event handling
 var rcube_event = {
 
- /**
-  * returns the event key code
-  */
- get_keycode: function(e)
- {
-   e = e || window.event;
-   return e && e.keyCode ? e.keyCode : (e && e.which ? e.which : 0);
- },
+/**
+ * returns the event target element
+ */
+get_target: function(e)
+{
+  e = e || window.event;
+  return e && e.target ? e.target : e.srcElement;
+},
+
+/**
+ * returns the event key code
+ */
+get_keycode: function(e)
+{
+  e = e || window.event;
+  return e && e.keyCode ? e.keyCode : (e && e.which ? e.which : 0);
+},
 
 /**
  * returns modifier key (constants defined at top of file)
@@ -170,7 +171,12 @@ add_listener: function(p)
   if (p.element.addEventListener)
     p.element.addEventListener(p.event, p.object._rc_events[key], false);
   else if (p.element.attachEvent)
+    {
+    // IE allows multiple events with the same function to be applied to the same object
+    // forcibly detach the event, then attach
+    p.element.detachEvent('on'+p.event, p.object._rc_events[key]);
     p.element.attachEvent('on'+p.event, p.object._rc_events[key]);
+    }
   else
     p.element['on'+p.event] = p.object._rc_events[key];
 },
@@ -396,51 +402,19 @@ function rcube_check_email(input, inline)
   {
   if (input && window.RegExp)
     {
-    var no_ws_ctl    = "[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]";
-    var alpha        = "[\\x41-\\x5a\\x61-\\x7a]";
-    var digit        = "[\\x30-\\x39]";
-    var cr        = "\\x0d";
-    var lf        = "\\x0a";
-    var crlf        = "(" + cr + lf + ")";
-
-    var obs_char    = "[\\x00-\\x09\\x0b\\x0c\\x0e-\\x7f]";
-    var obs_text    = "("+lf+"*"+cr+"*("+obs_char+lf+"*"+cr+"*)*)";
-    var text        = "([\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f]|"+obs_text+")";
-    var obs_qp        = "(\\x5c[\\x00-\\x7f])";
-    var quoted_pair    = "(\\x5c"+text+"|"+obs_qp+")";
-
-    var wsp        = "[\\x20\\x09]";
-    var obs_fws    = "("+wsp+"+("+crlf+wsp+"+)*)";
-    var fws        = "((("+wsp+"*"+crlf+")?"+wsp+"+)|"+obs_fws+")";
-    var ctext        = "("+no_ws_ctl+"|[\\x21-\\x27\\x2A-\\x5b\\x5d-\\x7e])";
-    var ccontent    = "("+ctext+"|"+quoted_pair+")";
-    var comment    = "(\\x28("+fws+"?"+ccontent+")*"+fws+"?\\x29)";
-    var cfws        = "(("+fws+"?"+comment+")*("+fws+"?"+comment+"|"+fws+"))";
-    var cfws        = fws+"*";
-
-    var atext        = "("+alpha+"|"+digit+"|[\\x21\\x23-\\x27\\x2a\\x2b\\x2d\\x2e\\x3d\\x3f\\x5e\\x5f\\x60\\x7b-\\x7e])";
-    var atom        = "("+cfws+"?"+atext+"+"+cfws+"?)";
-
-    var qtext        = "("+no_ws_ctl+"|[\\x21\\x23-\\x5b\\x5d-\\x7e])";
-    var qcontent    = "("+qtext+"|"+quoted_pair+")";
-    var quoted_string    = "("+cfws+"?\\x22("+fws+"?"+qcontent+")*"+fws+"?\\x22"+cfws+"?)";
-    var word        = "("+atom+"|"+quoted_string+")";
-
-    var obs_local_part    = "("+word+"(\\x2e"+word+")*)";
-    var obs_domain    = "("+atom+"(\\x2e"+atom+")*)";
-
-    var dot_atom_text    = "("+atext+"+(\\x2e"+atext+"+)*)";
-    var dot_atom    = "("+cfws+"?"+dot_atom_text+cfws+"?)";
-
-    var dtext        = "("+no_ws_ctl+"|[\\x21-\\x5a\\x5e-\\x7e])";
-    var dcontent    = "("+dtext+"|"+quoted_pair+")";
-    var domain_literal    = "("+cfws+"?\\x5b("+fws+"?"+dcontent+")*"+fws+"?\\x5d"+cfws+"?)";
-
-    var local_part    = "("+dot_atom+"|"+quoted_string+"|"+obs_local_part+")";
-    var domain        = "("+dot_atom+"|"+domain_literal+"|"+obs_domain+")";
-    var addr_spec    = "("+local_part+"\\x40"+domain+")";
-
-    var reg1 = inline ? new RegExp(addr_spec, 'i') : new RegExp('^'+addr_spec+'$', 'i');
+    var qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
+    var dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
+    var atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
+    var quoted_pair = '\\x5c[\\x00-\\x7f]';
+    var domain_literal = '\\x5b('+dtext+'|'+quoted_pair+')*\\x5d';
+    var quoted_string = '\\x22('+qtext+'|'+quoted_pair+')*\\x22';
+    var sub_domain = '('+atom+'|'+domain_literal+')';
+    var word = '('+atom+'|'+quoted_string+')';
+    var domain = sub_domain+'(\\x2e'+sub_domain+')*';
+    var local_part = word+'(\\x2e'+word+')*';
+    var addr_spec = local_part+'\\x40'+domain;
+    var delim = '[,;\s\n]';
+    var reg1 = inline ? new RegExp('(^|<|'+delim+')'+addr_spec+'($|>|'+delim+')', 'i') : new RegExp('^'+addr_spec+'$', 'i');
     return reg1.test(input) ? true : false;
     }
   return false;
index df68cdd4124028237f8a3cddbe92bac284bf4a5c..98dde2eca5dfde303a1a059a620cc4487130f3d6 100644 (file)
@@ -22,15 +22,15 @@ function rcmail_editor_init(skin_path)
                  apply_source_formatting : true,
                  theme : 'advanced',
                  plugins : 'emotions,media,nonbreaking,table,searchreplace,spellchecker,visualchars',
-                 theme_advanced_buttons1 : 'bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,bullist,numlist,outdent,indent,separator,link,unlink,emotions,forecolor,backcolor,formatselect,fontselect,fontsizeselect',
-                 theme_advanced_buttons2 : 'undo,redo,image,media,hr,charmap,code,nonbreaking,visualchars,separator,search,replace,spellchecker,separator,tablecontrols',
+                 theme_advanced_buttons1 : 'bold,italic,underline,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,bullist,numlist,outdent,indent,separator,emotions,charmap,code,forecolor,backcolor,fontselect,fontsizeselect, separator,undo,redo,image,media',
+                 theme_advanced_buttons2 : '',
                  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_popup.css',
-                 editor_css : skin_path + '/editor_ui.css'
+                 editor_css : skin_path + '/editor_ui.css',
+                 external_image_list_url : 'program/js/editor_images.js'
                });
   }
 
@@ -63,9 +63,10 @@ function rcmail_toggle_editor(toggler)
   // determine the currently displayed editor
 
   var htmlFlag = document.getElementsByName('_is_html')[0];
-  var currentEditor = htmlFlag.value;
+  var isHtml = htmlFlag.value;
 
-  if (selectedEditor == currentEditor)
+  if (((selectedEditor == 'plain') && (isHtml == "0")) ||
+      ((selectedEditor == 'html') && (isHtml == "1")))
     {
     return;
     }
diff --git a/program/js/editor_images.js b/program/js/editor_images.js
new file mode 100644 (file)
index 0000000..ddac044
--- /dev/null
@@ -0,0 +1,20 @@
+
+var rc_client = tinyMCEPopup.windowOpener.rcube_webmail_client;
+if (rc_client.gui_objects.attachmentlist)
+{
+   var tinyMCEImageList = new Array();
+   var attachElems = rc_client.gui_objects.attachmentlist.getElementsByTagName("li");
+   for (i = 0; i < attachElems.length; i++)
+   {
+      var liElem = attachElems[i];
+      var fname = attachElems[i].id;
+      for (j = 0; j < liElem.childNodes.length; j++)
+      {
+         if (liElem.childNodes[j].nodeName == "#text")
+         {
+            fname = liElem.childNodes[j].nodeValue;
+         }
+      }
+      tinyMCEImageList.push([fname, rc_client.env.comm_path+'&_action=display-attachment&_file='+attachElems[i].id]);
+   }
+};
index de4d7c84a9234a018770f4adbfa315c6a6b7747d..e42d3f6b7bc7bbb9b89c5701e48cc89d457efde5 100644 (file)
@@ -3,7 +3,7 @@
  | RoundCube List Widget                                                 |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006, RoundCube Dev, - Switzerland                      |
+ | Copyright (C) 2006-2008, RoundCube Dev, - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -32,8 +32,8 @@ function rcube_list_widget(list, p)
   this.rows = [];
   this.selection = [];
   
+  this.subject_col = -1;
   this.shiftkey = false;
-
   this.multiselect = false;
   this.draggable = false;
   this.keyboard = false;
@@ -207,12 +207,13 @@ blur: function()
  */
 drag_row: function(e, id)
 {
-  this.in_selection_before = this.in_selection(id) ? id : false;
-
   // don't do anything (another action processed before)
-  if (this.dont_select)
+  var evtarget = rcube_event.get_target(e);
+  if (this.dont_select || (evtarget && (evtarget.tagName == 'INPUT' || evtarget.tagName == 'IMG')))
     return false;
 
+  this.in_selection_before = this.in_selection(id) ? id : false;
+
   // selects currently unselected row
   if (!this.in_selection_before)
   {
@@ -239,7 +240,11 @@ click_row: function(e, id)
 {
   var now = new Date().getTime();
   var mod_key = rcube_event.get_modifier(e);
-
+  var evtarget = rcube_event.get_target(e);
+  
+  if ((evtarget && (evtarget.tagName == 'INPUT' || evtarget.tagName == 'IMG')))
+    return false;
+  
   // don't do anything (another action processed before)
   if (this.dont_select)
     {
@@ -503,9 +508,12 @@ highlight_row: function(id, multiple)
 {
   if (this.rows[id] && !multiple)
   {
-    this.clear_selection();
-    this.selection[0] = id;
-    this.set_classname(this.rows[id].obj, 'selected', true)
+    if (!this.in_selection(id))
+    {
+      this.clear_selection();
+      this.selection[0] = id;
+      this.set_classname(this.rows[id].obj, 'selected', true);
+    }
   }
   else if (this.rows[id])
   {
@@ -535,8 +543,6 @@ key_press: function(e)
   if (this.focused != true) 
     return true;
 
-  this.shiftkey = e.shiftKey;
-
   var keyCode = document.layers ? e.which : document.all ? event.keyCode : document.getElementById ? e.keyCode : 0;
   var mod_key = rcube_event.get_modifier(e);
   switch (keyCode)
@@ -547,6 +553,7 @@ key_press: function(e)
       break;
 
     default:
+      this.shiftkey = e.shiftKey;
       this.key_pressed = keyCode;
       this.trigger_event('keypress');
   }
@@ -611,7 +618,7 @@ drag_mouse_move: function(e)
   
     // get subjects of selectedd messages
     var names = '';
-    var c, node, subject, obj;
+    var c, i, node, subject, obj;
     for(var n=0; n<this.selection.length; n++)
     {
       if (n>12)  // only show 12 lines
@@ -625,13 +632,20 @@ drag_mouse_move: function(e)
         obj = this.rows[this.selection[n]].obj;
         subject = '';
 
-        for(c=0; c<obj.childNodes.length; c++)
-          if (obj.childNodes[c].nodeName=='TD' && (node = obj.childNodes[c].firstChild) && (node.nodeType==3 || node.nodeName=='A'))
+        for(c=0, i=0; i<obj.childNodes.length; i++)
+        {
+          if (obj.childNodes[i].nodeName == 'TD')
           {
-            subject = node.nodeType==3 ? node.data : node.innerHTML;
-            names += (subject.length > 50 ? subject.substring(0, 50)+'...' : subject) + '<br />';
-            break;
+            if (((node = obj.childNodes[i].firstChild) && (node.nodeType==3 || node.nodeName=='A')) &&
+              (this.subject_col < 0 || (this.subject_col >= 0 && this.subject_col == c)))
+            {
+              subject = node.nodeType==3 ? node.data : node.innerHTML;
+              names += (subject.length > 50 ? subject.substring(0, 50)+'...' : subject) + '<br />';
+              break;
+            }
+            c++;
           }
+        }
       }
     }
 
index 60d6d4c8f51c5c3910583e84d96fdf9e219afdd2..1837b0acbe16906b8643f1ded1a32f5b05d64e36 100644 (file)
-                 GNU LESSER GENERAL PUBLIC LICENSE\r
-                      Version 2.1, February 1999\r
-\r
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.\r
- 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
- Everyone is permitted to copy and distribute verbatim copies\r
- of this license document, but changing it is not allowed.\r
-\r
-[This is the first released version of the Lesser GPL.  It also counts\r
- as the successor of the GNU Library Public License, version 2, hence\r
- the version number 2.1.]\r
-\r
-                           Preamble\r
-\r
-  The licenses for most software are designed to take away your\r
-freedom to share and change it.  By contrast, the GNU General Public\r
-Licenses are intended to guarantee your freedom to share and change\r
-free software--to make sure the software is free for all its users.\r
-\r
-  This license, the Lesser General Public License, applies to some\r
-specially designated software packages--typically libraries--of the\r
-Free Software Foundation and other authors who decide to use it.  You\r
-can use it too, but we suggest you first think carefully about whether\r
-this license or the ordinary General Public License is the better\r
-strategy to use in any particular case, based on the explanations below.\r
-\r
-  When we speak of free software, we are referring to freedom of use,\r
-not price.  Our General Public Licenses are designed to make sure that\r
-you have the freedom to distribute copies of free software (and charge\r
-for this service if you wish); that you receive source code or can get\r
-it if you want it; that you can change the software and use pieces of\r
-it in new free programs; and that you are informed that you can do\r
-these things.\r
-\r
-  To protect your rights, we need to make restrictions that forbid\r
-distributors to deny you these rights or to ask you to surrender these\r
-rights.  These restrictions translate to certain responsibilities for\r
-you if you distribute copies of the library or if you modify it.\r
-\r
-  For example, if you distribute copies of the library, whether gratis\r
-or for a fee, you must give the recipients all the rights that we gave\r
-you.  You must make sure that they, too, receive or can get the source\r
-code.  If you link other code with the library, you must provide\r
-complete object files to the recipients, so that they can relink them\r
-with the library after making changes to the library and recompiling\r
-it.  And you must show them these terms so they know their rights.\r
-\r
-  We protect your rights with a two-step method: (1) we copyright the\r
-library, and (2) we offer you this license, which gives you legal\r
-permission to copy, distribute and/or modify the library.\r
-\r
-  To protect each distributor, we want to make it very clear that\r
-there is no warranty for the free library.  Also, if the library is\r
-modified by someone else and passed on, the recipients should know\r
-that what they have is not the original version, so that the original\r
-author's reputation will not be affected by problems that might be\r
-introduced by others.\r
-\r
-  Finally, software patents pose a constant threat to the existence of\r
-any free program.  We wish to make sure that a company cannot\r
-effectively restrict the users of a free program by obtaining a\r
-restrictive license from a patent holder.  Therefore, we insist that\r
-any patent license obtained for a version of the library must be\r
-consistent with the full freedom of use specified in this license.\r
-\r
-  Most GNU software, including some libraries, is covered by the\r
-ordinary GNU General Public License.  This license, the GNU Lesser\r
-General Public License, applies to certain designated libraries, and\r
-is quite different from the ordinary General Public License.  We use\r
-this license for certain libraries in order to permit linking those\r
-libraries into non-free programs.\r
-\r
-  When a program is linked with a library, whether statically or using\r
-a shared library, the combination of the two is legally speaking a\r
-combined work, a derivative of the original library.  The ordinary\r
-General Public License therefore permits such linking only if the\r
-entire combination fits its criteria of freedom.  The Lesser General\r
-Public License permits more lax criteria for linking other code with\r
-the library.\r
-\r
-  We call this license the "Lesser" General Public License because it\r
-does Less to protect the user's freedom than the ordinary General\r
-Public License.  It also provides other free software developers Less\r
-of an advantage over competing non-free programs.  These disadvantages\r
-are the reason we use the ordinary General Public License for many\r
-libraries.  However, the Lesser license provides advantages in certain\r
-special circumstances.\r
-\r
-  For example, on rare occasions, there may be a special need to\r
-encourage the widest possible use of a certain library, so that it becomes\r
-a de-facto standard.  To achieve this, non-free programs must be\r
-allowed to use the library.  A more frequent case is that a free\r
-library does the same job as widely used non-free libraries.  In this\r
-case, there is little to gain by limiting the free library to free\r
-software only, so we use the Lesser General Public License.\r
-\r
-  In other cases, permission to use a particular library in non-free\r
-programs enables a greater number of people to use a large body of\r
-free software.  For example, permission to use the GNU C Library in\r
-non-free programs enables many more people to use the whole GNU\r
-operating system, as well as its variant, the GNU/Linux operating\r
-system.\r
-\r
-  Although the Lesser General Public License is Less protective of the\r
-users' freedom, it does ensure that the user of a program that is\r
-linked with the Library has the freedom and the wherewithal to run\r
-that program using a modified version of the Library.\r
-\r
-  The precise terms and conditions for copying, distribution and\r
-modification follow.  Pay close attention to the difference between a\r
-"work based on the library" and a "work that uses the library".  The\r
-former contains code derived from the library, whereas the latter must\r
-be combined with the library in order to run.\r
-\r
-                 GNU LESSER GENERAL PUBLIC LICENSE\r
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
-\r
-  0. This License Agreement applies to any software library or other\r
-program which contains a notice placed by the copyright holder or\r
-other authorized party saying it may be distributed under the terms of\r
-this Lesser General Public License (also called "this License").\r
-Each licensee is addressed as "you".\r
-\r
-  A "library" means a collection of software functions and/or data\r
-prepared so as to be conveniently linked with application programs\r
-(which use some of those functions and data) to form executables.\r
-\r
-  The "Library", below, refers to any such software library or work\r
-which has been distributed under these terms.  A "work based on the\r
-Library" means either the Library or any derivative work under\r
-copyright law: that is to say, a work containing the Library or a\r
-portion of it, either verbatim or with modifications and/or translated\r
-straightforwardly into another language.  (Hereinafter, translation is\r
-included without limitation in the term "modification".)\r
-\r
-  "Source code" for a work means the preferred form of the work for\r
-making modifications to it.  For a library, complete source code means\r
-all the source code for all modules it contains, plus any associated\r
-interface definition files, plus the scripts used to control compilation\r
-and installation of the library.\r
-\r
-  Activities other than copying, distribution and modification are not\r
-covered by this License; they are outside its scope.  The act of\r
-running a program using the Library is not restricted, and output from\r
-such a program is covered only if its contents constitute a work based\r
-on the Library (independent of the use of the Library in a tool for\r
-writing it).  Whether that is true depends on what the Library does\r
-and what the program that uses the Library does.\r
-  \r
-  1. You may copy and distribute verbatim copies of the Library's\r
-complete source code as you receive it, in any medium, provided that\r
-you conspicuously and appropriately publish on each copy an\r
-appropriate copyright notice and disclaimer of warranty; keep intact\r
-all the notices that refer to this License and to the absence of any\r
-warranty; and distribute a copy of this License along with the\r
-Library.\r
-\r
-  You may charge a fee for the physical act of transferring a copy,\r
-and you may at your option offer warranty protection in exchange for a\r
-fee.\r
-\r
-  2. You may modify your copy or copies of the Library or any portion\r
-of it, thus forming a work based on the Library, and copy and\r
-distribute such modifications or work under the terms of Section 1\r
-above, provided that you also meet all of these conditions:\r
-\r
-    a) The modified work must itself be a software library.\r
-\r
-    b) You must cause the files modified to carry prominent notices\r
-    stating that you changed the files and the date of any change.\r
-\r
-    c) You must cause the whole of the work to be licensed at no\r
-    charge to all third parties under the terms of this License.\r
-\r
-    d) If a facility in the modified Library refers to a function or a\r
-    table of data to be supplied by an application program that uses\r
-    the facility, other than as an argument passed when the facility\r
-    is invoked, then you must make a good faith effort to ensure that,\r
-    in the event an application does not supply such function or\r
-    table, the facility still operates, and performs whatever part of\r
-    its purpose remains meaningful.\r
-\r
-    (For example, a function in a library to compute square roots has\r
-    a purpose that is entirely well-defined independent of the\r
-    application.  Therefore, Subsection 2d requires that any\r
-    application-supplied function or table used by this function must\r
-    be optional: if the application does not supply it, the square\r
-    root function must still compute square roots.)\r
-\r
-These requirements apply to the modified work as a whole.  If\r
-identifiable sections of that work are not derived from the Library,\r
-and can be reasonably considered independent and separate works in\r
-themselves, then this License, and its terms, do not apply to those\r
-sections when you distribute them as separate works.  But when you\r
-distribute the same sections as part of a whole which is a work based\r
-on the Library, the distribution of the whole must be on the terms of\r
-this License, whose permissions for other licensees extend to the\r
-entire whole, and thus to each and every part regardless of who wrote\r
-it.\r
-\r
-Thus, it is not the intent of this section to claim rights or contest\r
-your rights to work written entirely by you; rather, the intent is to\r
-exercise the right to control the distribution of derivative or\r
-collective works based on the Library.\r
-\r
-In addition, mere aggregation of another work not based on the Library\r
-with the Library (or with a work based on the Library) on a volume of\r
-a storage or distribution medium does not bring the other work under\r
-the scope of this License.\r
-\r
-  3. You may opt to apply the terms of the ordinary GNU General Public\r
-License instead of this License to a given copy of the Library.  To do\r
-this, you must alter all the notices that refer to this License, so\r
-that they refer to the ordinary GNU General Public License, version 2,\r
-instead of to this License.  (If a newer version than version 2 of the\r
-ordinary GNU General Public License has appeared, then you can specify\r
-that version instead if you wish.)  Do not make any other change in\r
-these notices.\r
-\r
-  Once this change is made in a given copy, it is irreversible for\r
-that copy, so the ordinary GNU General Public License applies to all\r
-subsequent copies and derivative works made from that copy.\r
-\r
-  This option is useful when you wish to copy part of the code of\r
-the Library into a program that is not a library.\r
-\r
-  4. You may copy and distribute the Library (or a portion or\r
-derivative of it, under Section 2) in object code or executable form\r
-under the terms of Sections 1 and 2 above provided that you accompany\r
-it with the complete corresponding machine-readable source code, which\r
-must be distributed under the terms of Sections 1 and 2 above on a\r
-medium customarily used for software interchange.\r
-\r
-  If distribution of object code is made by offering access to copy\r
-from a designated place, then offering equivalent access to copy the\r
-source code from the same place satisfies the requirement to\r
-distribute the source code, even though third parties are not\r
-compelled to copy the source along with the object code.\r
-\r
-  5. A program that contains no derivative of any portion of the\r
-Library, but is designed to work with the Library by being compiled or\r
-linked with it, is called a "work that uses the Library".  Such a\r
-work, in isolation, is not a derivative work of the Library, and\r
-therefore falls outside the scope of this License.\r
-\r
-  However, linking a "work that uses the Library" with the Library\r
-creates an executable that is a derivative of the Library (because it\r
-contains portions of the Library), rather than a "work that uses the\r
-library".  The executable is therefore covered by this License.\r
-Section 6 states terms for distribution of such executables.\r
-\r
-  When a "work that uses the Library" uses material from a header file\r
-that is part of the Library, the object code for the work may be a\r
-derivative work of the Library even though the source code is not.\r
-Whether this is true is especially significant if the work can be\r
-linked without the Library, or if the work is itself a library.  The\r
-threshold for this to be true is not precisely defined by law.\r
-\r
-  If such an object file uses only numerical parameters, data\r
-structure layouts and accessors, and small macros and small inline\r
-functions (ten lines or less in length), then the use of the object\r
-file is unrestricted, regardless of whether it is legally a derivative\r
-work.  (Executables containing this object code plus portions of the\r
-Library will still fall under Section 6.)\r
-\r
-  Otherwise, if the work is a derivative of the Library, you may\r
-distribute the object code for the work under the terms of Section 6.\r
-Any executables containing that work also fall under Section 6,\r
-whether or not they are linked directly with the Library itself.\r
-\r
-  6. As an exception to the Sections above, you may also combine or\r
-link a "work that uses the Library" with the Library to produce a\r
-work containing portions of the Library, and distribute that work\r
-under terms of your choice, provided that the terms permit\r
-modification of the work for the customer's own use and reverse\r
-engineering for debugging such modifications.\r
-\r
-  You must give prominent notice with each copy of the work that the\r
-Library is used in it and that the Library and its use are covered by\r
-this License.  You must supply a copy of this License.  If the work\r
-during execution displays copyright notices, you must include the\r
-copyright notice for the Library among them, as well as a reference\r
-directing the user to the copy of this License.  Also, you must do one\r
-of these things:\r
-\r
-    a) Accompany the work with the complete corresponding\r
-    machine-readable source code for the Library including whatever\r
-    changes were used in the work (which must be distributed under\r
-    Sections 1 and 2 above); and, if the work is an executable linked\r
-    with the Library, with the complete machine-readable "work that\r
-    uses the Library", as object code and/or source code, so that the\r
-    user can modify the Library and then relink to produce a modified\r
-    executable containing the modified Library.  (It is understood\r
-    that the user who changes the contents of definitions files in the\r
-    Library will not necessarily be able to recompile the application\r
-    to use the modified definitions.)\r
-\r
-    b) Use a suitable shared library mechanism for linking with the\r
-    Library.  A suitable mechanism is one that (1) uses at run time a\r
-    copy of the library already present on the user's computer system,\r
-    rather than copying library functions into the executable, and (2)\r
-    will operate properly with a modified version of the library, if\r
-    the user installs one, as long as the modified version is\r
-    interface-compatible with the version that the work was made with.\r
-\r
-    c) Accompany the work with a written offer, valid for at\r
-    least three years, to give the same user the materials\r
-    specified in Subsection 6a, above, for a charge no more\r
-    than the cost of performing this distribution.\r
-\r
-    d) If distribution of the work is made by offering access to copy\r
-    from a designated place, offer equivalent access to copy the above\r
-    specified materials from the same place.\r
-\r
-    e) Verify that the user has already received a copy of these\r
-    materials or that you have already sent this user a copy.\r
-\r
-  For an executable, the required form of the "work that uses the\r
-Library" must include any data and utility programs needed for\r
-reproducing the executable from it.  However, as a special exception,\r
-the materials to be distributed need not include anything that is\r
-normally distributed (in either source or binary form) with the major\r
-components (compiler, kernel, and so on) of the operating system on\r
-which the executable runs, unless that component itself accompanies\r
-the executable.\r
-\r
-  It may happen that this requirement contradicts the license\r
-restrictions of other proprietary libraries that do not normally\r
-accompany the operating system.  Such a contradiction means you cannot\r
-use both them and the Library together in an executable that you\r
-distribute.\r
-\r
-  7. You may place library facilities that are a work based on the\r
-Library side-by-side in a single library together with other library\r
-facilities not covered by this License, and distribute such a combined\r
-library, provided that the separate distribution of the work based on\r
-the Library and of the other library facilities is otherwise\r
-permitted, and provided that you do these two things:\r
-\r
-    a) Accompany the combined library with a copy of the same work\r
-    based on the Library, uncombined with any other library\r
-    facilities.  This must be distributed under the terms of the\r
-    Sections above.\r
-\r
-    b) Give prominent notice with the combined library of the fact\r
-    that part of it is a work based on the Library, and explaining\r
-    where to find the accompanying uncombined form of the same work.\r
-\r
-  8. You may not copy, modify, sublicense, link with, or distribute\r
-the Library except as expressly provided under this License.  Any\r
-attempt otherwise to copy, modify, sublicense, link with, or\r
-distribute the Library is void, and will automatically terminate your\r
-rights under this License.  However, parties who have received copies,\r
-or rights, from you under this License will not have their licenses\r
-terminated so long as such parties remain in full compliance.\r
-\r
-  9. You are not required to accept this License, since you have not\r
-signed it.  However, nothing else grants you permission to modify or\r
-distribute the Library or its derivative works.  These actions are\r
-prohibited by law if you do not accept this License.  Therefore, by\r
-modifying or distributing the Library (or any work based on the\r
-Library), you indicate your acceptance of this License to do so, and\r
-all its terms and conditions for copying, distributing or modifying\r
-the Library or works based on it.\r
-\r
-  10. Each time you redistribute the Library (or any work based on the\r
-Library), the recipient automatically receives a license from the\r
-original licensor to copy, distribute, link with or modify the Library\r
-subject to these terms and conditions.  You may not impose any further\r
-restrictions on the recipients' exercise of the rights granted herein.\r
-You are not responsible for enforcing compliance by third parties with\r
-this License.\r
-\r
-  11. If, as a consequence of a court judgment or allegation of patent\r
-infringement or for any other reason (not limited to patent issues),\r
-conditions are imposed on you (whether by court order, agreement or\r
-otherwise) that contradict the conditions of this License, they do not\r
-excuse you from the conditions of this License.  If you cannot\r
-distribute so as to satisfy simultaneously your obligations under this\r
-License and any other pertinent obligations, then as a consequence you\r
-may not distribute the Library at all.  For example, if a patent\r
-license would not permit royalty-free redistribution of the Library by\r
-all those who receive copies directly or indirectly through you, then\r
-the only way you could satisfy both it and this License would be to\r
-refrain entirely from distribution of the Library.\r
-\r
-If any portion of this section is held invalid or unenforceable under any\r
-particular circumstance, the balance of the section is intended to apply,\r
-and the section as a whole is intended to apply in other circumstances.\r
-\r
-It is not the purpose of this section to induce you to infringe any\r
-patents or other property right claims or to contest validity of any\r
-such claims; this section has the sole purpose of protecting the\r
-integrity of the free software distribution system which is\r
-implemented by public license practices.  Many people have made\r
-generous contributions to the wide range of software distributed\r
-through that system in reliance on consistent application of that\r
-system; it is up to the author/donor to decide if he or she is willing\r
-to distribute software through any other system and a licensee cannot\r
-impose that choice.\r
-\r
-This section is intended to make thoroughly clear what is believed to\r
-be a consequence of the rest of this License.\r
-\r
-  12. If the distribution and/or use of the Library is restricted in\r
-certain countries either by patents or by copyrighted interfaces, the\r
-original copyright holder who places the Library under this License may add\r
-an explicit geographical distribution limitation excluding those countries,\r
-so that distribution is permitted only in or among countries not thus\r
-excluded.  In such case, this License incorporates the limitation as if\r
-written in the body of this License.\r
-\r
-  13. The Free Software Foundation may publish revised and/or new\r
-versions of the Lesser General Public License from time to time.\r
-Such new versions will be similar in spirit to the present version,\r
-but may differ in detail to address new problems or concerns.\r
-\r
-Each version is given a distinguishing version number.  If the Library\r
-specifies a version number of this License which applies to it and\r
-"any later version", you have the option of following the terms and\r
-conditions either of that version or of any later version published by\r
-the Free Software Foundation.  If the Library does not specify a\r
-license version number, you may choose any version ever published by\r
-the Free Software Foundation.\r
-\r
-  14. If you wish to incorporate parts of the Library into other free\r
-programs whose distribution conditions are incompatible with these,\r
-write to the author to ask for permission.  For software which is\r
-copyrighted by the Free Software Foundation, write to the Free\r
-Software Foundation; we sometimes make exceptions for this.  Our\r
-decision will be guided by the two goals of preserving the free status\r
-of all derivatives of our free software and of promoting the sharing\r
-and reuse of software generally.\r
-\r
-                           NO WARRANTY\r
-\r
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\r
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\r
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\r
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY\r
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\r
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\r
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\r
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r
-\r
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\r
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\r
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\r
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\r
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\r
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\r
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\r
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\r
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r
-DAMAGES.\r
-\r
-                    END OF TERMS AND CONDITIONS\r
-\r
-           How to Apply These Terms to Your New Libraries\r
-\r
-  If you develop a new library, and you want it to be of the greatest\r
-possible use to the public, we recommend making it free software that\r
-everyone can redistribute and change.  You can do so by permitting\r
-redistribution under these terms (or, alternatively, under the terms of the\r
-ordinary General Public License).\r
-\r
-  To apply these terms, attach the following notices to the library.  It is\r
-safest to attach them to the start of each source file to most effectively\r
-convey the exclusion of warranty; and each file should have at least the\r
-"copyright" line and a pointer to where the full notice is found.\r
-\r
-    <one line to give the library's name and a brief idea of what it does.>\r
-    Copyright (C) <year>  <name of author>\r
-\r
-    This library is free software; you can redistribute it and/or\r
-    modify it under the terms of the GNU Lesser General Public\r
-    License as published by the Free Software Foundation; either\r
-    version 2.1 of the License, or (at your option) any later version.\r
-\r
-    This library is distributed in the hope that it will be useful,\r
-    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
-    Lesser General Public License for more details.\r
-\r
-    You should have received a copy of the GNU Lesser General Public\r
-    License along with this library; if not, write to the Free Software\r
-    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
-\r
-Also add information on how to contact you by electronic and paper mail.\r
-\r
-You should also get your employer (if you work as a programmer) or your\r
-school, if any, to sign a "copyright disclaimer" for the library, if\r
-necessary.  Here is a sample; alter the names:\r
-\r
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the\r
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\r
-\r
-  <signature of Ty Coon>, 1 April 1990\r
-  Ty Coon, President of Vice\r
-\r
-That's all there is to it!\r
-\r
-\r
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                      Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                 GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                           NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
index 1f667e63358b7378a44af6d2b98e10dac4a1f78b..7873235e72a7768b3b3e78814ee3a2e2dd75eb08 100644 (file)
@@ -1,26 +1,26 @@
-.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {\r
-       border: 1px dotted #cc0000;\r
-       background-position: center;\r
-       background-repeat: no-repeat;\r
-       background-color: #ffffcc;\r
-}\r
-\r
-.mceItemShockWave {\r
-       background-image: url('../images/shockwave.gif');\r
-}\r
-\r
-.mceItemFlash {\r
-       background-image: url('../images/flash.gif');\r
-}\r
-\r
-.mceItemQuickTime {\r
-       background-image: url('../images/quicktime.gif');\r
-}\r
-\r
-.mceItemWindowsMedia {\r
-       background-image: url('../images/windowsmedia.gif');\r
-}\r
-\r
-.mceItemRealMedia {\r
-       background-image: url('../images/realmedia.gif');\r
-}\r
+.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {
+       border: 1px dotted #cc0000;
+       background-position: center;
+       background-repeat: no-repeat;
+       background-color: #ffffcc;
+}
+
+.mceItemShockWave {
+       background-image: url('../images/shockwave.gif');
+}
+
+.mceItemFlash {
+       background-image: url('../images/flash.gif');
+}
+
+.mceItemQuickTime {
+       background-image: url('../images/quicktime.gif');
+}
+
+.mceItemWindowsMedia {
+       background-image: url('../images/windowsmedia.gif');
+}
+
+.mceItemRealMedia {
+       background-image: url('../images/realmedia.gif');
+}
index 89c6bd5a055cdbf55727100dace8e41a9b95049c..62d666a5f83bc5d8cc31d0b0b514526501fdce70 100644 (file)
@@ -1,68 +1,68 @@
-#id, #name, #hspace, #vspace, #class_name, #align {\r
-       width: 100px;\r
-}\r
-\r
-#hspace, #vspace {\r
-       width: 50px;\r
-}\r
-\r
-#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode {\r
-       width: 100px;\r
-}\r
-\r
-#flash_base, #flash_flashvars {\r
-       width: 240px;\r
-}\r
-\r
-#width, #height {\r
-       width: 40px;\r
-}\r
-\r
-#src, #media_type {\r
-       width: 250px;\r
-}\r
-\r
-#class {\r
-       width: 120px;\r
-}\r
-\r
-#prev {\r
-       margin: 0;\r
-       border: 1px solid black;\r
-       width: 99%;\r
-       height: 230px;\r
-       overflow: auto;\r
-}\r
-\r
-.panel_wrapper div.current {\r
-       height: 390px;\r
-       overflow: auto;\r
-}\r
-\r
-#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options {\r
-       display: none;\r
-}\r
-\r
-.mceAddSelectValue {\r
-       background-color: #DDDDDD;\r
-}\r
-\r
-#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume {\r
-       width: 70px;\r
-}\r
-\r
-#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume {\r
-       width: 70px;\r
-}\r
-\r
-#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks {\r
-       width: 70px;\r
-}\r
-\r
-#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle {\r
-       width: 90px;\r
-}\r
-\r
-#qt_qtsrc {\r
-       width: 200px;\r
-}\r
+#id, #name, #hspace, #vspace, #class_name, #align {
+       width: 100px;
+}
+
+#hspace, #vspace {
+       width: 50px;
+}
+
+#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode {
+       width: 100px;
+}
+
+#flash_base, #flash_flashvars {
+       width: 240px;
+}
+
+#width, #height {
+       width: 40px;
+}
+
+#src, #media_type {
+       width: 250px;
+}
+
+#class {
+       width: 120px;
+}
+
+#prev {
+       margin: 0;
+       border: 1px solid black;
+       width: 99%;
+       height: 230px;
+       overflow: auto;
+}
+
+.panel_wrapper div.current {
+       height: 390px;
+       overflow: auto;
+}
+
+#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options {
+       display: none;
+}
+
+.mceAddSelectValue {
+       background-color: #DDDDDD;
+}
+
+#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume {
+       width: 70px;
+}
+
+#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume {
+       width: 70px;
+}
+
+#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks {
+       width: 70px;
+}
+
+#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle {
+       width: 90px;
+}
+
+#qt_qtsrc {
+       width: 200px;
+}
index d43198656b9076f1973b73b808f45f4159ccc1b6..f0cbaee788e7c01170495b8d409619244c86e15e 100644 (file)
@@ -1 +1 @@
-tinyMCE.importPluginLanguagePack('media');var TinyMCE_MediaPlugin={getInfo:function(){return{longname:'Media',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(inst.hasPlugin('flash')&&!tinyMCE.flashWarn){alert('Flash plugin is deprecated and should not be used together with the media plugin.');tinyMCE.flashWarn=true}if(!tinyMCE.settings['media_skip_plugin_css'])tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/media/css/content.css")},getControlHTML:function(cn){switch(cn){case"media":return tinyMCE.getButtonHTML(cn,'lang_media_desc','{$pluginurl}/images/media.gif','mceMedia')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceMedia":tinyMCE.openWindow({file:'../../plugins/media/media.htm',width:430+tinyMCE.getLang('lang_media_delta_width',0),height:470+tinyMCE.getLang('lang_media_delta_height',0)},{editor_id:editor_id,inline:"yes"});return true}return false},cleanup:function(type,content,inst){var nl,img,i,ne,d,s,ci;switch(type){case"insert_to_editor":img=tinyMCE.getParam("theme_href")+'/images/spacer.gif';content=content.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,'<img class="mceItem$1" title="$2" src="'+img+'" />');content=content.replace(/<object([^>]*)>/gi,'<div class="mceItemObject" $1>');content=content.replace(/<embed([^>]*)>/gi,'<div class="mceItemObjectEmbed" $1>');content=content.replace(/<\/(object|embed)([^>]*)>/gi,'</div>');content=content.replace(/<param([^>]*)>/gi,'<div $1 class="mceItemParam"></div>');content=content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>','gi'),'class="mceItemParam"></div>');break;case"insert_to_editor_dom":d=inst.getDoc();nl=content.getElementsByTagName("img");for(i=0;i<nl.length;i++){if(/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(nl[i].className)){nl[i].width=nl[i].title.replace(/.*width:[^0-9]?([0-9]+)%?.*/g,'$1');nl[i].height=nl[i].title.replace(/.*height:[^0-9]?([0-9]+)%?.*/g,'$1');}}nl=tinyMCE.selectElements(content,'DIV',function(n){return tinyMCE.hasCSSClass(n,'mceItemObject')});for(i=0;i<nl.length;i++){ci=tinyMCE.getAttrib(nl[i],"classid").toLowerCase().replace(/\s+/g,'');switch(ci){case'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemFlash',d,nl[i]),nl[i]);break;case'clsid:166b1bca-3f9c-11cf-8075-444553540000':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemShockWave',d,nl[i]),nl[i]);break;case'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':case'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':case'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemWindowsMedia',d,nl[i]),nl[i]);break;case'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemQuickTime',d,nl[i]),nl[i]);break;case'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemRealMedia',d,nl[i]),nl[i]);break}}nl=tinyMCE.selectNodes(content,function(n){return n.className=='mceItemObjectEmbed'});for(i=0;i<nl.length;i++){switch(tinyMCE.getAttrib(nl[i],'type')){case'application/x-shockwave-flash':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemFlash');break;case'application/x-director':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemShockWave');break;case'application/x-mplayer2':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemWindowsMedia');break;case'video/quicktime':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemQuickTime');break;case'audio/x-pn-realaudio-plugin':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemRealMedia');break}}break;case"get_from_editor":var startPos=-1,endPos,attribs,chunkBefore,chunkAfter,embedHTML,at,pl,cb,mt,ex;while((startPos=content.indexOf('<img',startPos+1))!=-1){endPos=content.indexOf('/>',startPos);attribs=TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos+4,endPos));if(!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class']))continue;endPos+=2;at=attribs['title'];if(at){at=at.replace(/&(#39|apos);/g,"'");at=at.replace(/&#quot;/g,'"');try{pl=eval('x={'+at+'};')}catch(ex){pl={}}}if(!tinyMCE.getParam('media_use_script',false)){switch(attribs['class']){case'mceItemFlash':ci='d27cdb6e-ae6d-11cf-96b8-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='application/x-shockwave-flash';break;case'mceItemShockWave':ci='166B1BCA-3F9C-11CF-8075-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';mt='application/x-director';break;case'mceItemWindowsMedia':ci=tinyMCE.getParam('media_wmp6_compatible')?'05589FA1-C356-11CE-BF01-00AA0055595A':'6BF52A52-394A-11D3-B153-00C04F79FAA6';cb='http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';mt='application/x-mplayer2';break;case'mceItemQuickTime':ci='02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';cb='http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';mt='video/quicktime';break;case'mceItemRealMedia':ci='CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='audio/x-pn-realaudio-plugin';break}if(!tinyMCE.getParam("relative_urls"))pl.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],pl.src);embedHTML=TinyMCE_MediaPlugin._getEmbed(ci,cb,mt,pl,attribs)}else{switch(attribs['class']){case'mceItemFlash':s='writeFlash';break;case'mceItemShockWave':s='writeShockWave';break;case'mceItemWindowsMedia':s='writeWindowsMedia';break;case'mceItemQuickTime':s='writeQuickTime';break;case'mceItemRealMedia':s='writeRealMedia';break}if(attribs.width)at=at.replace(/width:[^0-9]?[0-9]+%?[^0-9]?/g,"width:'"+attribs.width+"'");if(attribs.height)at=at.replace(/height:[^0-9]?[0-9]+%?[^0-9]?/g,"height:'"+attribs.height+"'");if(!tinyMCE.getParam("relative_urls")){pl.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],pl.src);at=at.replace(new RegExp("src:'[^']*'","g"),"src:'"+pl.src+"'")}embedHTML='<script type="text/javascript">'+s+'({'+at+'});</script>'}chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter}break}return content},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node==null)return;do{if(node.nodeName=="IMG"&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node,'class'))){tinyMCE.switchClass(editor_id+'_media','mceButtonSelected');return true}}while((node=node.parentNode));tinyMCE.switchClass(editor_id+'_media','mceButtonNormal');return true},_createImgFromEmbed:function(n,d,cl){var ne,at,i,ti='',an;ne=d.createElement('img');ne.src=tinyMCE.getParam("theme_href")+'/images/spacer.gif';ne.width=tinyMCE.getAttrib(n,'width');ne.height=tinyMCE.getAttrib(n,'height');ne.className=cl;at=n.attributes;for(i=0;i<at.length;i++){if(at[i].specified&&at[i].nodeValue){an=at[i].nodeName.toLowerCase();if(an=='src')continue;if(an=='mce_src')an='src';if(an.indexOf('mce_')==-1&&!new RegExp('^(class|type)$').test(an))ti+=an.toLowerCase()+':\''+at[i].nodeValue+"',"}}ti=ti.length>0?ti.substring(0,ti.length-1):ti;ne.title=ti;n.parentNode.replaceChild(ne,n)},_createImg:function(cl,d,n){var i,nl,ti="",an,av,al=new Array();ne=d.createElement('img');ne.src=tinyMCE.getParam("theme_href")+'/images/spacer.gif';ne.width=tinyMCE.getAttrib(n,'width');ne.height=tinyMCE.getAttrib(n,'height');ne.className=cl;al.id=tinyMCE.getAttrib(n,'id');al.name=tinyMCE.getAttrib(n,'name');al.width=tinyMCE.getAttrib(n,'width');al.height=tinyMCE.getAttrib(n,'height');al.bgcolor=tinyMCE.getAttrib(n,'bgcolor');al.align=tinyMCE.getAttrib(n,'align');al.class_name=tinyMCE.getAttrib(n,'mce_class');nl=n.getElementsByTagName('div');for(i=0;i<nl.length;i++){av=tinyMCE.getAttrib(nl[i],'value');av=av.replace(new RegExp('\\\\','g'),'\\\\');av=av.replace(new RegExp('"','g'),'\\"');av=av.replace(new RegExp("'",'g'),"\\'");an=tinyMCE.getAttrib(nl[i],'name');al[an]=av}if(al.movie){al.src=al.movie;al.movie=null}for(an in al){if(al[an]!=null&&typeof(al[an])!="function"&&al[an]!='')ti+=an.toLowerCase()+':\''+al[an]+"',"}ti=ti.length>0?ti.substring(0,ti.length-1):ti;ne.title=ti;return ne},_getEmbed:function(cls,cb,mt,p,at){var h='',n;p.width=at.width?at.width:p.width;p.height=at.height?at.height:p.height;h+='<object classid="clsid:'+cls+'" codebase="'+cb+'"';h+=typeof(p.id)!="undefined"?' id="'+p.id+'"':'';h+=typeof(p.name)!="undefined"?' name="'+p.name+'"':'';h+=typeof(p.width)!="undefined"?' width="'+p.width+'"':'';h+=typeof(p.height)!="undefined"?' height="'+p.height+'"':'';h+=typeof(p.align)!="undefined"?' align="'+p.align+'"':'';h+='>';for(n in p){if(typeof(p[n])!="undefined"&&typeof(p[n])!="function"){h+='<param name="'+n+'" value="'+p[n]+'" />';if(n=='src'&&p[n].indexOf('://')!=-1&&mt=='application/x-mplayer2')h+='<param name="url" value="'+p[n]+'" />'}}h+='<embed type="'+mt+'"';for(n in p){if(typeof(p[n])=="function")continue;if(!(n=='url'&&mt=='application/x-mplayer2'))h+=' '+n+'="'+p[n]+'"'}h+='></embed></object>';return h},_parseAttributes:function(attribute_string){var attributeName="",endChr='"';var attributeValue="";var withInName;var withInValue;var attributes=new Array();var whiteSpaceRegExp=new RegExp('^[ \n\r\t]+','g');if(attribute_string==null||attribute_string.length<2)return null;withInName=withInValue=false;for(var i=0;i<attribute_string.length;i++){var chr=attribute_string.charAt(i);if((chr=='"'||chr=="'")&&!withInValue){withInValue=true;endChr=chr}else if(chr==endChr&&withInValue){withInValue=false;var pos=attributeName.lastIndexOf(' ');if(pos!=-1)attributeName=attributeName.substring(pos+1);attributes[attributeName.toLowerCase()]=attributeValue.substring(1);attributeName="";attributeValue=""}else if(!whiteSpaceRegExp.test(chr)&&!withInName&&!withInValue)withInName=true;if(chr=='='&&withInName)withInName=false;if(withInName)attributeName+=chr;if(withInValue)attributeValue+=chr}return attributes}};tinyMCE.addPlugin("media",TinyMCE_MediaPlugin);
\ No newline at end of file
+tinyMCE.importPluginLanguagePack('media');var TinyMCE_MediaPlugin={getInfo:function(){return{longname:'Media',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(inst.hasPlugin('flash')&&!tinyMCE.flashWarn){alert('Flash plugin is deprecated and should not be used together with the media plugin.');tinyMCE.flashWarn=true}if(!tinyMCE.settings['media_skip_plugin_css'])tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/media/css/content.css")},getControlHTML:function(cn){switch(cn){case"media":return tinyMCE.getButtonHTML(cn,'lang_media_desc','{$pluginurl}/images/media.gif','mceMedia')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceMedia":tinyMCE.openWindow({file:'../../plugins/media/media.htm',width:430+tinyMCE.getLang('lang_media_delta_width',0),height:470+tinyMCE.getLang('lang_media_delta_height',0)},{editor_id:editor_id,inline:"yes"});return true}return false},cleanup:function(type,content,inst){var nl,img,i,ne,d,s,ci;switch(type){case"insert_to_editor":img=tinyMCE.getParam("theme_href")+'/images/spacer.gif';content=content.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,'<img class="mceItem$1" title="$2" src="'+img+'" />');content=content.replace(/<object([^>]*)>/gi,'<div class="mceItemObject" $1>');content=content.replace(/<embed([^>]*)>/gi,'<div class="mceItemObjectEmbed" $1>');content=content.replace(/<\/(object|embed)([^>]*)>/gi,'</div>');content=content.replace(/<param([^>]*)>/gi,'<div $1 class="mceItemParam"></div>');content=content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>','gi'),'class="mceItemParam"></div>');break;case"insert_to_editor_dom":d=inst.getDoc();nl=content.getElementsByTagName("img");for(i=0;i<nl.length;i++){if(/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(nl[i].className)){nl[i].width=nl[i].title.replace(/.*width:[^0-9]?([0-9]+)%?.*/g,'$1');nl[i].height=nl[i].title.replace(/.*height:[^0-9]?([0-9]+)%?.*/g,'$1');}}nl=tinyMCE.selectElements(content,'DIV',function(n){return tinyMCE.hasCSSClass(n,'mceItemObject')});for(i=0;i<nl.length;i++){ci=tinyMCE.getAttrib(nl[i],"classid").toLowerCase().replace(/\s+/g,'');switch(ci){case'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemFlash',d,nl[i]),nl[i]);break;case'clsid:166b1bca-3f9c-11cf-8075-444553540000':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemShockWave',d,nl[i]),nl[i]);break;case'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':case'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':case'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemWindowsMedia',d,nl[i]),nl[i]);break;case'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemQuickTime',d,nl[i]),nl[i]);break;case'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemRealMedia',d,nl[i]),nl[i]);break}}nl=tinyMCE.selectNodes(content,function(n){return n.className=='mceItemObjectEmbed'});for(i=0;i<nl.length;i++){switch(tinyMCE.getAttrib(nl[i],'type')){case'application/x-shockwave-flash':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemFlash');break;case'application/x-director':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemShockWave');break;case'application/x-mplayer2':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemWindowsMedia');break;case'video/quicktime':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemQuickTime');break;case'audio/x-pn-realaudio-plugin':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemRealMedia');break}}break;case"get_from_editor":var startPos=-1,endPos,attribs,chunkBefore,chunkAfter,embedHTML,at,pl,cb,mt,ex;while((startPos=content.indexOf('<img',startPos+1))!=-1){endPos=content.indexOf('/>',startPos);attribs=TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos+4,endPos));if(!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class']))continue;endPos+=2;at=attribs['title'];if(at){at=at.replace(/&(#39|apos);/g,"'");at=at.replace(/&#quot;/g,'"');try{pl=eval('x={'+at+'};')}catch(ex){pl={}}}if(!tinyMCE.getParam('media_use_script',false)){switch(attribs['class']){case'mceItemFlash':ci='d27cdb6e-ae6d-11cf-96b8-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='application/x-shockwave-flash';break;case'mceItemShockWave':ci='166B1BCA-3F9C-11CF-8075-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';mt='application/x-director';break;case'mceItemWindowsMedia':ci=tinyMCE.getParam('media_wmp6_compatible')?'05589FA1-C356-11CE-BF01-00AA0055595A':'6BF52A52-394A-11D3-B153-00C04F79FAA6';cb='http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';mt='application/x-mplayer2';break;case'mceItemQuickTime':ci='02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';cb='http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';mt='video/quicktime';break;case'mceItemRealMedia':ci='CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='audio/x-pn-realaudio-plugin';break}pl.src=tinyMCE.convertURL(pl.src,null,true);embedHTML=TinyMCE_MediaPlugin._getEmbed(ci,cb,mt,pl,attribs)}else{switch(attribs['class']){case'mceItemFlash':s='writeFlash';break;case'mceItemShockWave':s='writeShockWave';break;case'mceItemWindowsMedia':s='writeWindowsMedia';break;case'mceItemQuickTime':s='writeQuickTime';break;case'mceItemRealMedia':s='writeRealMedia';break}if(attribs.width)at=at.replace(/width:[^0-9]?[0-9]+%?[^0-9]?/g,"width:'"+attribs.width+"'");if(attribs.height)at=at.replace(/height:[^0-9]?[0-9]+%?[^0-9]?/g,"height:'"+attribs.height+"'");pl.src=tinyMCE.convertURL(pl.src,null,true);at=at.replace(new RegExp("src:'[^']*'","g"),"src:'"+pl.src+"'");embedHTML='<script type="text/javascript">'+s+'({'+at+'});</script>'}chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter}break}return content},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node==null)return;do{if(node.nodeName=="IMG"&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node,'class'))){tinyMCE.switchClass(editor_id+'_media','mceButtonSelected');return true}}while((node=node.parentNode));tinyMCE.switchClass(editor_id+'_media','mceButtonNormal');return true},_createImgFromEmbed:function(n,d,cl){var ne,at,i,ti='',an;ne=d.createElement('img');ne.src=tinyMCE.getParam("theme_href")+'/images/spacer.gif';ne.width=tinyMCE.getAttrib(n,'width');ne.height=tinyMCE.getAttrib(n,'height');ne.className=cl;at=n.attributes;for(i=0;i<at.length;i++){if(at[i].specified&&at[i].nodeValue){an=at[i].nodeName.toLowerCase();if(an=='src')continue;if(an=='mce_src')an='src';if(an.indexOf('mce_')==-1&&!new RegExp('^(class|type)$').test(an))ti+=an.toLowerCase()+':\''+at[i].nodeValue+"',"}}ti=ti.length>0?ti.substring(0,ti.length-1):ti;ne.title=ti;n.parentNode.replaceChild(ne,n)},_createImg:function(cl,d,n){var i,nl,ti="",an,av,al=new Array();ne=d.createElement('img');ne.src=tinyMCE.getParam("theme_href")+'/images/spacer.gif';ne.width=tinyMCE.getAttrib(n,'width');ne.height=tinyMCE.getAttrib(n,'height');ne.className=cl;al.id=tinyMCE.getAttrib(n,'id');al.name=tinyMCE.getAttrib(n,'name');al.width=tinyMCE.getAttrib(n,'width');al.height=tinyMCE.getAttrib(n,'height');al.bgcolor=tinyMCE.getAttrib(n,'bgcolor');al.align=tinyMCE.getAttrib(n,'align');al.class_name=tinyMCE.getAttrib(n,'mce_class');nl=n.getElementsByTagName('div');for(i=0;i<nl.length;i++){av=tinyMCE.getAttrib(nl[i],'value');av=av.replace(new RegExp('\\\\','g'),'\\\\');av=av.replace(new RegExp('"','g'),'\\"');av=av.replace(new RegExp("'",'g'),"\\'");an=tinyMCE.getAttrib(nl[i],'name');al[an]=av}if(al.movie){al.src=al.movie;al.movie=null}for(an in al){if(al[an]!=null&&typeof(al[an])!="function"&&al[an]!='')ti+=an.toLowerCase()+':\''+al[an]+"',"}ti=ti.length>0?ti.substring(0,ti.length-1):ti;ne.title=ti;return ne},_getEmbed:function(cls,cb,mt,p,at){var h='',n;p.width=at.width?at.width:p.width;p.height=at.height?at.height:p.height;h+='<object classid="clsid:'+cls+'" codebase="'+cb+'"';h+=typeof(p.id)!="undefined"?' id="'+p.id+'"':'';h+=typeof(p.name)!="undefined"?' name="'+p.name+'"':'';h+=typeof(p.width)!="undefined"?' width="'+p.width+'"':'';h+=typeof(p.height)!="undefined"?' height="'+p.height+'"':'';h+=typeof(p.align)!="undefined"?' align="'+p.align+'"':'';h+='>';for(n in p){if(typeof(p[n])!="undefined"&&typeof(p[n])!="function"){h+='<param name="'+n+'" value="'+p[n]+'" />';if(n=='src'&&p[n].indexOf('://')!=-1&&mt=='application/x-mplayer2')h+='<param name="url" value="'+p[n]+'" />'}}h+='<embed type="'+mt+'"';for(n in p){if(typeof(p[n])=="function")continue;if(!(n=='url'&&mt=='application/x-mplayer2'))h+=' '+n+'="'+p[n]+'"'}h+='></embed></object>';return h},_parseAttributes:function(attribute_string){var attributeName="",endChr='"';var attributeValue="";var withInName;var withInValue;var attributes=new Array();var whiteSpaceRegExp=new RegExp('^[ \n\r\t]+','g');if(attribute_string==null||attribute_string.length<2)return null;withInName=withInValue=false;for(var i=0;i<attribute_string.length;i++){var chr=attribute_string.charAt(i);if((chr=='"'||chr=="'")&&!withInValue){withInValue=true;endChr=chr}else if(chr==endChr&&withInValue){withInValue=false;var pos=attributeName.lastIndexOf(' ');if(pos!=-1)attributeName=attributeName.substring(pos+1);attributes[attributeName.toLowerCase()]=attributeValue.substring(1);attributeName="";attributeValue=""}else if(!whiteSpaceRegExp.test(chr)&&!withInName&&!withInValue)withInName=true;if(chr=='='&&withInName)withInName=false;if(withInName)attributeName+=chr;if(withInValue)attributeValue+=chr}return attributes}};tinyMCE.addPlugin("media",TinyMCE_MediaPlugin);
\ No newline at end of file
index 4478ebb59eae86bce199a812255155029f90eda4..ee7e13427b447a298c970a8a5d25e7f8f6011ee7 100644 (file)
-/**\r
- * $Id: editor_plugin_src.js 275 2007-05-01 15:35:08Z spocke $\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-/* Import plugin specific language pack */\r
-tinyMCE.importPluginLanguagePack('media');\r
-\r
-var TinyMCE_MediaPlugin = {\r
-       getInfo : function() {\r
-               return {\r
-                       longname : 'Media',\r
-                       author : 'Moxiecode Systems AB',\r
-                       authorurl : 'http://tinymce.moxiecode.com',\r
-                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',\r
-                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
-               };\r
-       },\r
-\r
-       initInstance : function(inst) {\r
-               // Warn if user has flash plugin and media plugin at the same time\r
-               if (inst.hasPlugin('flash') && !tinyMCE.flashWarn) {\r
-                       alert('Flash plugin is deprecated and should not be used together with the media plugin.');\r
-                       tinyMCE.flashWarn = true;\r
-               }\r
-\r
-               if (!tinyMCE.settings['media_skip_plugin_css'])\r
-                       tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/media/css/content.css");\r
-       },\r
-\r
-       getControlHTML : function(cn) {\r
-               switch (cn) {\r
-                       case "media":\r
-                               return tinyMCE.getButtonHTML(cn, 'lang_media_desc', '{$pluginurl}/images/media.gif', 'mceMedia');\r
-               }\r
-\r
-               return "";\r
-       },\r
-\r
-       execCommand : function(editor_id, element, command, user_interface, value) {\r
-               // Handle commands\r
-               switch (command) {\r
-                       case "mceMedia":\r
-                               tinyMCE.openWindow({\r
-                                               file : '../../plugins/media/media.htm',\r
-                                               width : 430 + tinyMCE.getLang('lang_media_delta_width', 0),\r
-                                               height : 470 + tinyMCE.getLang('lang_media_delta_height', 0)\r
-                                       }, {\r
-                                               editor_id : editor_id,\r
-                                               inline : "yes"\r
-                               });\r
-\r
-                               return true;\r
-          }\r
-\r
-          // Pass to next handler in chain\r
-          return false;\r
-       },\r
-\r
-       cleanup : function(type, content, inst) {\r
-               var nl, img, i, ne, d, s, ci;\r
-\r
-               switch (type) {\r
-                       case "insert_to_editor":\r
-                               img = tinyMCE.getParam("theme_href") + '/images/spacer.gif';\r
-                               content = content.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, '<img class="mceItem$1" title="$2" src="' + img + '" />');\r
-                               content = content.replace(/<object([^>]*)>/gi, '<div class="mceItemObject" $1>');\r
-                               content = content.replace(/<embed([^>]*)>/gi, '<div class="mceItemObjectEmbed" $1>');\r
-                               content = content.replace(/<\/(object|embed)([^>]*)>/gi, '</div>');\r
-                               content = content.replace(/<param([^>]*)>/gi, '<div $1 class="mceItemParam"></div>');\r
-                               content = content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>', 'gi'), 'class="mceItemParam"></div>');\r
-                               break;\r
-\r
-                       case "insert_to_editor_dom":\r
-                               d = inst.getDoc();\r
-                               nl = content.getElementsByTagName("img");\r
-                               for (i=0; i<nl.length; i++) {\r
-                                       if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(nl[i].className)) {\r
-                                               nl[i].width = nl[i].title.replace(/.*width:[^0-9]?([0-9]+)%?.*/g, '$1');\r
-                                               nl[i].height = nl[i].title.replace(/.*height:[^0-9]?([0-9]+)%?.*/g, '$1');\r
-                                               //nl[i].align = nl[i].title.replace(/.*align:([a-z]+).*/gi, '$1');\r
-                                       }\r
-                               }\r
-\r
-                               nl = tinyMCE.selectElements(content, 'DIV', function (n) {return tinyMCE.hasCSSClass(n, 'mceItemObject');});\r
-                               for (i=0; i<nl.length; i++) {\r
-                                       ci = tinyMCE.getAttrib(nl[i], "classid").toLowerCase().replace(/\s+/g, '');\r
-\r
-                                       switch (ci) {\r
-                                               case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':\r
-                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemFlash', d, nl[i]), nl[i]);\r
-                                                       break;\r
-\r
-                                               case 'clsid:166b1bca-3f9c-11cf-8075-444553540000':\r
-                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemShockWave', d, nl[i]), nl[i]);\r
-                                                       break;\r
-\r
-                                               case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':\r
-                                               case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':\r
-                                               case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':\r
-                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemWindowsMedia', d, nl[i]), nl[i]);\r
-                                                       break;\r
-\r
-                                               case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':\r
-                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemQuickTime', d, nl[i]), nl[i]);\r
-                                                       break;\r
-\r
-                                               case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':\r
-                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemRealMedia', d, nl[i]), nl[i]);\r
-                                                       break;\r
-                                       }\r
-                               }\r
-\r
-                               // Handle embed (if any)\r
-                               nl = tinyMCE.selectNodes(content, function (n) {return n.className == 'mceItemObjectEmbed';});\r
-                               for (i=0; i<nl.length; i++) {\r
-                                       switch (tinyMCE.getAttrib(nl[i], 'type')) {\r
-                                               case 'application/x-shockwave-flash':\r
-                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemFlash');\r
-                                                       break;\r
-\r
-                                               case 'application/x-director':\r
-                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemShockWave');\r
-                                                       break;\r
-\r
-                                               case 'application/x-mplayer2':\r
-                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemWindowsMedia');\r
-                                                       break;\r
-\r
-                                               case 'video/quicktime':\r
-                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemQuickTime');\r
-                                                       break;\r
-\r
-                                               case 'audio/x-pn-realaudio-plugin':\r
-                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemRealMedia');\r
-                                                       break;\r
-                                       }\r
-                               }\r
-                               break;\r
-\r
-                       case "get_from_editor":\r
-                               var startPos = -1, endPos, attribs, chunkBefore, chunkAfter, embedHTML, at, pl, cb, mt, ex;\r
-\r
-                               while ((startPos = content.indexOf('<img', startPos+1)) != -1) {\r
-                                       endPos = content.indexOf('/>', startPos);\r
-                                       attribs = TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos + 4, endPos));\r
-\r
-                                       // Is not flash, skip it\r
-                                       if (!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class']))\r
-                                               continue;\r
-\r
-                                       endPos += 2;\r
-\r
-                                       // Parse attributes\r
-                                       at = attribs['title'];\r
-                                       if (at) {\r
-                                               at = at.replace(/&(#39|apos);/g, "'");\r
-                                               at = at.replace(/&#quot;/g, '"');\r
-\r
-                                               try {\r
-                                                       pl = eval('x={' + at + '};');\r
-                                               } catch (ex) {\r
-                                                       pl = {};\r
-                                               }\r
-                                       }\r
-\r
-                                       // Use object/embed\r
-                                       if (!tinyMCE.getParam('media_use_script', false)) {\r
-                                               switch (attribs['class']) {\r
-                                                       case 'mceItemFlash':\r
-                                                               ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000';\r
-                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
-                                                               mt = 'application/x-shockwave-flash';\r
-                                                               break;\r
-\r
-                                                       case 'mceItemShockWave':\r
-                                                               ci = '166B1BCA-3F9C-11CF-8075-444553540000';\r
-                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';\r
-                                                               mt = 'application/x-director';\r
-                                                               break;\r
-\r
-                                                       case 'mceItemWindowsMedia':\r
-                                                               ci = tinyMCE.getParam('media_wmp6_compatible') ? '05589FA1-C356-11CE-BF01-00AA0055595A' : '6BF52A52-394A-11D3-B153-00C04F79FAA6';\r
-                                                               cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';\r
-                                                               mt = 'application/x-mplayer2';\r
-                                                               break;\r
-\r
-                                                       case 'mceItemQuickTime':\r
-                                                               ci = '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';\r
-                                                               cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';\r
-                                                               mt = 'video/quicktime';\r
-                                                               break;\r
-\r
-                                                       case 'mceItemRealMedia':\r
-                                                               ci = 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';\r
-                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
-                                                               mt = 'audio/x-pn-realaudio-plugin';\r
-                                                               break;\r
-                                               }\r
-\r
-                                               // Force absolute URL\r
-                                               if (!tinyMCE.getParam("relative_urls"))\r
-                                                       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);\r
-\r
-                                               embedHTML = TinyMCE_MediaPlugin._getEmbed(ci, cb, mt, pl, attribs);\r
-                                       } else {\r
-                                               // Use script version\r
-                                               switch (attribs['class']) {\r
-                                                       case 'mceItemFlash':\r
-                                                               s = 'writeFlash';\r
-                                                               break;\r
-\r
-                                                       case 'mceItemShockWave':\r
-                                                               s = 'writeShockWave';\r
-                                                               break;\r
-\r
-                                                       case 'mceItemWindowsMedia':\r
-                                                               s = 'writeWindowsMedia';\r
-                                                               break;\r
-\r
-                                                       case 'mceItemQuickTime':\r
-                                                               s = 'writeQuickTime';\r
-                                                               break;\r
-\r
-                                                       case 'mceItemRealMedia':\r
-                                                               s = 'writeRealMedia';\r
-                                                               break;\r
-                                               }\r
-\r
-                                               if (attribs.width)\r
-                                                       at = at.replace(/width:[^0-9]?[0-9]+%?[^0-9]?/g, "width:'" + attribs.width + "'");\r
-\r
-                                               if (attribs.height)\r
-                                                       at = at.replace(/height:[^0-9]?[0-9]+%?[^0-9]?/g, "height:'" + attribs.height + "'");\r
-\r
-                                               // Force absolute URL\r
-                                               if (!tinyMCE.getParam("relative_urls")) {\r
-                                                       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);\r
-                                                       at = at.replace(new RegExp("src:'[^']*'", "g"), "src:'" + pl.src + "'");\r
-                                               }\r
-\r
-                                               embedHTML = '<script type="text/javascript">' + s + '({' + at + '});</script>';\r
-                                       }\r
-\r
-                                       // Insert embed/object chunk\r
-                                       chunkBefore = content.substring(0, startPos);\r
-                                       chunkAfter = content.substring(endPos);\r
-                                       content = chunkBefore + embedHTML + chunkAfter;\r
-                               }\r
-                               break;\r
-               }\r
-\r
-               return content;\r
-       },\r
-\r
-       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
-               if (node == null)\r
-                       return;\r
-\r
-               do {\r
-                       if (node.nodeName == "IMG" && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node, 'class'))) {\r
-                               tinyMCE.switchClass(editor_id + '_media', 'mceButtonSelected');\r
-                               return true;\r
-                       }\r
-               } while ((node = node.parentNode));\r
-\r
-               tinyMCE.switchClass(editor_id + '_media', 'mceButtonNormal');\r
-\r
-               return true;\r
-       },\r
-\r
-       _createImgFromEmbed : function(n, d, cl) {\r
-               var ne, at, i, ti = '', an;\r
-\r
-               ne = d.createElement('img');\r
-               ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif';\r
-               ne.width = tinyMCE.getAttrib(n, 'width');\r
-               ne.height = tinyMCE.getAttrib(n, 'height');\r
-               ne.className = cl;\r
-\r
-               at = n.attributes;\r
-               for (i=0; i<at.length; i++) {\r
-                       if (at[i].specified && at[i].nodeValue) {\r
-                               an = at[i].nodeName.toLowerCase();\r
-\r
-                               if (an == 'src')\r
-                                       continue;\r
-\r
-                               if (an == 'mce_src')\r
-                                       an = 'src';\r
-\r
-                               if (an.indexOf('mce_') == -1 && !new RegExp('^(class|type)$').test(an))\r
-                                       ti += an.toLowerCase() + ':\'' + at[i].nodeValue + "',";\r
-                       }\r
-               }\r
-\r
-               ti = ti.length > 0 ? ti.substring(0, ti.length - 1) : ti;\r
-               ne.title = ti;\r
-\r
-               n.parentNode.replaceChild(ne, n);\r
-       },\r
-\r
-       _createImg : function(cl, d, n) {\r
-               var i, nl, ti = "", an, av, al = new Array();\r
-\r
-               ne = d.createElement('img');\r
-               ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif';\r
-               ne.width = tinyMCE.getAttrib(n, 'width');\r
-               ne.height = tinyMCE.getAttrib(n, 'height');\r
-               ne.className = cl;\r
-\r
-               al.id = tinyMCE.getAttrib(n, 'id');\r
-               al.name = tinyMCE.getAttrib(n, 'name');\r
-               al.width = tinyMCE.getAttrib(n, 'width');\r
-               al.height = tinyMCE.getAttrib(n, 'height');\r
-               al.bgcolor = tinyMCE.getAttrib(n, 'bgcolor');\r
-               al.align = tinyMCE.getAttrib(n, 'align');\r
-               al.class_name = tinyMCE.getAttrib(n, 'mce_class');\r
-\r
-               nl = n.getElementsByTagName('div');\r
-               for (i=0; i<nl.length; i++) {\r
-                       av = tinyMCE.getAttrib(nl[i], 'value');\r
-                       av = av.replace(new RegExp('\\\\', 'g'), '\\\\');\r
-                       av = av.replace(new RegExp('"', 'g'), '\\"');\r
-                       av = av.replace(new RegExp("'", 'g'), "\\'");\r
-                       an = tinyMCE.getAttrib(nl[i], 'name');\r
-                       al[an] = av;\r
-               }\r
-\r
-               if (al.movie) {\r
-                       al.src = al.movie;\r
-                       al.movie = null;\r
-               }\r
-\r
-               for (an in al) {\r
-                       if (al[an] != null && typeof(al[an]) != "function" && al[an] != '')\r
-                               ti += an.toLowerCase() + ':\'' + al[an] + "',";\r
-               }\r
-\r
-               ti = ti.length > 0 ? ti.substring(0, ti.length - 1) : ti;\r
-               ne.title = ti;\r
-\r
-               return ne;\r
-       },\r
-\r
-       _getEmbed : function(cls, cb, mt, p, at) {\r
-               var h = '', n;\r
-\r
-               p.width = at.width ? at.width : p.width;\r
-               p.height = at.height ? at.height : p.height;\r
-\r
-               h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';\r
-               h += typeof(p.id) != "undefined" ? ' id="' + p.id + '"' : '';\r
-               h += typeof(p.name) != "undefined" ? ' name="' + p.name + '"' : '';\r
-               h += typeof(p.width) != "undefined" ? ' width="' + p.width + '"' : '';\r
-               h += typeof(p.height) != "undefined" ? ' height="' + p.height + '"' : '';\r
-               h += typeof(p.align) != "undefined" ? ' align="' + p.align + '"' : '';\r
-               h += '>';\r
-\r
-               for (n in p) {\r
-                       if (typeof(p[n]) != "undefined" && typeof(p[n]) != "function") {\r
-                               h += '<param name="' + n + '" value="' + p[n] + '" />';\r
-\r
-                               // Add extra url parameter if it's an absolute URL on WMP\r
-                               if (n == 'src' && p[n].indexOf('://') != -1 && mt == 'application/x-mplayer2')\r
-                                       h += '<param name="url" value="' + p[n] + '" />';\r
-                       }\r
-               }\r
-\r
-               h += '<embed type="' + mt + '"';\r
-\r
-               for (n in p) {\r
-                       if (typeof(p[n]) == "function")\r
-                               continue;\r
-\r
-                       // Skip url parameter for embed tag on WMP\r
-                       if (!(n == 'url' && mt == 'application/x-mplayer2'))\r
-                               h += ' ' + n + '="' + p[n] + '"';\r
-               }\r
-\r
-               h += '></embed></object>';\r
-\r
-               return h;\r
-       },\r
-\r
-       _parseAttributes : function(attribute_string) {\r
-               var attributeName = "", endChr = '"';\r
-               var attributeValue = "";\r
-               var withInName;\r
-               var withInValue;\r
-               var attributes = new Array();\r
-               var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');\r
-\r
-               if (attribute_string == null || attribute_string.length < 2)\r
-                       return null;\r
-\r
-               withInName = withInValue = false;\r
-\r
-               for (var i=0; i<attribute_string.length; i++) {\r
-                       var chr = attribute_string.charAt(i);\r
-\r
-                       if ((chr == '"' || chr == "'") && !withInValue) {\r
-                               withInValue = true;\r
-                               endChr = chr;\r
-                       } else if (chr == endChr && withInValue) {\r
-                               withInValue = false;\r
-\r
-                               var pos = attributeName.lastIndexOf(' ');\r
-                               if (pos != -1)\r
-                                       attributeName = attributeName.substring(pos+1);\r
-\r
-                               attributes[attributeName.toLowerCase()] = attributeValue.substring(1);\r
-\r
-                               attributeName = "";\r
-                               attributeValue = "";\r
-                       } else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)\r
-                               withInName = true;\r
-\r
-                       if (chr == '=' && withInName)\r
-                               withInName = false;\r
-\r
-                       if (withInName)\r
-                               attributeName += chr;\r
-\r
-                       if (withInValue)\r
-                               attributeValue += chr;\r
-               }\r
-\r
-               return attributes;\r
-       }\r
-};\r
-\r
-tinyMCE.addPlugin("media", TinyMCE_MediaPlugin);\r
+/**
+ * $Id: editor_plugin_src.js 296 2007-08-21 10:36:35Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('media');
+
+var TinyMCE_MediaPlugin = {
+       getInfo : function() {
+               return {
+                       longname : 'Media',
+                       author : 'Moxiecode Systems AB',
+                       authorurl : 'http://tinymce.moxiecode.com',
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+               };
+       },
+
+       initInstance : function(inst) {
+               // Warn if user has flash plugin and media plugin at the same time
+               if (inst.hasPlugin('flash') && !tinyMCE.flashWarn) {
+                       alert('Flash plugin is deprecated and should not be used together with the media plugin.');
+                       tinyMCE.flashWarn = true;
+               }
+
+               if (!tinyMCE.settings['media_skip_plugin_css'])
+                       tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/media/css/content.css");
+       },
+
+       getControlHTML : function(cn) {
+               switch (cn) {
+                       case "media":
+                               return tinyMCE.getButtonHTML(cn, 'lang_media_desc', '{$pluginurl}/images/media.gif', 'mceMedia');
+               }
+
+               return "";
+       },
+
+       execCommand : function(editor_id, element, command, user_interface, value) {
+               // Handle commands
+               switch (command) {
+                       case "mceMedia":
+                               tinyMCE.openWindow({
+                                               file : '../../plugins/media/media.htm',
+                                               width : 430 + tinyMCE.getLang('lang_media_delta_width', 0),
+                                               height : 470 + tinyMCE.getLang('lang_media_delta_height', 0)
+                                       }, {
+                                               editor_id : editor_id,
+                                               inline : "yes"
+                               });
+
+                               return true;
+          }
+
+          // Pass to next handler in chain
+          return false;
+       },
+
+       cleanup : function(type, content, inst) {
+               var nl, img, i, ne, d, s, ci;
+
+               switch (type) {
+                       case "insert_to_editor":
+                               img = tinyMCE.getParam("theme_href") + '/images/spacer.gif';
+                               content = content.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, '<img class="mceItem$1" title="$2" src="' + img + '" />');
+                               content = content.replace(/<object([^>]*)>/gi, '<div class="mceItemObject" $1>');
+                               content = content.replace(/<embed([^>]*)>/gi, '<div class="mceItemObjectEmbed" $1>');
+                               content = content.replace(/<\/(object|embed)([^>]*)>/gi, '</div>');
+                               content = content.replace(/<param([^>]*)>/gi, '<div $1 class="mceItemParam"></div>');
+                               content = content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>', 'gi'), 'class="mceItemParam"></div>');
+                               break;
+
+                       case "insert_to_editor_dom":
+                               d = inst.getDoc();
+                               nl = content.getElementsByTagName("img");
+                               for (i=0; i<nl.length; i++) {
+                                       if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(nl[i].className)) {
+                                               nl[i].width = nl[i].title.replace(/.*width:[^0-9]?([0-9]+)%?.*/g, '$1');
+                                               nl[i].height = nl[i].title.replace(/.*height:[^0-9]?([0-9]+)%?.*/g, '$1');
+                                               //nl[i].align = nl[i].title.replace(/.*align:([a-z]+).*/gi, '$1');
+                                       }
+                               }
+
+                               nl = tinyMCE.selectElements(content, 'DIV', function (n) {return tinyMCE.hasCSSClass(n, 'mceItemObject');});
+                               for (i=0; i<nl.length; i++) {
+                                       ci = tinyMCE.getAttrib(nl[i], "classid").toLowerCase().replace(/\s+/g, '');
+
+                                       switch (ci) {
+                                               case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemFlash', d, nl[i]), nl[i]);
+                                                       break;
+
+                                               case 'clsid:166b1bca-3f9c-11cf-8075-444553540000':
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemShockWave', d, nl[i]), nl[i]);
+                                                       break;
+
+                                               case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':
+                                               case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':
+                                               case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemWindowsMedia', d, nl[i]), nl[i]);
+                                                       break;
+
+                                               case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemQuickTime', d, nl[i]), nl[i]);
+                                                       break;
+
+                                               case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemRealMedia', d, nl[i]), nl[i]);
+                                                       break;
+                                       }
+                               }
+
+                               // Handle embed (if any)
+                               nl = tinyMCE.selectNodes(content, function (n) {return n.className == 'mceItemObjectEmbed';});
+                               for (i=0; i<nl.length; i++) {
+                                       switch (tinyMCE.getAttrib(nl[i], 'type')) {
+                                               case 'application/x-shockwave-flash':
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemFlash');
+                                                       break;
+
+                                               case 'application/x-director':
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemShockWave');
+                                                       break;
+
+                                               case 'application/x-mplayer2':
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemWindowsMedia');
+                                                       break;
+
+                                               case 'video/quicktime':
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemQuickTime');
+                                                       break;
+
+                                               case 'audio/x-pn-realaudio-plugin':
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemRealMedia');
+                                                       break;
+                                       }
+                               }
+                               break;
+
+                       case "get_from_editor":
+                               var startPos = -1, endPos, attribs, chunkBefore, chunkAfter, embedHTML, at, pl, cb, mt, ex;
+
+                               while ((startPos = content.indexOf('<img', startPos+1)) != -1) {
+                                       endPos = content.indexOf('/>', startPos);
+                                       attribs = TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos + 4, endPos));
+
+                                       // Is not flash, skip it
+                                       if (!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class']))
+                                               continue;
+
+                                       endPos += 2;
+
+                                       // Parse attributes
+                                       at = attribs['title'];
+                                       if (at) {
+                                               at = at.replace(/&(#39|apos);/g, "'");
+                                               at = at.replace(/&#quot;/g, '"');
+
+                                               try {
+                                                       pl = eval('x={' + at + '};');
+                                               } catch (ex) {
+                                                       pl = {};
+                                               }
+                                       }
+
+                                       // Use object/embed
+                                       if (!tinyMCE.getParam('media_use_script', false)) {
+                                               switch (attribs['class']) {
+                                                       case 'mceItemFlash':
+                                                               ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000';
+                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';
+                                                               mt = 'application/x-shockwave-flash';
+                                                               break;
+
+                                                       case 'mceItemShockWave':
+                                                               ci = '166B1BCA-3F9C-11CF-8075-444553540000';
+                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';
+                                                               mt = 'application/x-director';
+                                                               break;
+
+                                                       case 'mceItemWindowsMedia':
+                                                               ci = tinyMCE.getParam('media_wmp6_compatible') ? '05589FA1-C356-11CE-BF01-00AA0055595A' : '6BF52A52-394A-11D3-B153-00C04F79FAA6';
+                                                               cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';
+                                                               mt = 'application/x-mplayer2';
+                                                               break;
+
+                                                       case 'mceItemQuickTime':
+                                                               ci = '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';
+                                                               cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';
+                                                               mt = 'video/quicktime';
+                                                               break;
+
+                                                       case 'mceItemRealMedia':
+                                                               ci = 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';
+                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';
+                                                               mt = 'audio/x-pn-realaudio-plugin';
+                                                               break;
+                                               }
+
+                                               // Convert the URL
+                                               pl.src = tinyMCE.convertURL(pl.src, null, true);
+
+                                               embedHTML = TinyMCE_MediaPlugin._getEmbed(ci, cb, mt, pl, attribs);
+                                       } else {
+                                               // Use script version
+                                               switch (attribs['class']) {
+                                                       case 'mceItemFlash':
+                                                               s = 'writeFlash';
+                                                               break;
+
+                                                       case 'mceItemShockWave':
+                                                               s = 'writeShockWave';
+                                                               break;
+
+                                                       case 'mceItemWindowsMedia':
+                                                               s = 'writeWindowsMedia';
+                                                               break;
+
+                                                       case 'mceItemQuickTime':
+                                                               s = 'writeQuickTime';
+                                                               break;
+
+                                                       case 'mceItemRealMedia':
+                                                               s = 'writeRealMedia';
+                                                               break;
+                                               }
+
+                                               if (attribs.width)
+                                                       at = at.replace(/width:[^0-9]?[0-9]+%?[^0-9]?/g, "width:'" + attribs.width + "'");
+
+                                               if (attribs.height)
+                                                       at = at.replace(/height:[^0-9]?[0-9]+%?[^0-9]?/g, "height:'" + attribs.height + "'");
+
+                                               // Force absolute URL
+                                               pl.src = tinyMCE.convertURL(pl.src, null, true);
+                                               at = at.replace(new RegExp("src:'[^']*'", "g"), "src:'" + pl.src + "'");
+
+                                               embedHTML = '<script type="text/javascript">' + s + '({' + at + '});</script>';
+                                       }
+
+                                       // Insert embed/object chunk
+                                       chunkBefore = content.substring(0, startPos);
+                                       chunkAfter = content.substring(endPos);
+                                       content = chunkBefore + embedHTML + chunkAfter;
+                               }
+                               break;
+               }
+
+               return content;
+       },
+
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
+               if (node == null)
+                       return;
+
+               do {
+                       if (node.nodeName == "IMG" && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node, 'class'))) {
+                               tinyMCE.switchClass(editor_id + '_media', 'mceButtonSelected');
+                               return true;
+                       }
+               } while ((node = node.parentNode));
+
+               tinyMCE.switchClass(editor_id + '_media', 'mceButtonNormal');
+
+               return true;
+       },
+
+       _createImgFromEmbed : function(n, d, cl) {
+               var ne, at, i, ti = '', an;
+
+               ne = d.createElement('img');
+               ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif';
+               ne.width = tinyMCE.getAttrib(n, 'width');
+               ne.height = tinyMCE.getAttrib(n, 'height');
+               ne.className = cl;
+
+               at = n.attributes;
+               for (i=0; i<at.length; i++) {
+                       if (at[i].specified && at[i].nodeValue) {
+                               an = at[i].nodeName.toLowerCase();
+
+                               if (an == 'src')
+                                       continue;
+
+                               if (an == 'mce_src')
+                                       an = 'src';
+
+                               if (an.indexOf('mce_') == -1 && !new RegExp('^(class|type)$').test(an))
+                                       ti += an.toLowerCase() + ':\'' + at[i].nodeValue + "',";
+                       }
+               }
+
+               ti = ti.length > 0 ? ti.substring(0, ti.length - 1) : ti;
+               ne.title = ti;
+
+               n.parentNode.replaceChild(ne, n);
+       },
+
+       _createImg : function(cl, d, n) {
+               var i, nl, ti = "", an, av, al = new Array();
+
+               ne = d.createElement('img');
+               ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif';
+               ne.width = tinyMCE.getAttrib(n, 'width');
+               ne.height = tinyMCE.getAttrib(n, 'height');
+               ne.className = cl;
+
+               al.id = tinyMCE.getAttrib(n, 'id');
+               al.name = tinyMCE.getAttrib(n, 'name');
+               al.width = tinyMCE.getAttrib(n, 'width');
+               al.height = tinyMCE.getAttrib(n, 'height');
+               al.bgcolor = tinyMCE.getAttrib(n, 'bgcolor');
+               al.align = tinyMCE.getAttrib(n, 'align');
+               al.class_name = tinyMCE.getAttrib(n, 'mce_class');
+
+               nl = n.getElementsByTagName('div');
+               for (i=0; i<nl.length; i++) {
+                       av = tinyMCE.getAttrib(nl[i], 'value');
+                       av = av.replace(new RegExp('\\\\', 'g'), '\\\\');
+                       av = av.replace(new RegExp('"', 'g'), '\\"');
+                       av = av.replace(new RegExp("'", 'g'), "\\'");
+                       an = tinyMCE.getAttrib(nl[i], 'name');
+                       al[an] = av;
+               }
+
+               if (al.movie) {
+                       al.src = al.movie;
+                       al.movie = null;
+               }
+
+               for (an in al) {
+                       if (al[an] != null && typeof(al[an]) != "function" && al[an] != '')
+                               ti += an.toLowerCase() + ':\'' + al[an] + "',";
+               }
+
+               ti = ti.length > 0 ? ti.substring(0, ti.length - 1) : ti;
+               ne.title = ti;
+
+               return ne;
+       },
+
+       _getEmbed : function(cls, cb, mt, p, at) {
+               var h = '', n;
+
+               p.width = at.width ? at.width : p.width;
+               p.height = at.height ? at.height : p.height;
+
+               h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';
+               h += typeof(p.id) != "undefined" ? ' id="' + p.id + '"' : '';
+               h += typeof(p.name) != "undefined" ? ' name="' + p.name + '"' : '';
+               h += typeof(p.width) != "undefined" ? ' width="' + p.width + '"' : '';
+               h += typeof(p.height) != "undefined" ? ' height="' + p.height + '"' : '';
+               h += typeof(p.align) != "undefined" ? ' align="' + p.align + '"' : '';
+               h += '>';
+
+               for (n in p) {
+                       if (typeof(p[n]) != "undefined" && typeof(p[n]) != "function") {
+                               h += '<param name="' + n + '" value="' + p[n] + '" />';
+
+                               // Add extra url parameter if it's an absolute URL on WMP
+                               if (n == 'src' && p[n].indexOf('://') != -1 && mt == 'application/x-mplayer2')
+                                       h += '<param name="url" value="' + p[n] + '" />';
+                       }
+               }
+
+               h += '<embed type="' + mt + '"';
+
+               for (n in p) {
+                       if (typeof(p[n]) == "function")
+                               continue;
+
+                       // Skip url parameter for embed tag on WMP
+                       if (!(n == 'url' && mt == 'application/x-mplayer2'))
+                               h += ' ' + n + '="' + p[n] + '"';
+               }
+
+               h += '></embed></object>';
+
+               return h;
+       },
+
+       _parseAttributes : function(attribute_string) {
+               var attributeName = "", endChr = '"';
+               var attributeValue = "";
+               var withInName;
+               var withInValue;
+               var attributes = new Array();
+               var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');
+
+               if (attribute_string == null || attribute_string.length < 2)
+                       return null;
+
+               withInName = withInValue = false;
+
+               for (var i=0; i<attribute_string.length; i++) {
+                       var chr = attribute_string.charAt(i);
+
+                       if ((chr == '"' || chr == "'") && !withInValue) {
+                               withInValue = true;
+                               endChr = chr;
+                       } else if (chr == endChr && withInValue) {
+                               withInValue = false;
+
+                               var pos = attributeName.lastIndexOf(' ');
+                               if (pos != -1)
+                                       attributeName = attributeName.substring(pos+1);
+
+                               attributes[attributeName.toLowerCase()] = attributeValue.substring(1);
+
+                               attributeName = "";
+                               attributeValue = "";
+                       } else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)
+                               withInName = true;
+
+                       if (chr == '=' && withInName)
+                               withInName = false;
+
+                       if (withInName)
+                               attributeName += chr;
+
+                       if (withInValue)
+                               attributeValue += chr;
+               }
+
+               return attributes;
+       }
+};
+
+tinyMCE.addPlugin("media", TinyMCE_MediaPlugin);
index f8dc810527b43e3403bfbe1e147399a06dfdf5b5..6fe25de090fae155f6e109463c6b78f26baccb3b 100644 (file)
@@ -1,73 +1,73 @@
-/**\r
- * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.\r
- */\r
-\r
-function writeFlash(p) {\r
-       writeEmbed(\r
-               'D27CDB6E-AE6D-11cf-96B8-444553540000',\r
-               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',\r
-               'application/x-shockwave-flash',\r
-               p\r
-       );\r
-}\r
-\r
-function writeShockWave(p) {\r
-       writeEmbed(\r
-       '166B1BCA-3F9C-11CF-8075-444553540000',\r
-       'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',\r
-       'application/x-director',\r
-               p\r
-       );\r
-}\r
-\r
-function writeQuickTime(p) {\r
-       writeEmbed(\r
-               '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',\r
-               'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',\r
-               'video/quicktime',\r
-               p\r
-       );\r
-}\r
-\r
-function writeRealMedia(p) {\r
-       writeEmbed(\r
-               'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',\r
-               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',\r
-               'audio/x-pn-realaudio-plugin',\r
-               p\r
-       );\r
-}\r
-\r
-function writeWindowsMedia(p) {\r
-       p.url = p.src;\r
-       writeEmbed(\r
-               '6BF52A52-394A-11D3-B153-00C04F79FAA6',\r
-               'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',\r
-               'application/x-mplayer2',\r
-               p\r
-       );\r
-}\r
-\r
-function writeEmbed(cls, cb, mt, p) {\r
-       var h = '', n;\r
-\r
-       h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';\r
-       h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';\r
-       h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';\r
-       h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';\r
-       h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';\r
-       h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';\r
-       h += '>';\r
-\r
-       for (n in p)\r
-               h += '<param name="' + n + '" value="' + p[n] + '">';\r
-\r
-       h += '<embed type="' + mt + '"';\r
-\r
-       for (n in p)\r
-               h += n + '="' + p[n] + '" ';\r
-\r
-       h += '></embed></object>';\r
-\r
-       document.write(h);\r
-}\r
+/**
+ * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.
+ */
+
+function writeFlash(p) {
+       writeEmbed(
+               'D27CDB6E-AE6D-11cf-96B8-444553540000',
+               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+               'application/x-shockwave-flash',
+               p
+       );
+}
+
+function writeShockWave(p) {
+       writeEmbed(
+       '166B1BCA-3F9C-11CF-8075-444553540000',
+       'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',
+       'application/x-director',
+               p
+       );
+}
+
+function writeQuickTime(p) {
+       writeEmbed(
+               '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
+               'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
+               'video/quicktime',
+               p
+       );
+}
+
+function writeRealMedia(p) {
+       writeEmbed(
+               'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',
+               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+               'audio/x-pn-realaudio-plugin',
+               p
+       );
+}
+
+function writeWindowsMedia(p) {
+       p.url = p.src;
+       writeEmbed(
+               '6BF52A52-394A-11D3-B153-00C04F79FAA6',
+               'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',
+               'application/x-mplayer2',
+               p
+       );
+}
+
+function writeEmbed(cls, cb, mt, p) {
+       var h = '', n;
+
+       h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';
+       h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';
+       h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';
+       h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';
+       h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';
+       h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';
+       h += '>';
+
+       for (n in p)
+               h += '<param name="' + n + '" value="' + p[n] + '">';
+
+       h += '<embed type="' + mt + '"';
+
+       for (n in p)
+               h += n + '="' + p[n] + '" ';
+
+       h += '></embed></object>';
+
+       document.write(h);
+}
index 691a8bdbd1ad445ba6aa0c489ae4d6dbbb9ba069..2b9a4f02cc5407a60cf0a1f888b005bb07edfe41 100644 (file)
-var oldWidth, oldHeight;\r
-var url = tinyMCE.getParam("media_external_list_url");\r
-if (url != null) {\r
-       // Fix relative\r
-       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
-               url = tinyMCE.documentBasePath + "/" + url;\r
-\r
-       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
-}\r
-\r
-function init() {\r
-       var pl = "", f, val;\r
-       var type = "flash", fe, i;\r
-\r
-       tinyMCEPopup.resizeToInnerSize();\r
-       f = document.forms[0]\r
-\r
-       fe = tinyMCE.selectedInstance.getFocusElement();\r
-       if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) {\r
-               pl = "x={" + fe.title + "};";\r
-\r
-               switch (tinyMCE.getAttrib(fe, 'class')) {\r
-                       case 'mceItemFlash':\r
-                               type = 'flash';\r
-                               break;\r
-\r
-                       case 'mceItemShockWave':\r
-                               type = 'shockwave';\r
-                               break;\r
-\r
-                       case 'mceItemWindowsMedia':\r
-                               type = 'wmp';\r
-                               break;\r
-\r
-                       case 'mceItemQuickTime':\r
-                               type = 'qt';\r
-                               break;\r
-\r
-                       case 'mceItemRealMedia':\r
-                               type = 'rmp';\r
-                               break;\r
-               }\r
-\r
-               document.forms[0].insert.value = tinyMCE.getLang('lang_update', 'Insert', true); \r
-       }\r
-\r
-       document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');\r
-       document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media');\r
-       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
-\r
-       var html = getMediaListHTML('filebrowser','src','media','media');\r
-       if (html == "")\r
-               document.getElementById("linklistrow").style.display = 'none';\r
-       else\r
-               document.getElementById("linklistcontainer").innerHTML = html;\r
-\r
-       // Resize some elements\r
-       if (isVisible('filebrowsercontainer'))\r
-               document.getElementById('src').style.width = '230px';\r
-\r
-       // Setup form\r
-       if (pl != "") {\r
-               pl = eval(pl);\r
-\r
-               switch (type) {\r
-                       case "flash":\r
-                               setBool(pl, 'flash', 'play');\r
-                               setBool(pl, 'flash', 'loop');\r
-                               setBool(pl, 'flash', 'menu');\r
-                               setBool(pl, 'flash', 'swliveconnect');\r
-                               setStr(pl, 'flash', 'quality');\r
-                               setStr(pl, 'flash', 'scale');\r
-                               setStr(pl, 'flash', 'salign');\r
-                               setStr(pl, 'flash', 'wmode');\r
-                               setStr(pl, 'flash', 'base');\r
-                               setStr(pl, 'flash', 'flashvars');\r
-                       break;\r
-\r
-                       case "qt":\r
-                               setBool(pl, 'qt', 'loop');\r
-                               setBool(pl, 'qt', 'autoplay');\r
-                               setBool(pl, 'qt', 'cache');\r
-                               setBool(pl, 'qt', 'controller');\r
-                               setBool(pl, 'qt', 'correction');\r
-                               setBool(pl, 'qt', 'enablejavascript');\r
-                               setBool(pl, 'qt', 'kioskmode');\r
-                               setBool(pl, 'qt', 'autohref');\r
-                               setBool(pl, 'qt', 'playeveryframe');\r
-                               setBool(pl, 'qt', 'tarsetcache');\r
-                               setStr(pl, 'qt', 'scale');\r
-                               setStr(pl, 'qt', 'starttime');\r
-                               setStr(pl, 'qt', 'endtime');\r
-                               setStr(pl, 'qt', 'tarset');\r
-                               setStr(pl, 'qt', 'qtsrcchokespeed');\r
-                               setStr(pl, 'qt', 'volume');\r
-                               setStr(pl, 'qt', 'qtsrc');\r
-                       break;\r
-\r
-                       case "shockwave":\r
-                               setBool(pl, 'shockwave', 'sound');\r
-                               setBool(pl, 'shockwave', 'progress');\r
-                               setBool(pl, 'shockwave', 'autostart');\r
-                               setBool(pl, 'shockwave', 'swliveconnect');\r
-                               setStr(pl, 'shockwave', 'swvolume');\r
-                               setStr(pl, 'shockwave', 'swstretchstyle');\r
-                               setStr(pl, 'shockwave', 'swstretchhalign');\r
-                               setStr(pl, 'shockwave', 'swstretchvalign');\r
-                       break;\r
-\r
-                       case "wmp":\r
-                               setBool(pl, 'wmp', 'autostart');\r
-                               setBool(pl, 'wmp', 'enabled');\r
-                               setBool(pl, 'wmp', 'enablecontextmenu');\r
-                               setBool(pl, 'wmp', 'fullscreen');\r
-                               setBool(pl, 'wmp', 'invokeurls');\r
-                               setBool(pl, 'wmp', 'mute');\r
-                               setBool(pl, 'wmp', 'stretchtofit');\r
-                               setBool(pl, 'wmp', 'windowlessvideo');\r
-                               setStr(pl, 'wmp', 'balance');\r
-                               setStr(pl, 'wmp', 'baseurl');\r
-                               setStr(pl, 'wmp', 'captioningid');\r
-                               setStr(pl, 'wmp', 'currentmarker');\r
-                               setStr(pl, 'wmp', 'currentposition');\r
-                               setStr(pl, 'wmp', 'defaultframe');\r
-                               setStr(pl, 'wmp', 'playcount');\r
-                               setStr(pl, 'wmp', 'rate');\r
-                               setStr(pl, 'wmp', 'uimode');\r
-                               setStr(pl, 'wmp', 'volume');\r
-                       break;\r
-\r
-                       case "rmp":\r
-                               setBool(pl, 'rmp', 'autostart');\r
-                               setBool(pl, 'rmp', 'loop');\r
-                               setBool(pl, 'rmp', 'autogotourl');\r
-                               setBool(pl, 'rmp', 'center');\r
-                               setBool(pl, 'rmp', 'imagestatus');\r
-                               setBool(pl, 'rmp', 'maintainaspect');\r
-                               setBool(pl, 'rmp', 'nojava');\r
-                               setBool(pl, 'rmp', 'prefetch');\r
-                               setBool(pl, 'rmp', 'shuffle');\r
-                               setStr(pl, 'rmp', 'console');\r
-                               setStr(pl, 'rmp', 'controls');\r
-                               setStr(pl, 'rmp', 'numloop');\r
-                               setStr(pl, 'rmp', 'scriptcallbacks');\r
-                       break;\r
-               }\r
-\r
-               setStr(pl, null, 'src');\r
-               setStr(pl, null, 'id');\r
-               setStr(pl, null, 'name');\r
-               setStr(pl, null, 'vspace');\r
-               setStr(pl, null, 'hspace');\r
-               setStr(pl, null, 'bgcolor');\r
-               setStr(pl, null, 'align');\r
-               setStr(pl, null, 'width');\r
-               setStr(pl, null, 'height');\r
-\r
-               if ((val = tinyMCE.getAttrib(fe, "width")) != "")\r
-                       pl.width = f.width.value = val;\r
-\r
-               if ((val = tinyMCE.getAttrib(fe, "height")) != "")\r
-                       pl.height = f.height.value = val;\r
-\r
-               oldWidth = pl.width ? parseInt(pl.width) : 0;\r
-               oldHeight = pl.height ? parseInt(pl.height) : 0;\r
-       } else\r
-               oldWidth = oldHeight = 0;\r
-\r
-       selectByValue(f, 'media_type', type);\r
-       changedType(type);\r
-       updateColor('bgcolor_pick', 'bgcolor');\r
-\r
-       TinyMCE_EditableSelects.init();\r
-       generatePreview();\r
-}\r
-\r
-function insertMedia() {\r
-       var fe, f = document.forms[0], h;\r
-\r
-       if (!AutoValidator.validate(f)) {\r
-               alert(tinyMCE.getLang('lang_invalid_data'));\r
-               return false;\r
-       }\r
-\r
-       f.width.value = f.width.value == "" ? 100 : f.width.value;\r
-       f.height.value = f.height.value == "" ? 100 : f.height.value;\r
-\r
-       fe = tinyMCE.selectedInstance.getFocusElement();\r
-       if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) {\r
-               switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
-                       case "flash":\r
-                               fe.className = "mceItemFlash";\r
-                               break;\r
-\r
-                       case "shockwave":\r
-                               fe.className = "mceItemShockWave";\r
-                               break;\r
-\r
-                       case "qt":\r
-                               fe.className = "mceItemQuickTime";\r
-                               break;\r
-\r
-                       case "wmp":\r
-                               fe.className = "mceItemWindowsMedia";\r
-                               break;\r
-\r
-                       case "rmp":\r
-                               fe.className = "mceItemRealMedia";\r
-                               break;\r
-               }\r
-\r
-               if (fe.width != f.width.value || fe.height != f.height.height)\r
-                       tinyMCE.selectedInstance.repaint();\r
-\r
-               fe.title = serializeParameters();\r
-               fe.width = f.width.value;\r
-               fe.height = f.height.value;\r
-               fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : '');\r
-               fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : '');\r
-               fe.align = f.align.options[f.align.selectedIndex].value;\r
-       } else {\r
-               h = '<img src="' + tinyMCE.getParam("theme_href") + '/images/spacer.gif"' ;\r
-\r
-               switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
-                       case "flash":\r
-                               h += ' class="mceItemFlash"';\r
-                               break;\r
-\r
-                       case "shockwave":\r
-                               h += ' class="mceItemShockWave"';\r
-                               break;\r
-\r
-                       case "qt":\r
-                               h += ' class="mceItemQuickTime"';\r
-                               break;\r
-\r
-                       case "wmp":\r
-                               h += ' class="mceItemWindowsMedia"';\r
-                               break;\r
-\r
-                       case "rmp":\r
-                               h += ' class="mceItemRealMedia"';\r
-                               break;\r
-               }\r
-\r
-               h += ' title="' + serializeParameters() + '"';\r
-               h += ' width="' + f.width.value + '"';\r
-               h += ' height="' + f.height.value + '"';\r
-               h += ' align="' + f.align.options[f.align.selectedIndex].value + '"';\r
-\r
-               h += ' />';\r
-\r
-               tinyMCE.selectedInstance.execCommand('mceInsertContent', false, h);\r
-       }\r
-\r
-       tinyMCEPopup.close();\r
-}\r
-\r
-function getMediaListHTML() {\r
-       if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) {\r
-               var html = "";\r
-\r
-               html += '<select id="linklist" name="linklist" style="width: 250px" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.src.value=this.options[this.selectedIndex].value;">';\r
-               html += '<option value="">---</option>';\r
-\r
-               for (var i=0; i<tinyMCEMediaList.length; i++)\r
-                       html += '<option value="' + tinyMCEMediaList[i][1] + '">' + tinyMCEMediaList[i][0] + '</option>';\r
-\r
-               html += '</select>';\r
-\r
-               return html;\r
-       }\r
-\r
-       return "";\r
-}\r
-\r
-function getType(v) {\r
-       var fo, i, c, el, x, f = document.forms[0];\r
-\r
-       fo = tinyMCE.getParam("media_types", "flash=swf;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';');\r
-\r
-       // YouTube\r
-       if (v.indexOf('http://www.youtube.com/watch?v=') == 0) {\r
-               f.width.value = '425';\r
-               f.height.value = '350';\r
-               f.src.value = 'http://www.youtube.com/v/' + v.substring('http://www.youtube.com/watch?v='.length);\r
-               return 'flash';\r
-       }\r
-\r
-       // Google video\r
-       if (v.indexOf('http://video.google.com/videoplay?docid=') == 0) {\r
-               f.width.value = '425';\r
-               f.height.value = '326';\r
-               f.src.value = 'http://video.google.com/googleplayer.swf?docId=' + v.substring('http://video.google.com/videoplay?docid='.length) + '&hl=en';\r
-               return 'flash';\r
-       }\r
-\r
-       for (i=0; i<fo.length; i++) {\r
-               c = fo[i].split('=');\r
-\r
-               el = c[1].split(',');\r
-               for (x=0; x<el.length; x++)\r
-               if (v.indexOf('.' + el[x]) != -1)\r
-                       return c[0];\r
-       }\r
-\r
-       return null;\r
-}\r
-\r
-function switchType(v) {\r
-       var t = getType(v), d = document, f = d.forms[0];\r
-\r
-       if (!t)\r
-               return;\r
-\r
-       selectByValue(d.forms[0], 'media_type', t);\r
-       changedType(t);\r
-\r
-       // Update qtsrc also\r
-       if (t == 'qt' && f.src.value.toLowerCase().indexOf('rtsp://') != -1) {\r
-               alert(tinyMCE.getLang("lang_media_qt_stream_warn"));\r
-\r
-               if (f.qt_qtsrc.value == '')\r
-                       f.qt_qtsrc.value = f.src.value;\r
-       }\r
-}\r
-\r
-function changedType(t) {\r
-       var d = document;\r
-\r
-       d.getElementById('flash_options').style.display = 'none';\r
-       d.getElementById('qt_options').style.display = 'none';\r
-       d.getElementById('shockwave_options').style.display = 'none';\r
-       d.getElementById('wmp_options').style.display = 'none';\r
-       d.getElementById('rmp_options').style.display = 'none';\r
-       d.getElementById(t + '_options').style.display = 'block';\r
-}\r
-\r
-function serializeParameters() {\r
-       var d = document, f = d.forms[0], s = '';\r
-\r
-       switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
-               case "flash":\r
-                       s += getBool('flash', 'play', true);\r
-                       s += getBool('flash', 'loop', true);\r
-                       s += getBool('flash', 'menu', true);\r
-                       s += getBool('flash', 'swliveconnect', false);\r
-                       s += getStr('flash', 'quality');\r
-                       s += getStr('flash', 'scale');\r
-                       s += getStr('flash', 'salign');\r
-                       s += getStr('flash', 'wmode');\r
-                       s += getStr('flash', 'base');\r
-                       s += getStr('flash', 'flashvars');\r
-               break;\r
-\r
-               case "qt":\r
-                       s += getBool('qt', 'loop', false);\r
-                       s += getBool('qt', 'autoplay', true);\r
-                       s += getBool('qt', 'cache', false);\r
-                       s += getBool('qt', 'controller', true);\r
-                       s += getBool('qt', 'correction', false, 'none', 'full');\r
-                       s += getBool('qt', 'enablejavascript', false);\r
-                       s += getBool('qt', 'kioskmode', false);\r
-                       s += getBool('qt', 'autohref', false);\r
-                       s += getBool('qt', 'playeveryframe', false);\r
-                       s += getBool('qt', 'targetcache', false);\r
-                       s += getStr('qt', 'scale');\r
-                       s += getStr('qt', 'starttime');\r
-                       s += getStr('qt', 'endtime');\r
-                       s += getStr('qt', 'target');\r
-                       s += getStr('qt', 'qtsrcchokespeed');\r
-                       s += getStr('qt', 'volume');\r
-                       s += getStr('qt', 'qtsrc');\r
-               break;\r
-\r
-               case "shockwave":\r
-                       s += getBool('shockwave', 'sound');\r
-                       s += getBool('shockwave', 'progress');\r
-                       s += getBool('shockwave', 'autostart');\r
-                       s += getBool('shockwave', 'swliveconnect');\r
-                       s += getStr('shockwave', 'swvolume');\r
-                       s += getStr('shockwave', 'swstretchstyle');\r
-                       s += getStr('shockwave', 'swstretchhalign');\r
-                       s += getStr('shockwave', 'swstretchvalign');\r
-               break;\r
-\r
-               case "wmp":\r
-                       s += getBool('wmp', 'autostart', true);\r
-                       s += getBool('wmp', 'enabled', false);\r
-                       s += getBool('wmp', 'enablecontextmenu', true);\r
-                       s += getBool('wmp', 'fullscreen', false);\r
-                       s += getBool('wmp', 'invokeurls', true);\r
-                       s += getBool('wmp', 'mute', false);\r
-                       s += getBool('wmp', 'stretchtofit', false);\r
-                       s += getBool('wmp', 'windowlessvideo', false);\r
-                       s += getStr('wmp', 'balance');\r
-                       s += getStr('wmp', 'baseurl');\r
-                       s += getStr('wmp', 'captioningid');\r
-                       s += getStr('wmp', 'currentmarker');\r
-                       s += getStr('wmp', 'currentposition');\r
-                       s += getStr('wmp', 'defaultframe');\r
-                       s += getStr('wmp', 'playcount');\r
-                       s += getStr('wmp', 'rate');\r
-                       s += getStr('wmp', 'uimode');\r
-                       s += getStr('wmp', 'volume');\r
-               break;\r
-\r
-               case "rmp":\r
-                       s += getBool('rmp', 'autostart', false);\r
-                       s += getBool('rmp', 'loop', false);\r
-                       s += getBool('rmp', 'autogotourl', true);\r
-                       s += getBool('rmp', 'center', false);\r
-                       s += getBool('rmp', 'imagestatus', true);\r
-                       s += getBool('rmp', 'maintainaspect', false);\r
-                       s += getBool('rmp', 'nojava', false);\r
-                       s += getBool('rmp', 'prefetch', false);\r
-                       s += getBool('rmp', 'shuffle', false);\r
-                       s += getStr('rmp', 'console');\r
-                       s += getStr('rmp', 'controls');\r
-                       s += getStr('rmp', 'numloop');\r
-                       s += getStr('rmp', 'scriptcallbacks');\r
-               break;\r
-       }\r
-\r
-       s += getStr(null, 'id');\r
-       s += getStr(null, 'name');\r
-       s += getStr(null, 'src');\r
-       s += getStr(null, 'align');\r
-       s += getStr(null, 'bgcolor');\r
-       s += getInt(null, 'vspace');\r
-       s += getInt(null, 'hspace');\r
-       s += getStr(null, 'width');\r
-       s += getStr(null, 'height');\r
-\r
-       s = s.length > 0 ? s.substring(0, s.length - 1) : s;\r
-\r
-       return s;\r
-}\r
-\r
-function setBool(pl, p, n) {\r
-       if (typeof(pl[n]) == "undefined")\r
-               return;\r
-\r
-       document.forms[0].elements[p + "_" + n].checked = pl[n];\r
-}\r
-\r
-function setStr(pl, p, n) {\r
-       var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n];\r
-\r
-       if (typeof(pl[n]) == "undefined")\r
-               return;\r
-\r
-       if (e.type == "text")\r
-               e.value = pl[n];\r
-       else\r
-               selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]);\r
-}\r
-\r
-function getBool(p, n, d, tv, fv) {\r
-       var v = document.forms[0].elements[p + "_" + n].checked;\r
-\r
-       tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'";\r
-       fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'";\r
-\r
-       return (v == d) ? '' : n + (v ? ':' + tv + ',' : ':' + fv + ',');\r
-}\r
-\r
-function getStr(p, n, d) {\r
-       var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];\r
-       var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;\r
-\r
-       return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',");\r
-}\r
-\r
-function getInt(p, n, d) {\r
-       var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];\r
-       var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;\r
-\r
-       return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ",");\r
-}\r
-\r
-function jsEncode(s) {\r
-       s = s.replace(new RegExp('\\\\', 'g'), '\\\\');\r
-       s = s.replace(new RegExp('"', 'g'), '\\"');\r
-       s = s.replace(new RegExp("'", 'g'), "\\'");\r
-\r
-       return s;\r
-}\r
-\r
-function generatePreview(c) {\r
-       var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh;\r
-\r
-       p.innerHTML = '<!-- x --->';\r
-\r
-       nw = parseInt(f.width.value);\r
-       nh = parseInt(f.height.value);\r
-\r
-       if (f.width.value != "" && f.height.value != "") {\r
-               if (f.constrain.checked) {\r
-                       if (c == 'width' && oldWidth != 0) {\r
-                               wp = nw / oldWidth;\r
-                               nh = Math.round(wp * nh);\r
-                               f.height.value = nh;\r
-                       } else if (c == 'height' && oldHeight != 0) {\r
-                               hp = nh / oldHeight;\r
-                               nw = Math.round(hp * nw);\r
-                               f.width.value = nw;\r
-                       }\r
-               }\r
-       }\r
-\r
-       if (f.width.value != "")\r
-               oldWidth = nw;\r
-\r
-       if (f.height.value != "")\r
-               oldHeight = nh;\r
-\r
-       // After constrain\r
-       pl = serializeParameters();\r
-\r
-       switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
-               case "flash":\r
-                       cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';\r
-                       codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
-                       type = 'application/x-shockwave-flash';\r
-                       break;\r
-\r
-               case "shockwave":\r
-                       cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000';\r
-                       codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';\r
-                       type = 'application/x-director';\r
-                       break;\r
-\r
-               case "qt":\r
-                       cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';\r
-                       codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';\r
-                       type = 'video/quicktime';\r
-                       break;\r
-\r
-               case "wmp":\r
-                       cls = tinyMCE.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6';\r
-                       codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';\r
-                       type = 'application/x-mplayer2';\r
-                       break;\r
-\r
-               case "rmp":\r
-                       cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';\r
-                       codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';\r
-                       type = 'audio/x-pn-realaudio-plugin';\r
-                       break;\r
-       }\r
-\r
-       if (pl == '') {\r
-               p.innerHTML = '';\r
-               return;\r
-       }\r
-\r
-       pl = eval('x={' + pl + '};');\r
-\r
-       if (!pl.src) {\r
-               p.innerHTML = '';\r
-               return;\r
-       }\r
-\r
-       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);\r
-       pl.width = !pl.width ? 100 : pl.width;\r
-       pl.height = !pl.height ? 100 : pl.height;\r
-       pl.id = !pl.id ? 'obj' : pl.id;\r
-       pl.name = !pl.name ? 'eobj' : pl.name;\r
-       pl.align = !pl.align ? '' : pl.align;\r
-\r
-       h += '<object classid="clsid:' + cls + '" codebase="' + codebase + '" width="' + pl.width + '" height="' + pl.height + '" id="' + pl.id + '" name="' + pl.name + '" align="' + pl.align + '">';\r
-\r
-       for (n in pl) {\r
-               h += '<param name="' + n + '" value="' + pl[n] + '">';\r
-\r
-               // Add extra url parameter if it's an absolute URL\r
-               if (n == 'src' && pl[n].indexOf('://') != -1)\r
-                       h += '<param name="url" value="' + pl[n] + '" />';\r
-       }\r
-\r
-       h += '<embed type="' + type + '" ';\r
-\r
-       for (n in pl)\r
-               h += n + '="' + pl[n] + '" ';\r
-\r
-       h += '></embed></object>';\r
-\r
-       p.innerHTML = "<!-- x --->" + h;\r
-}\r
+var oldWidth, oldHeight;
+var url = tinyMCE.getParam("media_external_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() {
+       var pl = "", f, val;
+       var type = "flash", fe, i;
+
+       tinyMCEPopup.resizeToInnerSize();
+       f = document.forms[0]
+
+       fe = tinyMCE.selectedInstance.getFocusElement();
+       if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) {
+               pl = "x={" + fe.title + "};";
+
+               switch (tinyMCE.getAttrib(fe, 'class')) {
+                       case 'mceItemFlash':
+                               type = 'flash';
+                               break;
+
+                       case 'mceItemShockWave':
+                               type = 'shockwave';
+                               break;
+
+                       case 'mceItemWindowsMedia':
+                               type = 'wmp';
+                               break;
+
+                       case 'mceItemQuickTime':
+                               type = 'qt';
+                               break;
+
+                       case 'mceItemRealMedia':
+                               type = 'rmp';
+                               break;
+               }
+
+               document.forms[0].insert.value = tinyMCE.getLang('lang_update', 'Insert', true); 
+       }
+
+       document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');
+       document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media');
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+
+       var html = getMediaListHTML('filebrowser','src','media','media');
+       if (html == "")
+               document.getElementById("linklistrow").style.display = 'none';
+       else
+               document.getElementById("linklistcontainer").innerHTML = html;
+
+       // Resize some elements
+       if (isVisible('filebrowsercontainer'))
+               document.getElementById('src').style.width = '230px';
+
+       // Setup form
+       if (pl != "") {
+               pl = eval(pl);
+
+               switch (type) {
+                       case "flash":
+                               setBool(pl, 'flash', 'play');
+                               setBool(pl, 'flash', 'loop');
+                               setBool(pl, 'flash', 'menu');
+                               setBool(pl, 'flash', 'swliveconnect');
+                               setStr(pl, 'flash', 'quality');
+                               setStr(pl, 'flash', 'scale');
+                               setStr(pl, 'flash', 'salign');
+                               setStr(pl, 'flash', 'wmode');
+                               setStr(pl, 'flash', 'base');
+                               setStr(pl, 'flash', 'flashvars');
+                       break;
+
+                       case "qt":
+                               setBool(pl, 'qt', 'loop');
+                               setBool(pl, 'qt', 'autoplay');
+                               setBool(pl, 'qt', 'cache');
+                               setBool(pl, 'qt', 'controller');
+                               setBool(pl, 'qt', 'correction');
+                               setBool(pl, 'qt', 'enablejavascript');
+                               setBool(pl, 'qt', 'kioskmode');
+                               setBool(pl, 'qt', 'autohref');
+                               setBool(pl, 'qt', 'playeveryframe');
+                               setBool(pl, 'qt', 'tarsetcache');
+                               setStr(pl, 'qt', 'scale');
+                               setStr(pl, 'qt', 'starttime');
+                               setStr(pl, 'qt', 'endtime');
+                               setStr(pl, 'qt', 'tarset');
+                               setStr(pl, 'qt', 'qtsrcchokespeed');
+                               setStr(pl, 'qt', 'volume');
+                               setStr(pl, 'qt', 'qtsrc');
+                       break;
+
+                       case "shockwave":
+                               setBool(pl, 'shockwave', 'sound');
+                               setBool(pl, 'shockwave', 'progress');
+                               setBool(pl, 'shockwave', 'autostart');
+                               setBool(pl, 'shockwave', 'swliveconnect');
+                               setStr(pl, 'shockwave', 'swvolume');
+                               setStr(pl, 'shockwave', 'swstretchstyle');
+                               setStr(pl, 'shockwave', 'swstretchhalign');
+                               setStr(pl, 'shockwave', 'swstretchvalign');
+                       break;
+
+                       case "wmp":
+                               setBool(pl, 'wmp', 'autostart');
+                               setBool(pl, 'wmp', 'enabled');
+                               setBool(pl, 'wmp', 'enablecontextmenu');
+                               setBool(pl, 'wmp', 'fullscreen');
+                               setBool(pl, 'wmp', 'invokeurls');
+                               setBool(pl, 'wmp', 'mute');
+                               setBool(pl, 'wmp', 'stretchtofit');
+                               setBool(pl, 'wmp', 'windowlessvideo');
+                               setStr(pl, 'wmp', 'balance');
+                               setStr(pl, 'wmp', 'baseurl');
+                               setStr(pl, 'wmp', 'captioningid');
+                               setStr(pl, 'wmp', 'currentmarker');
+                               setStr(pl, 'wmp', 'currentposition');
+                               setStr(pl, 'wmp', 'defaultframe');
+                               setStr(pl, 'wmp', 'playcount');
+                               setStr(pl, 'wmp', 'rate');
+                               setStr(pl, 'wmp', 'uimode');
+                               setStr(pl, 'wmp', 'volume');
+                       break;
+
+                       case "rmp":
+                               setBool(pl, 'rmp', 'autostart');
+                               setBool(pl, 'rmp', 'loop');
+                               setBool(pl, 'rmp', 'autogotourl');
+                               setBool(pl, 'rmp', 'center');
+                               setBool(pl, 'rmp', 'imagestatus');
+                               setBool(pl, 'rmp', 'maintainaspect');
+                               setBool(pl, 'rmp', 'nojava');
+                               setBool(pl, 'rmp', 'prefetch');
+                               setBool(pl, 'rmp', 'shuffle');
+                               setStr(pl, 'rmp', 'console');
+                               setStr(pl, 'rmp', 'controls');
+                               setStr(pl, 'rmp', 'numloop');
+                               setStr(pl, 'rmp', 'scriptcallbacks');
+                       break;
+               }
+
+               setStr(pl, null, 'src');
+               setStr(pl, null, 'id');
+               setStr(pl, null, 'name');
+               setStr(pl, null, 'vspace');
+               setStr(pl, null, 'hspace');
+               setStr(pl, null, 'bgcolor');
+               setStr(pl, null, 'align');
+               setStr(pl, null, 'width');
+               setStr(pl, null, 'height');
+
+               if ((val = tinyMCE.getAttrib(fe, "width")) != "")
+                       pl.width = f.width.value = val;
+
+               if ((val = tinyMCE.getAttrib(fe, "height")) != "")
+                       pl.height = f.height.value = val;
+
+               oldWidth = pl.width ? parseInt(pl.width) : 0;
+               oldHeight = pl.height ? parseInt(pl.height) : 0;
+       } else
+               oldWidth = oldHeight = 0;
+
+       selectByValue(f, 'media_type', type);
+       changedType(type);
+       updateColor('bgcolor_pick', 'bgcolor');
+
+       TinyMCE_EditableSelects.init();
+       generatePreview();
+}
+
+function insertMedia() {
+       var fe, f = document.forms[0], h;
+
+       if (!AutoValidator.validate(f)) {
+               alert(tinyMCE.getLang('lang_invalid_data'));
+               return false;
+       }
+
+       f.width.value = f.width.value == "" ? 100 : f.width.value;
+       f.height.value = f.height.value == "" ? 100 : f.height.value;
+
+       fe = tinyMCE.selectedInstance.getFocusElement();
+       if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) {
+               switch (f.media_type.options[f.media_type.selectedIndex].value) {
+                       case "flash":
+                               fe.className = "mceItemFlash";
+                               break;
+
+                       case "shockwave":
+                               fe.className = "mceItemShockWave";
+                               break;
+
+                       case "qt":
+                               fe.className = "mceItemQuickTime";
+                               break;
+
+                       case "wmp":
+                               fe.className = "mceItemWindowsMedia";
+                               break;
+
+                       case "rmp":
+                               fe.className = "mceItemRealMedia";
+                               break;
+               }
+
+               if (fe.width != f.width.value || fe.height != f.height.height)
+                       tinyMCE.selectedInstance.repaint();
+
+               fe.title = serializeParameters();
+               fe.width = f.width.value;
+               fe.height = f.height.value;
+               fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : '');
+               fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : '');
+               fe.align = f.align.options[f.align.selectedIndex].value;
+       } else {
+               h = '<img src="' + tinyMCE.getParam("theme_href") + '/images/spacer.gif"' ;
+
+               switch (f.media_type.options[f.media_type.selectedIndex].value) {
+                       case "flash":
+                               h += ' class="mceItemFlash"';
+                               break;
+
+                       case "shockwave":
+                               h += ' class="mceItemShockWave"';
+                               break;
+
+                       case "qt":
+                               h += ' class="mceItemQuickTime"';
+                               break;
+
+                       case "wmp":
+                               h += ' class="mceItemWindowsMedia"';
+                               break;
+
+                       case "rmp":
+                               h += ' class="mceItemRealMedia"';
+                               break;
+               }
+
+               h += ' title="' + serializeParameters() + '"';
+               h += ' width="' + f.width.value + '"';
+               h += ' height="' + f.height.value + '"';
+               h += ' align="' + f.align.options[f.align.selectedIndex].value + '"';
+
+               h += ' />';
+
+               tinyMCE.selectedInstance.execCommand('mceInsertContent', false, h);
+       }
+
+       tinyMCEPopup.close();
+}
+
+function getMediaListHTML() {
+       if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) {
+               var html = "";
+
+               html += '<select id="linklist" name="linklist" style="width: 250px" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.src.value=this.options[this.selectedIndex].value;">';
+               html += '<option value="">---</option>';
+
+               for (var i=0; i<tinyMCEMediaList.length; i++)
+                       html += '<option value="' + tinyMCEMediaList[i][1] + '">' + tinyMCEMediaList[i][0] + '</option>';
+
+               html += '</select>';
+
+               return html;
+       }
+
+       return "";
+}
+
+function getType(v) {
+       var fo, i, c, el, x, f = document.forms[0];
+
+       fo = tinyMCE.getParam("media_types", "flash=swf;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';');
+
+       // YouTube
+       if (v.indexOf('http://www.youtube.com/watch?v=') == 0 || v.indexOf('http://youtube.com/watch?v=') == 0) {
+               f.width.value = '425';
+               f.height.value = '350';
+
+               v = v.replace('http://youtube.com/watch?v=', '');
+               v = v.replace('http://www.youtube.com/watch?v=', '');
+
+               f.src.value = 'http://www.youtube.com/v/' + v;
+               return 'flash';
+       }
+
+       // Google video
+       if (v.indexOf('http://video.google.com/videoplay?docid=') == 0) {
+               f.width.value = '425';
+               f.height.value = '326';
+               f.src.value = 'http://video.google.com/googleplayer.swf?docId=' + v.substring('http://video.google.com/videoplay?docid='.length) + '&hl=en';
+               return 'flash';
+       }
+
+       for (i=0; i<fo.length; i++) {
+               c = fo[i].split('=');
+
+               el = c[1].split(',');
+               for (x=0; x<el.length; x++)
+               if (v.indexOf('.' + el[x]) != -1)
+                       return c[0];
+       }
+
+       return null;
+}
+
+function switchType(v) {
+       var t = getType(v), d = document, f = d.forms[0];
+
+       if (!t)
+               return;
+
+       selectByValue(d.forms[0], 'media_type', t);
+       changedType(t);
+
+       // Update qtsrc also
+       if (t == 'qt' && f.src.value.toLowerCase().indexOf('rtsp://') != -1) {
+               alert(tinyMCE.getLang("lang_media_qt_stream_warn"));
+
+               if (f.qt_qtsrc.value == '')
+                       f.qt_qtsrc.value = f.src.value;
+       }
+}
+
+function changedType(t) {
+       var d = document;
+
+       d.getElementById('flash_options').style.display = 'none';
+       d.getElementById('qt_options').style.display = 'none';
+       d.getElementById('shockwave_options').style.display = 'none';
+       d.getElementById('wmp_options').style.display = 'none';
+       d.getElementById('rmp_options').style.display = 'none';
+       d.getElementById(t + '_options').style.display = 'block';
+}
+
+function serializeParameters() {
+       var d = document, f = d.forms[0], s = '';
+
+       switch (f.media_type.options[f.media_type.selectedIndex].value) {
+               case "flash":
+                       s += getBool('flash', 'play', true);
+                       s += getBool('flash', 'loop', true);
+                       s += getBool('flash', 'menu', true);
+                       s += getBool('flash', 'swliveconnect', false);
+                       s += getStr('flash', 'quality');
+                       s += getStr('flash', 'scale');
+                       s += getStr('flash', 'salign');
+                       s += getStr('flash', 'wmode');
+                       s += getStr('flash', 'base');
+                       s += getStr('flash', 'flashvars');
+               break;
+
+               case "qt":
+                       s += getBool('qt', 'loop', false);
+                       s += getBool('qt', 'autoplay', true);
+                       s += getBool('qt', 'cache', false);
+                       s += getBool('qt', 'controller', true);
+                       s += getBool('qt', 'correction', false, 'none', 'full');
+                       s += getBool('qt', 'enablejavascript', false);
+                       s += getBool('qt', 'kioskmode', false);
+                       s += getBool('qt', 'autohref', false);
+                       s += getBool('qt', 'playeveryframe', false);
+                       s += getBool('qt', 'targetcache', false);
+                       s += getStr('qt', 'scale');
+                       s += getStr('qt', 'starttime');
+                       s += getStr('qt', 'endtime');
+                       s += getStr('qt', 'target');
+                       s += getStr('qt', 'qtsrcchokespeed');
+                       s += getStr('qt', 'volume');
+                       s += getStr('qt', 'qtsrc');
+               break;
+
+               case "shockwave":
+                       s += getBool('shockwave', 'sound');
+                       s += getBool('shockwave', 'progress');
+                       s += getBool('shockwave', 'autostart');
+                       s += getBool('shockwave', 'swliveconnect');
+                       s += getStr('shockwave', 'swvolume');
+                       s += getStr('shockwave', 'swstretchstyle');
+                       s += getStr('shockwave', 'swstretchhalign');
+                       s += getStr('shockwave', 'swstretchvalign');
+               break;
+
+               case "wmp":
+                       s += getBool('wmp', 'autostart', true);
+                       s += getBool('wmp', 'enabled', false);
+                       s += getBool('wmp', 'enablecontextmenu', true);
+                       s += getBool('wmp', 'fullscreen', false);
+                       s += getBool('wmp', 'invokeurls', true);
+                       s += getBool('wmp', 'mute', false);
+                       s += getBool('wmp', 'stretchtofit', false);
+                       s += getBool('wmp', 'windowlessvideo', false);
+                       s += getStr('wmp', 'balance');
+                       s += getStr('wmp', 'baseurl');
+                       s += getStr('wmp', 'captioningid');
+                       s += getStr('wmp', 'currentmarker');
+                       s += getStr('wmp', 'currentposition');
+                       s += getStr('wmp', 'defaultframe');
+                       s += getStr('wmp', 'playcount');
+                       s += getStr('wmp', 'rate');
+                       s += getStr('wmp', 'uimode');
+                       s += getStr('wmp', 'volume');
+               break;
+
+               case "rmp":
+                       s += getBool('rmp', 'autostart', false);
+                       s += getBool('rmp', 'loop', false);
+                       s += getBool('rmp', 'autogotourl', true);
+                       s += getBool('rmp', 'center', false);
+                       s += getBool('rmp', 'imagestatus', true);
+                       s += getBool('rmp', 'maintainaspect', false);
+                       s += getBool('rmp', 'nojava', false);
+                       s += getBool('rmp', 'prefetch', false);
+                       s += getBool('rmp', 'shuffle', false);
+                       s += getStr('rmp', 'console');
+                       s += getStr('rmp', 'controls');
+                       s += getStr('rmp', 'numloop');
+                       s += getStr('rmp', 'scriptcallbacks');
+               break;
+       }
+
+       s += getStr(null, 'id');
+       s += getStr(null, 'name');
+       s += getStr(null, 'src');
+       s += getStr(null, 'align');
+       s += getStr(null, 'bgcolor');
+       s += getInt(null, 'vspace');
+       s += getInt(null, 'hspace');
+       s += getStr(null, 'width');
+       s += getStr(null, 'height');
+
+       s = s.length > 0 ? s.substring(0, s.length - 1) : s;
+
+       return s;
+}
+
+function setBool(pl, p, n) {
+       if (typeof(pl[n]) == "undefined")
+               return;
+
+       document.forms[0].elements[p + "_" + n].checked = pl[n];
+}
+
+function setStr(pl, p, n) {
+       var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n];
+
+       if (typeof(pl[n]) == "undefined")
+               return;
+
+       if (e.type == "text")
+               e.value = pl[n];
+       else
+               selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]);
+}
+
+function getBool(p, n, d, tv, fv) {
+       var v = document.forms[0].elements[p + "_" + n].checked;
+
+       tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'";
+       fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'";
+
+       return (v == d) ? '' : n + (v ? ':' + tv + ',' : ':' + fv + ',');
+}
+
+function getStr(p, n, d) {
+       var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];
+       var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;
+
+       return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',");
+}
+
+function getInt(p, n, d) {
+       var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];
+       var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;
+
+       return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ",");
+}
+
+function jsEncode(s) {
+       s = s.replace(new RegExp('\\\\', 'g'), '\\\\');
+       s = s.replace(new RegExp('"', 'g'), '\\"');
+       s = s.replace(new RegExp("'", 'g'), "\\'");
+
+       return s;
+}
+
+function generatePreview(c) {
+       var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh;
+
+       p.innerHTML = '<!-- x --->';
+
+       nw = parseInt(f.width.value);
+       nh = parseInt(f.height.value);
+
+       if (f.width.value != "" && f.height.value != "") {
+               if (f.constrain.checked) {
+                       if (c == 'width' && oldWidth != 0) {
+                               wp = nw / oldWidth;
+                               nh = Math.round(wp * nh);
+                               f.height.value = nh;
+                       } else if (c == 'height' && oldHeight != 0) {
+                               hp = nh / oldHeight;
+                               nw = Math.round(hp * nw);
+                               f.width.value = nw;
+                       }
+               }
+       }
+
+       if (f.width.value != "")
+               oldWidth = nw;
+
+       if (f.height.value != "")
+               oldHeight = nh;
+
+       // After constrain
+       pl = serializeParameters();
+
+       switch (f.media_type.options[f.media_type.selectedIndex].value) {
+               case "flash":
+                       cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
+                       codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';
+                       type = 'application/x-shockwave-flash';
+                       break;
+
+               case "shockwave":
+                       cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000';
+                       codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';
+                       type = 'application/x-director';
+                       break;
+
+               case "qt":
+                       cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';
+                       codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';
+                       type = 'video/quicktime';
+                       break;
+
+               case "wmp":
+                       cls = tinyMCE.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6';
+                       codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';
+                       type = 'application/x-mplayer2';
+                       break;
+
+               case "rmp":
+                       cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';
+                       codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';
+                       type = 'audio/x-pn-realaudio-plugin';
+                       break;
+       }
+
+       if (pl == '') {
+               p.innerHTML = '';
+               return;
+       }
+
+       pl = eval('x={' + pl + '};');
+
+       if (!pl.src) {
+               p.innerHTML = '';
+               return;
+       }
+
+       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);
+       pl.width = !pl.width ? 100 : pl.width;
+       pl.height = !pl.height ? 100 : pl.height;
+       pl.id = !pl.id ? 'obj' : pl.id;
+       pl.name = !pl.name ? 'eobj' : pl.name;
+       pl.align = !pl.align ? '' : pl.align;
+
+       h += '<object classid="clsid:' + cls + '" codebase="' + codebase + '" width="' + pl.width + '" height="' + pl.height + '" id="' + pl.id + '" name="' + pl.name + '" align="' + pl.align + '">';
+
+       for (n in pl) {
+               h += '<param name="' + n + '" value="' + pl[n] + '">';
+
+               // Add extra url parameter if it's an absolute URL
+               if (n == 'src' && pl[n].indexOf('://') != -1)
+                       h += '<param name="url" value="' + pl[n] + '" />';
+       }
+
+       h += '<embed type="' + type + '" ';
+
+       for (n in pl)
+               h += n + '="' + pl[n] + '" ';
+
+       h += '></embed></object>';
+
+       p.innerHTML = "<!-- x --->" + h;
+}
index ced1967254408506da9bf38458736ee56e861df5..177438d7c0ff69fa01365653e53fd9b15d46d36a 100644 (file)
@@ -1,94 +1,94 @@
-// UK lang variables\r
-\r
-tinyMCE.addToLang('media',{\r
-title : 'Insert / edit embedded media',\r
-desc : 'Insert / edit embedded media',\r
-general : 'General',\r
-advanced : 'Advanced',\r
-file : 'File/URL',\r
-list : 'List',\r
-size : 'Dimensions',\r
-preview : 'Preview',\r
-constrain_proportions : 'Constrain proportions',\r
-type : 'Type',\r
-id : 'Id',\r
-name : 'Name',\r
-class_name : 'Class',\r
-vspace : 'V-Space',\r
-hspace : 'H-Space',\r
-play : 'Auto play',\r
-loop : 'Loop',\r
-menu : 'Show menu',\r
-quality : 'Quality',\r
-scale : 'Scale',\r
-align : 'Align',\r
-salign : 'SAlign',\r
-wmode : 'WMode',\r
-bgcolor : 'Background',\r
-base : 'Base',\r
-flashvars : 'Flashvars',\r
-liveconnect : 'SWLiveConnect',\r
-autohref : 'AutoHREF',\r
-cache : 'Cache',\r
-hidden : 'Hidden',\r
-controller : 'Controller',\r
-kioskmode : 'Kiosk mode',\r
-playeveryframe : 'Play every frame',\r
-targetcache : 'Target cache',\r
-correction : 'No correction',\r
-enablejavascript : 'Enable JavaScript',\r
-starttime : 'Start time',\r
-endtime : 'End time',\r
-href : 'Href',\r
-qtsrcchokespeed : 'Choke speed',\r
-target : 'Target',\r
-volume : 'Volume',\r
-autostart : 'Auto start',\r
-enabled : 'Enabled',\r
-fullscreen : 'Fullscreen',\r
-invokeurls : 'Invoke URLs',\r
-mute : 'Mute',\r
-stretchtofit : 'Stretch to fit',\r
-windowlessvideo : 'Windowless video',\r
-balance : 'Balance',\r
-baseurl : 'Base URL',\r
-captioningid : 'Captioning id',\r
-currentmarker : 'Current marker',\r
-currentposition : 'Current position',\r
-defaultframe : 'Default frame',\r
-playcount : 'Play count',\r
-rate : 'Rate',\r
-uimode : 'UI Mode',\r
-flash_options : 'Flash options',\r
-qt_options : 'Quicktime options',\r
-wmp_options : 'Windows media player options',\r
-rmp_options : 'Real media player options',\r
-shockwave_options : 'Shockwave options',\r
-autogotourl : 'Auto goto URL',\r
-center : 'Center',\r
-imagestatus : 'Image status',\r
-maintainaspect : 'Maintain aspect',\r
-nojava : 'No java',\r
-prefetch : 'Prefetch',\r
-shuffle : 'Shuffle',\r
-console : 'Console',\r
-numloop : 'Num loops',\r
-controls : 'Controls',\r
-scriptcallbacks : 'Script callbacks',\r
-swstretchstyle : 'Stretch style',\r
-swstretchhalign : 'Stretch H-Align',\r
-swstretchvalign : 'Stretch V-Align',\r
-sound : 'Sound',\r
-progress : 'Progress',\r
-qtsrc : 'QT Src',\r
-qt_stream_warn : 'Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..',\r
-align_top : 'Top',\r
-align_right : 'Right',\r
-align_bottom : 'Bottom',\r
-align_left : 'Left',\r
-align_center : 'Center',\r
-align_top_left : 'Top left',\r
-align_top_right : 'Top right',\r
-align_bottom_left : 'Bottom left',\r
-align_bottom_right : 'Bottom right'\r
+// UK lang variables
+
+tinyMCE.addToLang('media',{
+title : 'Insert / edit embedded media',
+desc : 'Insert / edit embedded media',
+general : 'General',
+advanced : 'Advanced',
+file : 'File/URL',
+list : 'List',
+size : 'Dimensions',
+preview : 'Preview',
+constrain_proportions : 'Constrain proportions',
+type : 'Type',
+id : 'Id',
+name : 'Name',
+class_name : 'Class',
+vspace : 'V-Space',
+hspace : 'H-Space',
+play : 'Auto play',
+loop : 'Loop',
+menu : 'Show menu',
+quality : 'Quality',
+scale : 'Scale',
+align : 'Align',
+salign : 'SAlign',
+wmode : 'WMode',
+bgcolor : 'Background',
+base : 'Base',
+flashvars : 'Flashvars',
+liveconnect : 'SWLiveConnect',
+autohref : 'AutoHREF',
+cache : 'Cache',
+hidden : 'Hidden',
+controller : 'Controller',
+kioskmode : 'Kiosk mode',
+playeveryframe : 'Play every frame',
+targetcache : 'Target cache',
+correction : 'No correction',
+enablejavascript : 'Enable JavaScript',
+starttime : 'Start time',
+endtime : 'End time',
+href : 'Href',
+qtsrcchokespeed : 'Choke speed',
+target : 'Target',
+volume : 'Volume',
+autostart : 'Auto start',
+enabled : 'Enabled',
+fullscreen : 'Fullscreen',
+invokeurls : 'Invoke URLs',
+mute : 'Mute',
+stretchtofit : 'Stretch to fit',
+windowlessvideo : 'Windowless video',
+balance : 'Balance',
+baseurl : 'Base URL',
+captioningid : 'Captioning id',
+currentmarker : 'Current marker',
+currentposition : 'Current position',
+defaultframe : 'Default frame',
+playcount : 'Play count',
+rate : 'Rate',
+uimode : 'UI Mode',
+flash_options : 'Flash options',
+qt_options : 'Quicktime options',
+wmp_options : 'Windows media player options',
+rmp_options : 'Real media player options',
+shockwave_options : 'Shockwave options',
+autogotourl : 'Auto goto URL',
+center : 'Center',
+imagestatus : 'Image status',
+maintainaspect : 'Maintain aspect',
+nojava : 'No java',
+prefetch : 'Prefetch',
+shuffle : 'Shuffle',
+console : 'Console',
+numloop : 'Num loops',
+controls : 'Controls',
+scriptcallbacks : 'Script callbacks',
+swstretchstyle : 'Stretch style',
+swstretchhalign : 'Stretch H-Align',
+swstretchvalign : 'Stretch V-Align',
+sound : 'Sound',
+progress : 'Progress',
+qtsrc : 'QT Src',
+qt_stream_warn : 'Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..',
+align_top : 'Top',
+align_right : 'Right',
+align_bottom : 'Bottom',
+align_left : 'Left',
+align_center : 'Center',
+align_top_left : 'Top left',
+align_top_right : 'Top right',
+align_bottom_left : 'Bottom left',
+align_bottom_right : 'Bottom right'
 });
\ No newline at end of file
index 97b7cdca541334714402841a460826578c1d4453..2b1ef80e3ebd166d3d388221dc485e5f4a165a66 100644 (file)
@@ -31,7 +31,7 @@
                                                                        <select id="media_type" name="media_type" onchange="changedType(this.value);generatePreview();">\r
                                                                                <option value="flash">Flash</option>\r
                                                                                <option value="qt">Quicktime</option>\r
-                                                                               <option value="shockwave">Shockware</option>\r
+                                                                               <option value="shockwave">Shockwave</option>\r
                                                                                <option value="wmp">Windows Media</option>\r
                                                                                <option value="rmp">Real Media</option>\r
                                                                        </select>\r
index b694fdb6bff706e1ff73c677c9682d6c14d3ec01..9192b26a5a0c1e198a3027082a2da00b512e01cc 100644 (file)
@@ -1 +1 @@
-This is the location you place TinyMCE plugins.\r
+This is the location you place TinyMCE plugins.
index a067ecdfedbc8a1140bec2ec0d3b2c24e6ceb8fc..a47cc1a1efef90071555ae700a4b51ba9bd02980 100644 (file)
@@ -1,17 +1,17 @@
-/* CSS file for cell dialog in the table plugin */\r
-\r
-.panel_wrapper div.current {\r
-       height: 200px;\r
-}\r
-\r
-.advfield {\r
-       width: 200px;\r
-}\r
-\r
-#action {\r
-       margin-bottom: 3px;\r
-}\r
-\r
-#class {\r
-       width: 150px;\r
+/* CSS file for cell dialog in the table plugin */
+
+.panel_wrapper div.current {
+       height: 200px;
+}
+
+.advfield {
+       width: 200px;
+}
+
+#action {
+       margin-bottom: 3px;
+}
+
+#class {
+       width: 150px;
 }
\ No newline at end of file
index 1f7755dafa8eb34a1604c80fa4a92a7626b8bc2b..0e397db3e25fcd65e36317bf37d28bafa09d00b8 100644 (file)
@@ -1,25 +1,25 @@
-/* CSS file for row dialog in the table plugin */\r
-\r
-.panel_wrapper div.current {\r
-       height: 200px;\r
-}\r
-\r
-.advfield {\r
-       width: 200px;\r
-}\r
-\r
-#action {\r
-       margin-bottom: 3px;\r
-}\r
-\r
-#rowtype,#align,#valign,#class,#height {\r
-       width: 150px;\r
-}\r
-\r
-#height {\r
-       width: 50px;    \r
-}\r
-\r
-.col2 {\r
-       padding-left: 20px;\r
-}\r
+/* 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;
+}
index 804f766eed669449c56f6218aef6ee2f68e72399..82bb548ca90055efef7fb5e1f882940773fc3138 100644 (file)
@@ -1,13 +1,13 @@
-/* CSS file for table dialog in the table plugin */\r
-\r
-.panel_wrapper div.current {\r
-       height: 220px;\r
-}\r
-\r
-.advfield {\r
-       width: 200px;\r
-}\r
-\r
-#class {\r
-       width: 150px;\r
-}\r
+/* CSS file for table dialog in the table plugin */
+
+.panel_wrapper div.current {
+       height: 220px;
+}
+
+.advfield {
+       width: 200px;
+}
+
+#class {
+       width: 150px;
+}
index 6c722db3b49e6fb6b16734d68aa1ab83227a9cbb..f4841873324e1ccfcc9a7538920bcaddaedf4f21 100644 (file)
@@ -62,7 +62,7 @@
                                                          </tr>\r
                                                          <tr>\r
                                                                <td class="column1"><label for="caption">{$lang_table_caption}</label></td> \r
-                                                               <td><input id="caption" name="caption" type="checkbox" value="true" /></td> \r
+                                                               <td><input id="caption" name="caption" type="checkbox" class="checkbox" value="true" /></td> \r
                                                          </tr>\r
                                                        </table>\r
                                </fieldset>\r
diff --git a/program/js/tiny_mce/themes/advanced/css/editor_popup.css b/program/js/tiny_mce/themes/advanced/css/editor_popup.css
new file mode 100644 (file)
index 0000000..f8d3550
--- /dev/null
@@ -0,0 +1,331 @@
+/* This file contains the CSS data for all popups in TinyMCE */\r
+\r
+body {\r
+       background-color: #F0F0EE;\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5;\r
+       margin: 8px;\r
+}\r
+\r
+td {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+}\r
+\r
+input {\r
+       background: #FFFFFF;\r
+       border: 1px solid #cccccc;\r
+}\r
+\r
+td, input, select, textarea {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+input, select, textarea {\r
+       border: 1px solid #808080;\r
+}\r
+\r
+.input_noborder {\r
+       border: 0;\r
+}\r
+\r
+#insert, .updateButton {\r
+   font-weight: bold;\r
+   width: 90px;\r
+   height: 21px;\r
+   border: 0;\r
+   background-image: url('../images/insert_button_bg.gif');\r
+   cursor: pointer;\r
+}\r
+\r
+#cancel {\r
+   font-weight: bold;\r
+   width: 90px;\r
+   height: 21px;\r
+   border: 0;\r
+   background-image: url('../images/cancel_button_bg.gif');\r
+   cursor: pointer;\r
+}\r
+\r
+/* Mozilla only style */\r
+html>body #insert, html>body #cancel {\r
+       padding-bottom: 2px;\r
+}\r
+\r
+.title {\r
+       font-size: 12px;\r
+       font-weight: bold;\r
+       color: #2B6FB6;\r
+}\r
+\r
+table.charmap {\r
+       border-style: solid;\r
+       border-width: 1px;\r
+       border-color: #AAAAAA;\r
+}\r
+\r
+td.charmap, td.charmapOver {\r
+       color: #000000;\r
+       border-color: #AAAAAA;\r
+       border-style: solid;\r
+       border-width: 1px;\r
+       text-align: center;\r
+       font-size: 12px;\r
+}\r
+\r
+td.charmapOver {\r
+       background-color: #CCCCCC;\r
+       cursor: default;\r
+}\r
+\r
+a.charmap {\r
+       color: #000000;\r
+       text-decoration: none\r
+}\r
+\r
+.wordWrapCode {\r
+       vertical-align: middle;\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+}\r
+\r
+input.radio {\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+       vertical-align: middle;\r
+}\r
+\r
+input.checkbox {\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+       vertical-align: middle;\r
+}\r
+\r
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {\r
+       margin-left: 1px;\r
+}\r
+\r
+.mceButtonNormal {\r
+       border-top: 1px solid;\r
+       border-left: 1px solid;\r
+       border-bottom: 1px solid;\r
+       border-right: 1px solid;\r
+       border-color: #F0F0EE;\r
+       cursor: default;\r
+}\r
+\r
+.mceButtonOver {\r
+       border: 1px solid #0A246A;\r
+       cursor: default;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.mceButtonDown {\r
+       cursor: default;\r
+       border: 1px solid #0A246A;\r
+       background-color: #8592B5;\r
+}\r
+\r
+.mceButtonDisabled {\r
+       filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);\r
+       -moz-opacity:0.3;\r
+       opacity: 0.3;\r
+       border-top: 1px solid;\r
+       border-left: 1px solid;\r
+       border-bottom: 1px solid;\r
+       border-right: 1px solid;\r
+       border-color: #F0F0EE;\r
+       cursor: default;\r
+}\r
+\r
+.mceActionPanel {\r
+       margin-top: 5px;\r
+}\r
+\r
+/* Tabs classes */\r
+\r
+.tabs {\r
+       float: left;\r
+       width: 100%;\r
+       line-height: normal;\r
+       background-image: url("../images/xp/tabs_bg.gif");\r
+}\r
+\r
+.tabs ul {\r
+       margin: 0;\r
+       padding: 0 0 0;\r
+       list-style: none;\r
+}\r
+\r
+.tabs li {\r
+       float: left;\r
+       background: url("../images/xp/tab_bg.gif") no-repeat left top;\r
+       margin: 0;\r
+       margin-left: 0;\r
+       margin-right: 2px;\r
+       padding: 0 0 0 10px;\r
+       line-height: 18px;\r
+}\r
+\r
+.tabs li.current {\r
+       background: url("../images/xp/tab_sel_bg.gif") no-repeat left top;\r
+       margin-right: 2px;\r
+}\r
+\r
+.tabs span {\r
+       float: left;\r
+       display: block;\r
+       background: url("../images/xp/tab_end.gif") no-repeat right top;\r
+       padding: 0px 10px 0 0;\r
+}\r
+\r
+.tabs .current span {\r
+       background: url("../images/xp/tab_sel_end.gif") no-repeat right top;\r
+}\r
+\r
+.tabs a {\r
+       text-decoration: none;\r
+       font-family: Verdana, Arial;\r
+       font-size: 10px;\r
+}\r
+\r
+.tabs a:link, .tabs a:visited, .tabs a:hover {\r
+       color: black;\r
+}\r
+\r
+.tabs a:hover {\r
+}\r
+\r
+.tabs .current {\r
+}\r
+\r
+.tabs .current a, .tabs .current a:link, .tabs .current a:visited {\r
+}\r
+\r
+.panel_wrapper div.panel {\r
+       display: none;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       display: block;\r
+       width: 100%;\r
+       height: 300px;\r
+       overflow: visible; /* Should be auto but that breaks Safari */\r
+}\r
+\r
+.panel_wrapper {\r
+       border: 1px solid #919B9C;\r
+       border-top: 0px;\r
+       padding: 10px;\r
+       padding-top: 5px;\r
+       clear: both;\r
+       background-color: white;\r
+}\r
+\r
+fieldset {\r
+       border: 1px solid #919B9C;\r
+       font-family: Verdana, Arial;\r
+       font-size: 10px;\r
+       padding: 0;\r
+       margin: 0;\r
+       padding: 4px;\r
+}\r
+\r
+legend {\r
+       color: #2B6FB6;\r
+       font-weight: bold;\r
+}\r
+\r
+.properties {\r
+       width: 100%;\r
+}\r
+\r
+.properties .column1 {\r
+}\r
+\r
+.properties .column2 {\r
+       text-align: left;\r
+}\r
+\r
+a:link, a:visited {\r
+       color: black;\r
+}\r
+\r
+a:hover {\r
+       color: #2B6FB6;\r
+}\r
+\r
+#plugintable thead {\r
+       font-weight: bold;\r
+       background-color: #DDDDDD;\r
+}\r
+\r
+#plugintable, #about #plugintable td {\r
+       border: 1px solid #919B9C;\r
+}\r
+\r
+#plugintable {\r
+       width: 99%;\r
+       margin-top: 10px;\r
+}\r
+\r
+#pluginscontainer {\r
+       height: 290px;\r
+       overflow: auto;\r
+}\r
+\r
+/* MSIE Specific styles */\r
+\r
+* html .panel_wrapper {\r
+       width: 100%;\r
+}\r
+\r
+.column {\r
+       float: left;\r
+}\r
+\r
+h1, h2, h3, h4 {\r
+       color: #2B6FB6;\r
+       margin: 0;\r
+       padding: 0;\r
+       padding-top: 5px;\r
+}\r
+\r
+h3 {\r
+       font-size: 14px;\r
+}\r
+\r
+#link .panel_wrapper, #link div.current {\r
+       height: 125px;\r
+}\r
+\r
+#image .panel_wrapper, #image div.current {\r
+       height: 190px;\r
+}\r
+\r
+label.msg { display: none; }\r
+label.invalid { color: #EE0000; display: inline; }\r
+input.invalid { border: 1px solid #EE0000; }\r
+\r
+/* Disables the advanced tab in the table plugin. */\r
+/*\r
+#table #advanced_tab {\r
+       display: none;\r
+}\r
+*/\r
+\r
+/* Disables the border input field and label in the table plugin. */\r
+/*\r
+#table #border, #table #borderlabel {\r
+       display: none;\r
+}\r
+*/\r
index 6e781d782d0c0f93d848ebf96cf0f8528bf2d240..7697f19453022fc0a919a74a9c947ecf0a552710 100644 (file)
@@ -1 +1 @@
-tinyMCE.importThemeLanguagePack('advanced');var TinyMCE_AdvancedTheme={_defColors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",_autoImportCSSClasses:true,_resizer:{},_buttons:[['bold','{$lang_bold_img}','lang_bold_desc','Bold'],['italic','{$lang_italic_img}','lang_italic_desc','Italic'],['underline','{$lang_underline_img}','lang_underline_desc','Underline'],['strikethrough','strikethrough.gif','lang_striketrough_desc','Strikethrough'],['justifyleft','justifyleft.gif','lang_justifyleft_desc','JustifyLeft'],['justifycenter','justifycenter.gif','lang_justifycenter_desc','JustifyCenter'],['justifyright','justifyright.gif','lang_justifyright_desc','JustifyRight'],['justifyfull','justifyfull.gif','lang_justifyfull_desc','JustifyFull'],['bullist','bullist.gif','lang_bullist_desc','InsertUnorderedList'],['numlist','numlist.gif','lang_numlist_desc','InsertOrderedList'],['outdent','outdent.gif','lang_outdent_desc','Outdent'],['indent','indent.gif','lang_indent_desc','Indent'],['cut','cut.gif','lang_cut_desc','Cut'],['copy','copy.gif','lang_copy_desc','Copy'],['paste','paste.gif','lang_paste_desc','Paste'],['undo','undo.gif','lang_undo_desc','Undo'],['redo','redo.gif','lang_redo_desc','Redo'],['link','link.gif','lang_link_desc','mceLink',true],['unlink','unlink.gif','lang_unlink_desc','unlink'],['image','image.gif','lang_image_desc','mceImage',true],['cleanup','cleanup.gif','lang_cleanup_desc','mceCleanup'],['help','help.gif','lang_help_desc','mceHelp'],['code','code.gif','lang_theme_code_desc','mceCodeEditor'],['hr','hr.gif','lang_theme_hr_desc','inserthorizontalrule'],['removeformat','removeformat.gif','lang_theme_removeformat_desc','removeformat'],['sub','sub.gif','lang_theme_sub_desc','subscript'],['sup','sup.gif','lang_theme_sup_desc','superscript'],['forecolor','forecolor.gif','lang_theme_forecolor_desc','forecolor',true],['forecolorpicker','forecolor.gif','lang_theme_forecolor_desc','forecolorpicker',true],['backcolor','backcolor.gif','lang_theme_backcolor_desc','HiliteColor',true],['backcolorpicker','backcolor.gif','lang_theme_backcolor_desc','backcolorpicker',true],['charmap','charmap.gif','lang_theme_charmap_desc','mceCharMap'],['visualaid','visualaid.gif','lang_theme_visualaid_desc','mceToggleVisualAid'],['anchor','anchor.gif','lang_theme_anchor_desc','mceInsertAnchor'],['newdocument','newdocument.gif','lang_newdocument_desc','mceNewDocument']],_buttonMap:'anchor,backcolor,bold,bullist,charmap,cleanup,code,copy,cut,forecolor,help,hr,image,indent,italic,justifycenter,justifyfull,justifyleft,justifyright,link,newdocument,numlist,outdent,paste,redo,removeformat,strikethrough,sub,sup,underline,undo,unlink,visualaid,advhr,ltr,rtl,emotions,flash,fullpage,fullscreen,iespell,insertdate,inserttime,pastetext,pasteword,selectall,preview,print,save,replace,search,table,cell_props,delete_col,delete_row,col_after,col_before,row_after,row_before,merge_cells,row_props,split_cells,delete_table',getControlHTML:function(button_name){var i,x,but;for(i=0;i<TinyMCE_AdvancedTheme._buttons.length;i++){but=TinyMCE_AdvancedTheme._buttons[i];if(but[0]==button_name&&(button_name=="forecolor"||button_name=="backcolor"))return tinyMCE.getMenuButtonHTML(but[0],but[2],'{$themeurl}/images/'+but[1],but[3]+"Menu",but[3],(but.length>4?but[4]:false),(but.length>5?but[5]:null));if(but[0]==button_name)return tinyMCE.getButtonHTML(but[0],but[2],'{$themeurl}/images/'+but[1],but[3],(but.length>4?but[4]:false),(but.length>5?but[5]:null))}switch(button_name){case"formatselect":var html='<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';var formats=tinyMCE.getParam("theme_advanced_blockformats","p,address,pre,h1,h2,h3,h4,h5,h6",true).split(',');var lookup=[['p','{$lang_theme_paragraph}'],['address','{$lang_theme_address}'],['pre','{$lang_theme_pre}'],['h1','{$lang_theme_h1}'],['h2','{$lang_theme_h2}'],['h3','{$lang_theme_h3}'],['h4','{$lang_theme_h4}'],['h5','{$lang_theme_h5}'],['h6','{$lang_theme_h6}'],['div','{$lang_theme_div}'],['blockquote','{$lang_theme_blockquote}'],['code','{$lang_theme_code}'],['dt','{$lang_theme_dt}'],['dd','{$lang_theme_dd}'],['samp','{$lang_theme_samp}']];html+='<option value="">{$lang_theme_block}</option>';for(var i=0;i<formats.length;i++){for(var x=0;x<lookup.length;x++){if(formats[i]==lookup[x][0])html+='<option value="&lt;'+lookup[x][0]+'&gt;">'+lookup[x][1]+'</option>'}}html+='</select>';return html;case"styleselect":return'<select id="{$editor_id}_styleSelect" onmousedown="tinyMCE.themes.advanced._setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event,this,window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';case"fontselect":var fontHTML='<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';var iFonts='Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';var nFonts='Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sand;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';var fonts=tinyMCE.getParam("theme_advanced_fonts",nFonts).split(';');for(i=0;i<fonts.length;i++){if(fonts[i]!=''){var parts=fonts[i].split('=');fontHTML+='<option value="'+parts[1]+'">'+parts[0]+'</option>'}}fontHTML+='</select>';return fontHTML;case"fontsizeselect":return'<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+'<option value="0">{$lang_theme_font_size}</option>'+'<option value="1">1 (8 pt)</option>'+'<option value="2">2 (10 pt)</option>'+'<option value="3">3 (12 pt)</option>'+'<option value="4">4 (14 pt)</option>'+'<option value="5">5 (18 pt)</option>'+'<option value="6">6 (24 pt)</option>'+'<option value="7">7 (36 pt)</option>'+'</select>';case"|":case"separator":return'<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" alt="" />';case"spacer":return'<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" alt="" />';case"rowseparator":return'<br />'}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case'mceHelp':tinyMCE.openWindow({file:'about.htm',width:480,height:380},{tinymce_version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion,tinymce_releasedate:tinyMCE.releaseDate,inline:"yes"});return true;case"mceLink":var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();var selectedText="";if(tinyMCE.isMSIE){var rng=doc.selection.createRange();selectedText=rng.text}else selectedText=inst.getSel().toString();if(!tinyMCE.linkElement){if((tinyMCE.selectedElement.nodeName.toLowerCase()!="img")&&(selectedText.length<=0))return true}var href="",target="",title="",onclick="",action="insert",style_class="";if(tinyMCE.selectedElement.nodeName.toLowerCase()=="a")tinyMCE.linkElement=tinyMCE.selectedElement;if(tinyMCE.linkElement!=null&&tinyMCE.getAttrib(tinyMCE.linkElement,'href')=="")tinyMCE.linkElement=null;if(tinyMCE.linkElement){href=tinyMCE.getAttrib(tinyMCE.linkElement,'href');target=tinyMCE.getAttrib(tinyMCE.linkElement,'target');title=tinyMCE.getAttrib(tinyMCE.linkElement,'title');onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');style_class=tinyMCE.getAttrib(tinyMCE.linkElement,'class');if(onclick=="")onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');onclick=tinyMCE.cleanupEventStr(onclick);href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);");mceRealHref=tinyMCE.getAttrib(tinyMCE.linkElement,'mce_href');if(mceRealHref!=""){href=mceRealHref;if(tinyMCE.getParam('convert_urls'))href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);")}action="update"}var template=new Array();template['file']='link.htm';template['width']=310;template['height']=200;template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);if(inst.settings['insertlink_callback']){var returnVal=eval(inst.settings['insertlink_callback']+"(href, target, title, onclick, action, style_class);");if(returnVal&&returnVal['href'])TinyMCE_AdvancedTheme._insertLink(returnVal['href'],returnVal['target'],returnVal['title'],returnVal['onclick'],returnVal['style_class'])}else{tinyMCE.openWindow(template,{href:href,target:target,title:title,onclick:onclick,action:action,className:style_class,inline:"yes"})}return true;case"mceImage":var src="",alt="",border="",hspace="",vspace="",width="",height="",align="";var title="",onmouseover="",onmouseout="",action="insert";var img=tinyMCE.imgElement;var inst=tinyMCE.getInstanceById(editor_id);if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){img=tinyMCE.selectedElement;tinyMCE.imgElement=img}if(img){if(tinyMCE.getAttrib(img,'name').indexOf('mce_')==0)return true;src=tinyMCE.getAttrib(img,'src');alt=tinyMCE.getAttrib(img,'alt');if(alt=="")alt=tinyMCE.getAttrib(img,'title');if(tinyMCE.isGecko){var w=img.style.width;if(w!=null&&w!="")img.setAttribute("width",w);var h=img.style.height;if(h!=null&&h!="")img.setAttribute("height",h)}border=tinyMCE.getAttrib(img,'border');hspace=tinyMCE.getAttrib(img,'hspace');vspace=tinyMCE.getAttrib(img,'vspace');width=tinyMCE.getAttrib(img,'width');height=tinyMCE.getAttrib(img,'height');align=tinyMCE.getAttrib(img,'align');onmouseover=tinyMCE.getAttrib(img,'onmouseover');onmouseout=tinyMCE.getAttrib(img,'onmouseout');title=tinyMCE.getAttrib(img,'title');if(tinyMCE.isMSIE){width=img.attributes['width'].specified?width:"";height=img.attributes['height'].specified?height:""}src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);");mceRealSrc=tinyMCE.getAttrib(img,'mce_src');if(mceRealSrc!=""){src=mceRealSrc;if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);")}action="update"}var template=new Array();template['file']='image.htm?src={$src}';template['width']=355;template['height']=265+(tinyMCE.isMSIE?25:0);template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);if(inst.settings['insertimage_callback']){var returnVal=eval(inst.settings['insertimage_callback']+"(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");if(returnVal&&returnVal['src'])TinyMCE_AdvancedTheme._insertImage(returnVal['src'],returnVal['alt'],returnVal['border'],returnVal['hspace'],returnVal['vspace'],returnVal['width'],returnVal['height'],returnVal['align'],returnVal['title'],returnVal['onmouseover'],returnVal['onmouseout'])}else tinyMCE.openWindow(template,{src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout,action:action,inline:"yes"});return true;case"forecolor":var fcp=new TinyMCE_Layer(editor_id+'_fcPreview',false),p,img,elm;TinyMCE_AdvancedTheme._hideMenus(editor_id);if(!fcp.exists()){fcp.create('div','mceColorPreview',document.getElementById(editor_id+'_toolbar'));elm=fcp.getElement();elm._editor_id=editor_id;elm._command="forecolor";elm._switchId=editor_id+"_forecolor";tinyMCE.addEvent(elm,'click',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseover',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseout',TinyMCE_AdvancedTheme._handleMenuEvent)}img=tinyMCE.selectNodes(document.getElementById(editor_id+"_forecolor"),function(n){return n.nodeName=="IMG"})[0];p=tinyMCE.getAbsPosition(img,document.getElementById(editor_id+'_toolbar'));fcp.moveTo(p.absLeft,p.absTop);fcp.getElement().style.backgroundColor=value!=null?value:tinyMCE.getInstanceById(editor_id).foreColor;fcp.show();return false;case"forecolorpicker":this._pickColor(editor_id,'forecolor');return true;case"forecolorMenu":TinyMCE_AdvancedTheme._hideMenus(editor_id);var ml=new TinyMCE_Layer(editor_id+'_fcMenu');if(!ml.exists())ml.create('div','mceMenu',document.body,TinyMCE_AdvancedTheme._getColorHTML(editor_id,'theme_advanced_text_colors','forecolor'));tinyMCE.switchClass(editor_id+'_forecolor','mceMenuButtonFocus');ml.moveRelativeTo(document.getElementById(editor_id+"_forecolor"),'bl');ml.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?-1:1,-1);if(tinyMCE.isOpera)ml.moveBy(0,-2);ml.show();return true;case"HiliteColor":var bcp=new TinyMCE_Layer(editor_id+'_bcPreview',false),p,img;TinyMCE_AdvancedTheme._hideMenus(editor_id);if(!bcp.exists()){bcp.create('div','mceColorPreview',document.getElementById(editor_id+'_toolbar'));elm=bcp.getElement();elm._editor_id=editor_id;elm._command="HiliteColor";elm._switchId=editor_id+"_backcolor";tinyMCE.addEvent(elm,'click',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseover',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseout',TinyMCE_AdvancedTheme._handleMenuEvent)}img=tinyMCE.selectNodes(document.getElementById(editor_id+"_backcolor"),function(n){return n.nodeName=="IMG"})[0];p=tinyMCE.getAbsPosition(img,document.getElementById(editor_id+'_toolbar'));bcp.moveTo(p.absLeft,p.absTop);bcp.getElement().style.backgroundColor=value!=null?value:tinyMCE.getInstanceById(editor_id).backColor;bcp.show();return false;case"HiliteColorMenu":TinyMCE_AdvancedTheme._hideMenus(editor_id);var ml=new TinyMCE_Layer(editor_id+'_bcMenu');if(!ml.exists())ml.create('div','mceMenu',document.body,TinyMCE_AdvancedTheme._getColorHTML(editor_id,'theme_advanced_background_colors','HiliteColor'));tinyMCE.switchClass(editor_id+'_backcolor','mceMenuButtonFocus');ml.moveRelativeTo(document.getElementById(editor_id+"_backcolor"),'bl');ml.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?-1:1,-1);if(tinyMCE.isOpera)ml.moveBy(0,-2);ml.show();return true;case"backcolorpicker":this._pickColor(editor_id,'HiliteColor');return true;case"mceColorPicker":if(user_interface){var template=[];if(!value['callback']&&!value['color'])value['color']=value['document'].getElementById(value['element_id']).value;template['file']='color_picker.htm';template['width']=380;template['height']=250;template['close_previous']="no";template['width']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height',0);if(typeof(value['store_selection'])=="undefined")value['store_selection']=true;tinyMCE.lastColorPickerValue=value;tinyMCE.openWindow(template,{editor_id:editor_id,mce_store_selection:value['store_selection'],inline:"yes",command:"mceColorPicker",input_color:value['color']})}else{var savedVal=tinyMCE.lastColorPickerValue,elm;if(savedVal['callback']){savedVal['callback'](value);return true}elm=savedVal['document'].getElementById(savedVal['element_id']);elm.value=value;if(elm.onchange!=null&&elm.onchange!='')eval('elm.onchange();')}return true;case"mceCodeEditor":var template=new Array();template['file']='source_editor.htm';template['width']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_width",720));template['height']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_height",580));tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"no",inline:"yes"});return true;case"mceCharMap":var template=new Array();template['file']='charmap.htm';template['width']=550+(tinyMCE.isOpera?40:0);template['height']=250;template['width']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceInsertAnchor":var template=new Array();template['file']='anchor.htm';template['width']=320;template['height']=90+(tinyMCE.isNS7?30:0);template['width']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceNewDocument":if(confirm(tinyMCE.getLang('lang_newdocument')))tinyMCE.execInstanceCommand(editor_id,'mceSetContent',false,' ');return true}return false},getEditorTemplate:function(settings,editorId){function removeFromArray(in_array,remove_array){var outArray=new Array(),skip;for(var i=0;i<in_array.length;i++){skip=false;for(var j=0;j<remove_array.length;j++){if(in_array[i]==remove_array[j]){skip=true}}if(!skip){outArray[outArray.length]=in_array[i]}}return outArray}function addToArray(in_array,add_array){for(var i=0;i<add_array.length;i++){in_array[in_array.length]=add_array[i]}return in_array}var template=new Array();var deltaHeight=0;var resizing=tinyMCE.getParam("theme_advanced_resizing",false);var path=tinyMCE.getParam("theme_advanced_path",true);var statusbarHTML='<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: '+(path?"block":"none")+'">&#160;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: '+(resizing?"block":"none")+'" onmousedown="tinyMCE.themes.advanced._setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';var layoutManager=tinyMCE.getParam("theme_advanced_layout_manager","SimpleLayout");var styleSelectHTML='<option value="">{$lang_theme_style_select}</option>';if(settings['theme_advanced_styles']){var stylesAr=settings['theme_advanced_styles'].split(';');for(var i=0;i<stylesAr.length;i++){var key,value;key=stylesAr[i].split('=')[0];value=stylesAr[i].split('=')[1];styleSelectHTML+='<option value="'+value+'">'+key+'</option>'}TinyMCE_AdvancedTheme._autoImportCSSClasses=false}switch(layoutManager){case"SimpleLayout":var toolbarHTML="";var toolbarLocation=tinyMCE.getParam("theme_advanced_toolbar_location","bottom");var toolbarAlign=tinyMCE.getParam("theme_advanced_toolbar_align","center");var pathLocation=tinyMCE.getParam("theme_advanced_path_location","none");var statusbarLocation=tinyMCE.getParam("theme_advanced_statusbar_location",pathLocation);var defVals={theme_advanced_buttons1:"bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,separator,sub,sup,separator,charmap"};toolbarHTML+='<a href="#" accesskey="q" title="'+tinyMCE.getLang("lang_toolbar_focus")+'"';if(!tinyMCE.getParam("accessibility_focus"))toolbarHTML+=' onfocus="tinyMCE.getInstanceById(\''+editorId+'\').getWin().focus();"';toolbarHTML+='></a>';for(var i=1;i<100;i++){var def=defVals["theme_advanced_buttons"+i];var buttons=tinyMCE.getParam("theme_advanced_buttons"+i,def==null?'':def,true,',');if(buttons.length==0)break;buttons=removeFromArray(buttons,tinyMCE.getParam("theme_advanced_disable","",true,','));buttons=addToArray(buttons,tinyMCE.getParam("theme_advanced_buttons"+i+"_add","",true,','));buttons=addToArray(tinyMCE.getParam("theme_advanced_buttons"+i+"_add_before","",true,','),buttons);for(var b=0;b<buttons.length;b++)toolbarHTML+=tinyMCE.getControlHTML(buttons[b]);if(buttons.length>0){toolbarHTML+="<br />";deltaHeight-=23}}toolbarHTML+='<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\''+editorId+'\').getWin().focus();"></a>';template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width_style};height:{$height_style}"><tbody>';if(toolbarLocation=="top")template['html']+='<tr><td dir="ltr" class="mceToolbarTop" align="'+toolbarAlign+'" height="1" nowrap="nowrap"><span id="'+editorId+'_toolbar" class="mceToolbarContainer">'+toolbarHTML+'</span></td></tr>';if(statusbarLocation=="top"){template['html']+='<tr><td class="mceStatusbarTop" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23}template['html']+='<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';if(toolbarLocation=="bottom")template['html']+='<tr><td dir="ltr" class="mceToolbarBottom" align="'+toolbarAlign+'" height="1"><span id="'+editorId+'_toolbar" class="mceToolbarContainer">'+toolbarHTML+'</span></td></tr>';if(toolbarLocation=="external"){var bod=document.body;var elm=document.createElement("div");toolbarHTML=tinyMCE.replaceVar(toolbarHTML,'style_select_options',styleSelectHTML);toolbarHTML=tinyMCE.applyTemplate(toolbarHTML,{editor_id:editorId});elm.className="mceToolbarExternal";elm.id=editorId+"_toolbar";elm.innerHTML='<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';bod.appendChild(elm);deltaHeight=0;tinyMCE.getInstanceById(editorId).toolbarElement=elm;}else{tinyMCE.getInstanceById(editorId).toolbarElement=null}if(statusbarLocation=="bottom"){template['html']+='<tr><td class="mceStatusbarBottom" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23}template['html']+='</tbody></table>';break;case"RowLayout":template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';var containers=tinyMCE.getParam("theme_advanced_containers","",true,",");var defaultContainerCSS=tinyMCE.getParam("theme_advanced_containers_default_class","container");var defaultContainerAlign=tinyMCE.getParam("theme_advanced_containers_default_align","center");for(var i=0;i<containers.length;i++){if(containers[i]=="mceEditor")template['html']+='<tr><td align="center" class="mceEditor_border"><span id="{$editor_id}"></span></td></tr>';else if(containers[i]=="mceElementpath"||containers[i]=="mceStatusbar"){var pathClass="mceStatusbar";if(i==containers.length-1){pathClass="mceStatusbarBottom"}else if(i==0){pathClass="mceStatusbar"}else{deltaHeight-=2}template['html']+='<tr><td class="'+pathClass+'" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=22}else{var curContainer=tinyMCE.getParam("theme_advanced_container_"+containers[i],"",true,',');var curContainerHTML="";var curAlign=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align",defaultContainerAlign);var curCSS=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class",defaultContainerCSS);curContainer=removeFromArray(curContainer,tinyMCE.getParam("theme_advanced_disable","",true,','));for(var j=0;j<curContainer.length;j++)curContainerHTML+=tinyMCE.getControlHTML(curContainer[j]);if(curContainer.length>0){curContainerHTML+="<br />";deltaHeight-=23}template['html']+='<tr><td class="'+curCSS+'" align="'+curAlign+'" height="1">'+curContainerHTML+'</td></tr>'}}template['html']+='</tbody></table>';break;case"CustomLayout":var customLayout=tinyMCE.getParam("theme_advanced_custom_layout","");if(customLayout!=""&&eval("typeof("+customLayout+")")!="undefined"){template=eval(customLayout+"(template);")}break}if(resizing)template['html']+='<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';template['html']=tinyMCE.replaceVar(template['html'],'style_select_options',styleSelectHTML);if(!template['delta_width'])template['delta_width']=0;if(!template['delta_height'])template['delta_height']=deltaHeight;return template},initInstance:function(inst){if(tinyMCE.getParam("theme_advanced_resizing",false)){if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var w=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_width");var h=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_height");TinyMCE_AdvancedTheme._resizeTo(inst,w,h,tinyMCE.getParam("theme_advanced_resize_horizontal",true))}}inst.addShortcut('ctrl','k','lang_link_desc','mceLink')},removeInstance:function(inst){new TinyMCE_Layer(inst.editorId+'_fcMenu').remove();new TinyMCE_Layer(inst.editorId+'_bcMenu').remove()},hideInstance:function(inst){TinyMCE_AdvancedTheme._hideMenus(inst.editorId)},_handleMenuEvent:function(e){var te=tinyMCE.isMSIE?window.event.srcElement:e.target;tinyMCE._menuButtonEvent(e.type=="mouseover"?"over":"out",document.getElementById(te._switchId));if(e.type=="click")tinyMCE.execInstanceCommand(te._editor_id,te._command)},_hideMenus:function(id){var fcml=new TinyMCE_Layer(id+'_fcMenu'),bcml=new TinyMCE_Layer(id+'_bcMenu');if(fcml.exists()&&fcml.isVisible()){tinyMCE.switchClass(id+'_forecolor','mceMenuButton');fcml.hide()}if(bcml.exists()&&bcml.isVisible()){tinyMCE.switchClass(id+'_backcolor','mceMenuButton');bcml.hide()}},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection,setup_content){var alignNode,breakOut,classNode;function selectByValue(select_elm,value,first_index){first_index=typeof(first_index)=="undefined"?false:true;if(select_elm){for(var i=0;i<select_elm.options.length;i++){var ov=""+select_elm.options[i].value;if(first_index&&ov.toLowerCase().indexOf(value.toLowerCase())==0){select_elm.selectedIndex=i;return true}if(ov==value){select_elm.selectedIndex=i;return true}}}return false};if(node==null)return;var pathElm=document.getElementById(editor_id+"_path");var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();TinyMCE_AdvancedTheme._hideMenus(editor_id);if(pathElm){var parentNode=node;var path=new Array();while(parentNode!=null){if(parentNode.nodeName.toUpperCase()=="BODY"){break}if(parentNode.nodeType==1&&tinyMCE.getAttrib(parentNode,"class").indexOf('mceItemHidden')==-1){path[path.length]=parentNode}parentNode=parentNode.parentNode}var html="";for(var i=path.length-1;i>=0;i--){var nodeName=path[i].nodeName.toLowerCase();var nodeData="";if(nodeName.indexOf("html:")==0)nodeName=nodeName.substring(5);if(nodeName=="b"){nodeName="strong"}if(nodeName=="i"){nodeName="em"}if(nodeName=="span"){var cn=tinyMCE.getAttrib(path[i],"class");if(cn!=""&&cn.indexOf('mceItem')==-1)nodeData+="class: "+cn+" ";var st=tinyMCE.getAttrib(path[i],"style");if(st!=""){st=tinyMCE.serializeStyle(tinyMCE.parseStyle(st));nodeData+="style: "+tinyMCE.xmlEncode(st)+" "}}if(nodeName=="font"){if(tinyMCE.getParam("convert_fonts_to_spans"))nodeName="span";var face=tinyMCE.getAttrib(path[i],"face");if(face!="")nodeData+="font: "+tinyMCE.xmlEncode(face)+" ";var size=tinyMCE.getAttrib(path[i],"size");if(size!="")nodeData+="size: "+tinyMCE.xmlEncode(size)+" ";var color=tinyMCE.getAttrib(path[i],"color");if(color!="")nodeData+="color: "+tinyMCE.xmlEncode(color)+" "}if(tinyMCE.getAttrib(path[i],'id')!=""){nodeData+="id: "+path[i].getAttribute('id')+" "}var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1)nodeData+="class: "+className+" ";if(tinyMCE.getAttrib(path[i],'src')!=""){var src=tinyMCE.getAttrib(path[i],"mce_src");if(src=="")src=tinyMCE.getAttrib(path[i],"src");nodeData+="src: "+tinyMCE.xmlEncode(src)+" "}if(path[i].nodeName=='A'&&tinyMCE.getAttrib(path[i],'href')!=""){var href=tinyMCE.getAttrib(path[i],"mce_href");if(href=="")href=tinyMCE.getAttrib(path[i],"href");nodeData+="href: "+tinyMCE.xmlEncode(href)+" "}className=tinyMCE.getAttrib(path[i],"class");if((nodeName=="img"||nodeName=="span")&&className.indexOf('mceItem')!=-1){nodeName=className.replace(/mceItem([a-z]+)/gi,'$1').toLowerCase();nodeData=path[i].getAttribute('title')}if(nodeName=="a"&&(anchor=tinyMCE.getAttrib(path[i],"name"))!=""){nodeName="a";nodeName+="#"+tinyMCE.xmlEncode(anchor);nodeData=""}if(tinyMCE.getAttrib(path[i],'name').indexOf("mce_")!=0){var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1){nodeName+="."+className}}var cmd='tinyMCE.execInstanceCommand(\''+editor_id+'\',\'mceSelectNodeDepth\',false,\''+i+'\');';html+='<a title="'+nodeData+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" target="_self" class="mcePathItem">'+nodeName+'</a>';if(i>0){html+=" &raquo; "}}pathElm.innerHTML='<a href="#" accesskey="x"></a>'+tinyMCE.getLang('lang_theme_path')+": "+html+'&#160;'}tinyMCE.switchClass(editor_id+'_justifyleft','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifyright','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifyfull','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClass(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClass(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClass(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_numlist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_sub','mceButtonNormal');tinyMCE.switchClass(editor_id+'_sup','mceButtonNormal');tinyMCE.switchClass(editor_id+'_anchor','mceButtonNormal');tinyMCE.switchClass(editor_id+'_link','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_unlink','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_outdent','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_image','mceButtonNormal');tinyMCE.switchClass(editor_id+'_hr','mceButtonNormal');if(node.nodeName=="A"&&tinyMCE.getAttrib(node,"class").indexOf('mceItemAnchor')!=-1)tinyMCE.switchClass(editor_id+'_anchor','mceButtonSelected');var anchorLink=tinyMCE.getParentElement(node,"a","href");if(anchorLink||any_selection){tinyMCE.switchClass(editor_id+'_link',anchorLink?'mceButtonSelected':'mceButtonNormal');tinyMCE.switchClass(editor_id+'_unlink',anchorLink?'mceButtonSelected':'mceButtonNormal')}tinyMCE.switchClass(editor_id+'_visualaid',visual_aid?'mceButtonSelected':'mceButtonNormal');if(undo_levels!=-1){tinyMCE.switchClass(editor_id+'_undo','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_redo','mceButtonDisabled')}if(tinyMCE.getParentElement(node,"li,blockquote"))tinyMCE.switchClass(editor_id+'_outdent','mceButtonNormal');if(undo_index!=-1&&(undo_index<undo_levels-1&&undo_levels>0))tinyMCE.switchClass(editor_id+'_redo','mceButtonNormal');if(undo_index!=-1&&(undo_index>0&&undo_levels>0))tinyMCE.switchClass(editor_id+'_undo','mceButtonNormal');var selectElm=document.getElementById(editor_id+"_styleSelect");if(selectElm){TinyMCE_AdvancedTheme._setupCSSClasses(editor_id);classNode=node;breakOut=false;var index=0;do{if(classNode&&classNode.className){for(var i=0;i<selectElm.options.length;i++){if(selectElm.options[i].value==classNode.className){index=i;breakOut=true;break}}}}while(!breakOut&&classNode!=null&&(classNode=classNode.parentNode)!=null);selectElm.selectedIndex=index}var selectElm=document.getElementById(editor_id+"_formatSelect");if(selectElm){var elm=tinyMCE.getParentElement(node,"p,div,h1,h2,h3,h4,h5,h6,pre,address");if(elm)selectByValue(selectElm,"<"+elm.nodeName.toLowerCase()+">");else selectByValue(selectElm,"")}var selectElm=document.getElementById(editor_id+"_fontNameSelect");if(selectElm){if(!tinyMCE.isSafari&&!(tinyMCE.isMSIE&&!tinyMCE.isOpera)){var face=inst.queryCommandValue('FontName');face=face==null||face==""?"":face;selectByValue(selectElm,face,face!="")}else{var elm=tinyMCE.getParentElement(node,"font","face");if(elm){var family=tinyMCE.getAttrib(elm,"face");if(family=='')family=''+elm.style.fontFamily;if(!selectByValue(selectElm,family,family!=""))selectByValue(selectElm,"")}else selectByValue(selectElm,"")}}var selectElm=document.getElementById(editor_id+"_fontSizeSelect");if(selectElm){if(!tinyMCE.isSafari&&!tinyMCE.isOpera){var size=inst.queryCommandValue('FontSize');selectByValue(selectElm,size==null||size==""?"0":size)}else{var elm=tinyMCE.getParentElement(node,"font","size");if(elm){var size=tinyMCE.getAttrib(elm,"size");if(size==''){var sizes=new Array('','8px','10px','12px','14px','18px','24px','36px');size=''+elm.style.fontSize;for(var i=0;i<sizes.length;i++){if((''+sizes[i])==size){size=i;break}}}if(!selectByValue(selectElm,size))selectByValue(selectElm,"")}else selectByValue(selectElm,"0")}}alignNode=node;breakOut=false;do{if(!alignNode.getAttribute||!alignNode.getAttribute('align'))continue;switch(alignNode.getAttribute('align').toLowerCase()){case"left":tinyMCE.switchClass(editor_id+'_justifyleft','mceButtonSelected');breakOut=true;break;case"right":tinyMCE.switchClass(editor_id+'_justifyright','mceButtonSelected');breakOut=true;break;case"middle":case"center":tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonSelected');breakOut=true;break;case"justify":tinyMCE.switchClass(editor_id+'_justifyfull','mceButtonSelected');breakOut=true;break}}while(!breakOut&&(alignNode=alignNode.parentNode)!=null);var div=tinyMCE.getParentElement(node,"div");if(div&&div.style.textAlign=="center")tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonSelected');if(!setup_content){var ar=new Array("Bold","_bold","Italic","_italic","Strikethrough","_strikethrough","superscript","_sup","subscript","_sub");for(var i=0;i<ar.length;i+=2){if(inst.queryCommandState(ar[i]))tinyMCE.switchClass(editor_id+ar[i+1],'mceButtonSelected')}if(inst.queryCommandState("Underline")&&(node.parentNode==null||node.parentNode.nodeName!="A"))tinyMCE.switchClass(editor_id+'_underline','mceButtonSelected')}do{switch(node.nodeName){case"UL":tinyMCE.switchClass(editor_id+'_bullist','mceButtonSelected');break;case"OL":tinyMCE.switchClass(editor_id+'_numlist','mceButtonSelected');break;case"HR":tinyMCE.switchClass(editor_id+'_hr','mceButtonSelected');break;case"IMG":if(tinyMCE.getAttrib(node,'name').indexOf('mce_')!=0&&tinyMCE.getAttrib(node,'class').indexOf('mceItem')==-1){tinyMCE.switchClass(editor_id+'_image','mceButtonSelected')}break}}while((node=node.parentNode)!=null)},_setupCSSClasses:function(editor_id){var i,selectElm;if(!TinyMCE_AdvancedTheme._autoImportCSSClasses)return;selectElm=document.getElementById(editor_id+'_styleSelect');if(selectElm&&selectElm.getAttribute('cssImported')!='true'){var csses=tinyMCE.getCSSClasses(editor_id);if(csses&&selectElm){for(i=0;i<csses.length;i++)selectElm.options[selectElm.options.length]=new Option(csses[i],csses[i])}if(csses!=null&&csses.length>0)selectElm.setAttribute('cssImported','true')}},_setCookie:function(name,value,expires,path,domain,secure){var curCookie=name+"="+escape(value)+((expires)?"; expires="+expires.toGMTString():"")+((path)?"; path="+escape(path):"")+((domain)?"; domain="+domain:"")+((secure)?"; secure":"");document.cookie=curCookie},_getCookie:function(name){var dc=document.cookie;var prefix=name+"=";var begin=dc.indexOf("; "+prefix);if(begin==-1){begin=dc.indexOf(prefix);if(begin!=0)return null}else begin+=2;var end=document.cookie.indexOf(";",begin);if(end==-1)end=dc.length;return unescape(dc.substring(begin+prefix.length,end))},_resizeTo:function(inst,w,h,set_w){var editorContainer=document.getElementById(inst.editorId+'_parent');var tableElm=editorContainer.firstChild;var iframe=inst.iframeElement;if(w==null||w=="null"){set_w=false;w=0}if(h==null||h=="null")return;w=parseInt(w);h=parseInt(h);if(tinyMCE.isGecko){w+=2;h+=2}var dx=w-tableElm.clientWidth;var dy=h-tableElm.clientHeight;w=w<1?30:w;h=h<1?30:h;if(set_w)tableElm.style.width=w+"px";tableElm.style.height=h+"px";iw=iframe.clientWidth+dx;ih=iframe.clientHeight+dy;iw=iw<1?30:iw;ih=ih<1?30:ih;if(tinyMCE.isGecko){iw-=2;ih-=2}if(set_w)iframe.style.width=iw+"px";iframe.style.height=ih+"px";if(set_w){var tableBodyElm=tableElm.firstChild;var minIframeWidth=tableBodyElm.scrollWidth;if(inst.iframeElement.clientWidth<minIframeWidth){dx=minIframeWidth-inst.iframeElement.clientWidth;inst.iframeElement.style.width=(iw+dx)+"px"}}inst.useCSS=false},_resizeEventHandler:function(e){var resizer=TinyMCE_AdvancedTheme._resizer;if(!resizer.resizing)return;e=typeof(e)=="undefined"?window.event:e;var dx=e.screenX-resizer.downX;var dy=e.screenY-resizer.downY;var resizeBox=resizer.resizeBox;var editorId=resizer.editorId;switch(e.type){case"mousemove":var w,h;w=resizer.width+dx;h=resizer.height+dy;w=w<1?1:w;h=h<1?1:h;if(resizer.horizontal)resizeBox.style.width=w+"px";resizeBox.style.height=h+"px";break;case"mouseup":TinyMCE_AdvancedTheme._setResizing(e,editorId,false);TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId),resizer.width+dx,resizer.height+dy,resizer.horizontal);if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var expires=new Date();expires.setTime(expires.getTime()+3600000*24*30);TinyMCE_AdvancedTheme._setCookie("TinyMCE_"+editorId+"_width",""+(resizer.horizontal?resizer.width+dx:""),expires);TinyMCE_AdvancedTheme._setCookie("TinyMCE_"+editorId+"_height",""+(resizer.height+dy),expires)}break}},_setResizing:function(e,editor_id,state){e=typeof(e)=="undefined"?window.event:e;var resizer=TinyMCE_AdvancedTheme._resizer;var editorContainer=document.getElementById(editor_id+'_parent');var editorArea=document.getElementById(editor_id+'_parent').firstChild;var resizeBox=document.getElementById(editor_id+'_resize_box');var inst=tinyMCE.getInstanceById(editor_id);if(state){var width=editorArea.clientWidth;var height=editorArea.clientHeight;resizeBox.style.width=width+"px";resizeBox.style.height=height+"px";resizer.iframeWidth=inst.iframeElement.clientWidth;resizer.iframeHeight=inst.iframeElement.clientHeight;editorArea.style.display="none";resizeBox.style.display="block";if(!resizer.eventHandlers){if(tinyMCE.isMSIE)tinyMCE.addEvent(document,"mousemove",TinyMCE_AdvancedTheme._resizeEventHandler);else tinyMCE.addEvent(window,"mousemove",TinyMCE_AdvancedTheme._resizeEventHandler);tinyMCE.addEvent(document,"mouseup",TinyMCE_AdvancedTheme._resizeEventHandler);resizer.eventHandlers=true}resizer.resizing=true;resizer.downX=e.screenX;resizer.downY=e.screenY;resizer.width=parseInt(resizeBox.style.width);resizer.height=parseInt(resizeBox.style.height);resizer.editorId=editor_id;resizer.resizeBox=resizeBox;resizer.horizontal=tinyMCE.getParam("theme_advanced_resize_horizontal",true)}else{resizer.resizing=false;resizeBox.style.display="none";editorArea.style.display=tinyMCE.isMSIE&&!tinyMCE.isOpera?"block":"table";tinyMCE.execCommand('mceResetDesignMode')}},_getColorHTML:function(id,n,cm){var i,h,cl;h='<span class="mceMenuLine"></span>';cl=tinyMCE.getParam(n,TinyMCE_AdvancedTheme._defColors).split(',');h+='<table class="mceColors"><tr>';for(i=0;i<cl.length;i++){c='tinyMCE.execInstanceCommand(\''+id+'\', \''+cm+'\', false, \'#'+cl[i]+'\');';h+='<td><a href="javascript:'+c+'" style="background-color: #'+cl[i]+'" onclick="'+c+';return false;"></a></td>';if((i+1)%8==0)h+='</tr><tr>'}h+='</tr></table>';if(tinyMCE.getParam("theme_advanced_more_colors",true))h+='<a href="javascript:void(0);" onclick="TinyMCE_AdvancedTheme._pickColor(\''+id+'\',\''+cm+'\');" class="mceMoreColors">'+tinyMCE.getLang('lang_more_colors')+'</a>';return h},_pickColor:function(id,cm){var inputColor,inst=tinyMCE.selectedInstance;if(cm=='forecolor'&&inst)inputColor=inst.foreColor;if((cm=='backcolor'||cm=='HiliteColor')&&inst)inputColor=inst.backColor;tinyMCE.execCommand('mceColorPicker',true,{color:inputColor,callback:function(c){tinyMCE.execInstanceCommand(id,cm,false,c)}})},_insertImage:function(src,alt,border,hspace,vspace,width,height,align,title,onmouseover,onmouseout){tinyMCE.execCommand("mceInsertContent",false,tinyMCE.createTagHTML('img',{src:tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],src),mce_src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout}))},_insertLink:function(href,target,title,onclick,style_class){tinyMCE.execCommand('mceBeginUndoLevel');if(tinyMCE.selectedInstance&&tinyMCE.selectedElement&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){var doc=tinyMCE.selectedInstance.getDoc();var linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");var newLink=false;if(!linkElement){linkElement=doc.createElement("a");newLink=true}var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(linkElement,'href',thref);tinyMCE.setAttrib(linkElement,'mce_href',mhref);tinyMCE.setAttrib(linkElement,'target',target);tinyMCE.setAttrib(linkElement,'title',title);tinyMCE.setAttrib(linkElement,'onclick',onclick);tinyMCE.setAttrib(linkElement,'class',style_class);if(newLink){linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));tinyMCE.selectedElement.parentNode.replaceChild(linkElement,tinyMCE.selectedElement)}return}if(!tinyMCE.linkElement&&tinyMCE.selectedInstance){if(tinyMCE.isSafari){tinyMCE.execCommand("mceInsertContent",false,'<a href="'+tinyMCE.uniqueURL+'">'+tinyMCE.selectedInstance.selection.getSelectedHTML()+'</a>')}else tinyMCE.selectedInstance.contentDocument.execCommand("createlink",false,tinyMCE.uniqueURL);tinyMCE.linkElement=tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);var elementArray=tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);for(var i=0;i<elementArray.length;i++){var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, elementArray[i]);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(elementArray[i],'href',thref);tinyMCE.setAttrib(elementArray[i],'mce_href',mhref);tinyMCE.setAttrib(elementArray[i],'target',target);tinyMCE.setAttrib(elementArray[i],'title',title);tinyMCE.setAttrib(elementArray[i],'onclick',onclick);tinyMCE.setAttrib(elementArray[i],'class',style_class)}tinyMCE.linkElement=elementArray[0]}if(tinyMCE.linkElement){var mhref=href;href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(tinyMCE.linkElement,'href',href);tinyMCE.setAttrib(tinyMCE.linkElement,'mce_href',mhref);tinyMCE.setAttrib(tinyMCE.linkElement,'target',target);tinyMCE.setAttrib(tinyMCE.linkElement,'title',title);tinyMCE.setAttrib(tinyMCE.linkElement,'onclick',onclick);tinyMCE.setAttrib(tinyMCE.linkElement,'class',style_class)}tinyMCE.execCommand('mceEndUndoLevel')}};tinyMCE.addTheme("advanced",TinyMCE_AdvancedTheme);tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);
\ No newline at end of file
+tinyMCE.importThemeLanguagePack('advanced');var TinyMCE_AdvancedTheme={_defColors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",_autoImportCSSClasses:true,_resizer:{},_buttons:[['bold','{$lang_bold_img}','lang_bold_desc','Bold'],['italic','{$lang_italic_img}','lang_italic_desc','Italic'],['underline','{$lang_underline_img}','lang_underline_desc','Underline'],['strikethrough','strikethrough.gif','lang_striketrough_desc','Strikethrough'],['justifyleft','justifyleft.gif','lang_justifyleft_desc','JustifyLeft'],['justifycenter','justifycenter.gif','lang_justifycenter_desc','JustifyCenter'],['justifyright','justifyright.gif','lang_justifyright_desc','JustifyRight'],['justifyfull','justifyfull.gif','lang_justifyfull_desc','JustifyFull'],['bullist','bullist.gif','lang_bullist_desc','InsertUnorderedList'],['numlist','numlist.gif','lang_numlist_desc','InsertOrderedList'],['outdent','outdent.gif','lang_outdent_desc','Outdent'],['indent','indent.gif','lang_indent_desc','Indent'],['cut','cut.gif','lang_cut_desc','Cut'],['copy','copy.gif','lang_copy_desc','Copy'],['paste','paste.gif','lang_paste_desc','Paste'],['undo','undo.gif','lang_undo_desc','Undo'],['redo','redo.gif','lang_redo_desc','Redo'],['link','link.gif','lang_link_desc','mceLink',true],['unlink','unlink.gif','lang_unlink_desc','unlink'],['image','image.gif','lang_image_desc','mceImage',true],['cleanup','cleanup.gif','lang_cleanup_desc','mceCleanup'],['help','help.gif','lang_help_desc','mceHelp'],['code','code.gif','lang_theme_code_desc','mceCodeEditor'],['hr','hr.gif','lang_theme_hr_desc','inserthorizontalrule'],['removeformat','removeformat.gif','lang_theme_removeformat_desc','removeformat'],['sub','sub.gif','lang_theme_sub_desc','subscript'],['sup','sup.gif','lang_theme_sup_desc','superscript'],['forecolor','forecolor.gif','lang_theme_forecolor_desc','forecolor',true],['forecolorpicker','forecolor.gif','lang_theme_forecolor_desc','forecolorpicker',true],['backcolor','backcolor.gif','lang_theme_backcolor_desc','HiliteColor',true],['backcolorpicker','backcolor.gif','lang_theme_backcolor_desc','backcolorpicker',true],['charmap','charmap.gif','lang_theme_charmap_desc','mceCharMap'],['visualaid','visualaid.gif','lang_theme_visualaid_desc','mceToggleVisualAid'],['anchor','anchor.gif','lang_theme_anchor_desc','mceInsertAnchor'],['newdocument','newdocument.gif','lang_newdocument_desc','mceNewDocument']],_buttonMap:'anchor,backcolor,bold,bullist,charmap,cleanup,code,copy,cut,forecolor,help,hr,image,indent,italic,justifycenter,justifyfull,justifyleft,justifyright,link,newdocument,numlist,outdent,paste,redo,removeformat,strikethrough,sub,sup,underline,undo,unlink,visualaid,advhr,ltr,rtl,emotions,flash,fullpage,fullscreen,iespell,insertdate,inserttime,pastetext,pasteword,selectall,preview,print,save,replace,search,table,cell_props,delete_col,delete_row,col_after,col_before,row_after,row_before,merge_cells,row_props,split_cells,delete_table',getControlHTML:function(button_name){var i,x,but;for(i=0;i<TinyMCE_AdvancedTheme._buttons.length;i++){but=TinyMCE_AdvancedTheme._buttons[i];if(but[0]==button_name&&(button_name=="forecolor"||button_name=="backcolor"))return tinyMCE.getMenuButtonHTML(but[0],but[2],'{$themeurl}/images/'+but[1],but[3]+"Menu",but[3],(but.length>4?but[4]:false),(but.length>5?but[5]:null));if(but[0]==button_name)return tinyMCE.getButtonHTML(but[0],but[2],'{$themeurl}/images/'+but[1],but[3],(but.length>4?but[4]:false),(but.length>5?but[5]:null))}switch(button_name){case"formatselect":var html='<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';var formats=tinyMCE.getParam("theme_advanced_blockformats","p,address,pre,h1,h2,h3,h4,h5,h6",true).split(',');var lookup=[['p','{$lang_theme_paragraph}'],['address','{$lang_theme_address}'],['pre','{$lang_theme_pre}'],['h1','{$lang_theme_h1}'],['h2','{$lang_theme_h2}'],['h3','{$lang_theme_h3}'],['h4','{$lang_theme_h4}'],['h5','{$lang_theme_h5}'],['h6','{$lang_theme_h6}'],['div','{$lang_theme_div}'],['blockquote','{$lang_theme_blockquote}'],['code','{$lang_theme_code}'],['dt','{$lang_theme_dt}'],['dd','{$lang_theme_dd}'],['samp','{$lang_theme_samp}']];html+='<option value="">{$lang_theme_block}</option>';for(var i=0;i<formats.length;i++){for(var x=0;x<lookup.length;x++){if(formats[i]==lookup[x][0])html+='<option value="&lt;'+lookup[x][0]+'&gt;">'+lookup[x][1]+'</option>'}}html+='</select>';return html;case"styleselect":return'<select id="{$editor_id}_styleSelect" onmousedown="tinyMCE.themes.advanced._setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event,this,window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';case"fontselect":var fontHTML='<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';var iFonts='Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';var nFonts='Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';var fonts=tinyMCE.getParam("theme_advanced_fonts",nFonts).split(';');for(i=0;i<fonts.length;i++){if(fonts[i]!=''){var parts=fonts[i].split('=');fontHTML+='<option value="'+parts[1]+'">'+parts[0]+'</option>'}}fontHTML+='</select>';return fontHTML;case"fontsizeselect":return'<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+'<option value="0">{$lang_theme_font_size}</option>'+'<option value="1">1 (8 pt)</option>'+'<option value="2">2 (10 pt)</option>'+'<option value="3">3 (12 pt)</option>'+'<option value="4">4 (14 pt)</option>'+'<option value="5">5 (18 pt)</option>'+'<option value="6">6 (24 pt)</option>'+'<option value="7">7 (36 pt)</option>'+'</select>';case"|":case"separator":return'<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" alt="" />';case"spacer":return'<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" alt="" />';case"rowseparator":return'<br />'}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case'mceHelp':tinyMCE.openWindow({file:'about.htm',width:480,height:380},{tinymce_version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion,tinymce_releasedate:tinyMCE.releaseDate,inline:"yes"});return true;case"mceLink":var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();var selectedText="";if(tinyMCE.isMSIE){var rng=doc.selection.createRange();selectedText=rng.text}else selectedText=inst.getSel().toString();if(!tinyMCE.linkElement){if((tinyMCE.selectedElement.nodeName.toLowerCase()!="img")&&(selectedText.length<=0))return true}var href="",target="",title="",onclick="",action="insert",style_class="";if(tinyMCE.selectedElement.nodeName.toLowerCase()=="a")tinyMCE.linkElement=tinyMCE.selectedElement;if(tinyMCE.linkElement!=null&&tinyMCE.getAttrib(tinyMCE.linkElement,'href')=="")tinyMCE.linkElement=null;if(tinyMCE.linkElement){href=tinyMCE.getAttrib(tinyMCE.linkElement,'href');target=tinyMCE.getAttrib(tinyMCE.linkElement,'target');title=tinyMCE.getAttrib(tinyMCE.linkElement,'title');onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');style_class=tinyMCE.getAttrib(tinyMCE.linkElement,'class');if(onclick=="")onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');onclick=tinyMCE.cleanupEventStr(onclick);href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);");mceRealHref=tinyMCE.getAttrib(tinyMCE.linkElement,'mce_href');if(mceRealHref!=""){href=mceRealHref;if(tinyMCE.getParam('convert_urls'))href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);")}action="update"}var template=new Array();template['file']='link.htm';template['width']=310;template['height']=200;template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);if(inst.settings['insertlink_callback']){var returnVal=eval(inst.settings['insertlink_callback']+"(href, target, title, onclick, action, style_class);");if(returnVal&&returnVal['href'])TinyMCE_AdvancedTheme._insertLink(returnVal['href'],returnVal['target'],returnVal['title'],returnVal['onclick'],returnVal['style_class'])}else{tinyMCE.openWindow(template,{href:href,target:target,title:title,onclick:onclick,action:action,className:style_class,inline:"yes"})}return true;case"mceImage":var src="",alt="",border="",hspace="",vspace="",width="",height="",align="";var title="",onmouseover="",onmouseout="",action="insert";var img=tinyMCE.imgElement;var inst=tinyMCE.getInstanceById(editor_id);if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){img=tinyMCE.selectedElement;tinyMCE.imgElement=img}if(img){if(tinyMCE.getAttrib(img,'name').indexOf('mce_')==0)return true;src=tinyMCE.getAttrib(img,'src');alt=tinyMCE.getAttrib(img,'alt');if(alt=="")alt=tinyMCE.getAttrib(img,'title');if(tinyMCE.isGecko){var w=img.style.width;if(w!=null&&w!="")img.setAttribute("width",w);var h=img.style.height;if(h!=null&&h!="")img.setAttribute("height",h)}border=tinyMCE.getAttrib(img,'border');hspace=tinyMCE.getAttrib(img,'hspace');vspace=tinyMCE.getAttrib(img,'vspace');width=tinyMCE.getAttrib(img,'width');height=tinyMCE.getAttrib(img,'height');align=tinyMCE.getAttrib(img,'align');onmouseover=tinyMCE.getAttrib(img,'onmouseover');onmouseout=tinyMCE.getAttrib(img,'onmouseout');title=tinyMCE.getAttrib(img,'title');if(tinyMCE.isMSIE){width=img.attributes['width'].specified?width:"";height=img.attributes['height'].specified?height:""}src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);");mceRealSrc=tinyMCE.getAttrib(img,'mce_src');if(mceRealSrc!=""){src=mceRealSrc;if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);")}action="update"}var template=new Array();template['file']='image.htm?src={$src}';template['width']=355;template['height']=265+(tinyMCE.isMSIE?25:0);template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);if(inst.settings['insertimage_callback']){var returnVal=eval(inst.settings['insertimage_callback']+"(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");if(returnVal&&returnVal['src'])TinyMCE_AdvancedTheme._insertImage(returnVal['src'],returnVal['alt'],returnVal['border'],returnVal['hspace'],returnVal['vspace'],returnVal['width'],returnVal['height'],returnVal['align'],returnVal['title'],returnVal['onmouseover'],returnVal['onmouseout'])}else tinyMCE.openWindow(template,{src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout,action:action,inline:"yes"});return true;case"forecolor":var fcp=new TinyMCE_Layer(editor_id+'_fcPreview',false),p,img,elm;TinyMCE_AdvancedTheme._hideMenus(editor_id);if(!fcp.exists()){fcp.create('div','mceColorPreview',document.getElementById(editor_id+'_toolbar'));elm=fcp.getElement();elm._editor_id=editor_id;elm._command="forecolor";elm._switchId=editor_id+"_forecolor";tinyMCE.addEvent(elm,'click',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseover',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseout',TinyMCE_AdvancedTheme._handleMenuEvent)}img=tinyMCE.selectNodes(document.getElementById(editor_id+"_forecolor"),function(n){return n.nodeName=="IMG"})[0];p=tinyMCE.getAbsPosition(img,document.getElementById(editor_id+'_toolbar'));fcp.moveTo(p.absLeft,p.absTop);fcp.getElement().style.backgroundColor=value!=null?value:tinyMCE.getInstanceById(editor_id).foreColor;fcp.show();return false;case"forecolorpicker":this._pickColor(editor_id,'forecolor');return true;case"forecolorMenu":TinyMCE_AdvancedTheme._hideMenus(editor_id);var ml=new TinyMCE_Layer(editor_id+'_fcMenu');if(!ml.exists())ml.create('div','mceMenu',document.body,TinyMCE_AdvancedTheme._getColorHTML(editor_id,'theme_advanced_text_colors','forecolor'));tinyMCE.switchClass(editor_id+'_forecolor','mceMenuButtonFocus');ml.moveRelativeTo(document.getElementById(editor_id+"_forecolor"),'bl');ml.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?-1:1,-1);if(tinyMCE.isOpera)ml.moveBy(0,-2);ml.show();return true;case"HiliteColor":var bcp=new TinyMCE_Layer(editor_id+'_bcPreview',false),p,img;TinyMCE_AdvancedTheme._hideMenus(editor_id);if(!bcp.exists()){bcp.create('div','mceColorPreview',document.getElementById(editor_id+'_toolbar'));elm=bcp.getElement();elm._editor_id=editor_id;elm._command="HiliteColor";elm._switchId=editor_id+"_backcolor";tinyMCE.addEvent(elm,'click',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseover',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseout',TinyMCE_AdvancedTheme._handleMenuEvent)}img=tinyMCE.selectNodes(document.getElementById(editor_id+"_backcolor"),function(n){return n.nodeName=="IMG"})[0];p=tinyMCE.getAbsPosition(img,document.getElementById(editor_id+'_toolbar'));bcp.moveTo(p.absLeft,p.absTop);bcp.getElement().style.backgroundColor=value!=null?value:tinyMCE.getInstanceById(editor_id).backColor;bcp.show();return false;case"HiliteColorMenu":TinyMCE_AdvancedTheme._hideMenus(editor_id);var ml=new TinyMCE_Layer(editor_id+'_bcMenu');if(!ml.exists())ml.create('div','mceMenu',document.body,TinyMCE_AdvancedTheme._getColorHTML(editor_id,'theme_advanced_background_colors','HiliteColor'));tinyMCE.switchClass(editor_id+'_backcolor','mceMenuButtonFocus');ml.moveRelativeTo(document.getElementById(editor_id+"_backcolor"),'bl');ml.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?-1:1,-1);if(tinyMCE.isOpera)ml.moveBy(0,-2);ml.show();return true;case"backcolorpicker":this._pickColor(editor_id,'HiliteColor');return true;case"mceColorPicker":if(user_interface){var template=[];if(!value['callback']&&!value['color'])value['color']=value['document'].getElementById(value['element_id']).value;template['file']='color_picker.htm';template['width']=380;template['height']=250;template['close_previous']="no";template['width']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height',0);if(typeof(value['store_selection'])=="undefined")value['store_selection']=true;tinyMCE.lastColorPickerValue=value;tinyMCE.openWindow(template,{editor_id:editor_id,mce_store_selection:value['store_selection'],inline:"yes",command:"mceColorPicker",input_color:value['color']})}else{var savedVal=tinyMCE.lastColorPickerValue,elm;if(savedVal['callback']){savedVal['callback'](value);return true}elm=savedVal['document'].getElementById(savedVal['element_id']);elm.value=value;if(elm.onchange!=null&&elm.onchange!='')eval('elm.onchange();')}return true;case"mceCodeEditor":var template=new Array();template['file']='source_editor.htm';template['width']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_width",720));template['height']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_height",580));tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"no",inline:"yes"});return true;case"mceCharMap":var template=new Array();template['file']='charmap.htm';template['width']=550+(tinyMCE.isOpera?40:0);template['height']=250;template['width']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceInsertAnchor":var template=new Array();template['file']='anchor.htm';template['width']=320;template['height']=90+(tinyMCE.isNS7?30:0);template['width']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceNewDocument":if(confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_newdocument'))))tinyMCE.execInstanceCommand(editor_id,'mceSetContent',false,' ');return true}return false},getEditorTemplate:function(settings,editorId){function removeFromArray(in_array,remove_array){var outArray=new Array(),skip;for(var i=0;i<in_array.length;i++){skip=false;for(var j=0;j<remove_array.length;j++){if(in_array[i]==remove_array[j]){skip=true}}if(!skip){outArray[outArray.length]=in_array[i]}}return outArray}function addToArray(in_array,add_array){for(var i=0;i<add_array.length;i++){in_array[in_array.length]=add_array[i]}return in_array}var template=new Array();var deltaHeight=0;var resizing=tinyMCE.getParam("theme_advanced_resizing",false);var path=tinyMCE.getParam("theme_advanced_path",true);var statusbarHTML='<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: '+(path?"block":"none")+'">&#160;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: '+(resizing?"block":"none")+'" onmousedown="tinyMCE.themes.advanced._setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';var layoutManager=tinyMCE.getParam("theme_advanced_layout_manager","SimpleLayout");var styleSelectHTML='<option value="">{$lang_theme_style_select}</option>';if(settings['theme_advanced_styles']){var stylesAr=settings['theme_advanced_styles'].split(';');for(var i=0;i<stylesAr.length;i++){var key,value;key=stylesAr[i].split('=')[0];value=stylesAr[i].split('=')[1];styleSelectHTML+='<option value="'+value+'">'+key+'</option>'}TinyMCE_AdvancedTheme._autoImportCSSClasses=false}switch(layoutManager){case"SimpleLayout":var toolbarHTML="";var toolbarLocation=tinyMCE.getParam("theme_advanced_toolbar_location","bottom");var toolbarAlign=tinyMCE.getParam("theme_advanced_toolbar_align","center");var pathLocation=tinyMCE.getParam("theme_advanced_path_location","none");var statusbarLocation=tinyMCE.getParam("theme_advanced_statusbar_location",pathLocation);var defVals={theme_advanced_buttons1:"bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,separator,sub,sup,separator,charmap"};toolbarHTML+='<a href="#" accesskey="q" title="'+tinyMCE.getLang("lang_toolbar_focus")+'"';if(!tinyMCE.getParam("accessibility_focus"))toolbarHTML+=' onfocus="tinyMCE.getInstanceById(\''+editorId+'\').getWin().focus();"';toolbarHTML+='></a>';for(var i=1;i<100;i++){var def=defVals["theme_advanced_buttons"+i];var buttons=tinyMCE.getParam("theme_advanced_buttons"+i,def==null?'':def,true,',');if(buttons.length==0)break;buttons=removeFromArray(buttons,tinyMCE.getParam("theme_advanced_disable","",true,','));buttons=addToArray(buttons,tinyMCE.getParam("theme_advanced_buttons"+i+"_add","",true,','));buttons=addToArray(tinyMCE.getParam("theme_advanced_buttons"+i+"_add_before","",true,','),buttons);for(var b=0;b<buttons.length;b++)toolbarHTML+=tinyMCE.getControlHTML(buttons[b]);if(buttons.length>0){toolbarHTML+="<br />";deltaHeight-=23}}toolbarHTML+='<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\''+editorId+'\').getWin().focus();"></a>';template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width_style};height:{$height_style}"><tbody>';if(toolbarLocation=="top")template['html']+='<tr><td dir="ltr" class="mceToolbarTop" align="'+toolbarAlign+'" height="1" nowrap="nowrap"><span id="'+editorId+'_toolbar" class="mceToolbarContainer">'+toolbarHTML+'</span></td></tr>';if(statusbarLocation=="top"){template['html']+='<tr><td class="mceStatusbarTop" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23}template['html']+='<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';if(toolbarLocation=="bottom")template['html']+='<tr><td dir="ltr" class="mceToolbarBottom" align="'+toolbarAlign+'" height="1"><span id="'+editorId+'_toolbar" class="mceToolbarContainer">'+toolbarHTML+'</span></td></tr>';if(toolbarLocation=="external"){var bod=document.body;var elm=document.createElement("div");toolbarHTML=tinyMCE.replaceVar(toolbarHTML,'style_select_options',styleSelectHTML);toolbarHTML=tinyMCE.applyTemplate(toolbarHTML,{editor_id:editorId});elm.className="mceToolbarExternal";elm.id=editorId+"_toolbar";elm.innerHTML='<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';bod.appendChild(elm);deltaHeight=0;tinyMCE.getInstanceById(editorId).toolbarElement=elm;}else{tinyMCE.getInstanceById(editorId).toolbarElement=null}if(statusbarLocation=="bottom"){template['html']+='<tr><td class="mceStatusbarBottom" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23}template['html']+='</tbody></table>';break;case"RowLayout":template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';var containers=tinyMCE.getParam("theme_advanced_containers","",true,",");var defaultContainerCSS=tinyMCE.getParam("theme_advanced_containers_default_class","container");var defaultContainerAlign=tinyMCE.getParam("theme_advanced_containers_default_align","center");for(var i=0;i<containers.length;i++){if(containers[i]=="mceEditor")template['html']+='<tr><td align="center" class="mceEditor_border"><span id="{$editor_id}"></span></td></tr>';else if(containers[i]=="mceElementpath"||containers[i]=="mceStatusbar"){var pathClass="mceStatusbar";if(i==containers.length-1){pathClass="mceStatusbarBottom"}else if(i==0){pathClass="mceStatusbar"}else{deltaHeight-=2}template['html']+='<tr><td class="'+pathClass+'" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=22}else{var curContainer=tinyMCE.getParam("theme_advanced_container_"+containers[i],"",true,',');var curContainerHTML="";var curAlign=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align",defaultContainerAlign);var curCSS=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class",defaultContainerCSS);curContainer=removeFromArray(curContainer,tinyMCE.getParam("theme_advanced_disable","",true,','));for(var j=0;j<curContainer.length;j++)curContainerHTML+=tinyMCE.getControlHTML(curContainer[j]);if(curContainer.length>0){curContainerHTML+="<br />";deltaHeight-=23}template['html']+='<tr><td class="'+curCSS+'" align="'+curAlign+'" height="1">'+curContainerHTML+'</td></tr>'}}template['html']+='</tbody></table>';break;case"CustomLayout":var customLayout=tinyMCE.getParam("theme_advanced_custom_layout","");if(customLayout!=""&&eval("typeof("+customLayout+")")!="undefined"){template=eval(customLayout+"(template);")}break}if(resizing)template['html']+='<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';template['html']=tinyMCE.replaceVar(template['html'],'style_select_options',styleSelectHTML);if(!template['delta_width'])template['delta_width']=0;if(!template['delta_height'])template['delta_height']=deltaHeight;return template},initInstance:function(inst){if(tinyMCE.getParam("theme_advanced_resizing",false)){if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var w=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_width");var h=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_height");TinyMCE_AdvancedTheme._resizeTo(inst,w,h,tinyMCE.getParam("theme_advanced_resize_horizontal",true))}}inst.addShortcut('ctrl','k','lang_link_desc','mceLink')},removeInstance:function(inst){new TinyMCE_Layer(inst.editorId+'_fcMenu').remove();new TinyMCE_Layer(inst.editorId+'_bcMenu').remove()},hideInstance:function(inst){TinyMCE_AdvancedTheme._hideMenus(inst.editorId)},_handleMenuEvent:function(e){var te=tinyMCE.isMSIE?window.event.srcElement:e.target;tinyMCE._menuButtonEvent(e.type=="mouseover"?"over":"out",document.getElementById(te._switchId));if(e.type=="click")tinyMCE.execInstanceCommand(te._editor_id,te._command)},_hideMenus:function(id){var fcml=new TinyMCE_Layer(id+'_fcMenu'),bcml=new TinyMCE_Layer(id+'_bcMenu');if(fcml.exists()&&fcml.isVisible()){tinyMCE.switchClass(id+'_forecolor','mceMenuButton');fcml.hide()}if(bcml.exists()&&bcml.isVisible()){tinyMCE.switchClass(id+'_backcolor','mceMenuButton');bcml.hide()}},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection,setup_content){var alignNode,breakOut,classNode;function selectByValue(select_elm,value,first_index){first_index=typeof(first_index)=="undefined"?false:true;if(select_elm){for(var i=0;i<select_elm.options.length;i++){var ov=""+select_elm.options[i].value;if(first_index&&ov.toLowerCase().indexOf(value.toLowerCase())==0){select_elm.selectedIndex=i;return true}if(ov==value){select_elm.selectedIndex=i;return true}}}return false};if(node==null)return;var pathElm=document.getElementById(editor_id+"_path");var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();TinyMCE_AdvancedTheme._hideMenus(editor_id);if(pathElm){var parentNode=node;var path=new Array();while(parentNode!=null){if(parentNode.nodeName.toUpperCase()=="BODY"){break}if(parentNode.nodeType==1&&tinyMCE.getAttrib(parentNode,"class").indexOf('mceItemHidden')==-1){path[path.length]=parentNode}parentNode=parentNode.parentNode}var html="";for(var i=path.length-1;i>=0;i--){var nodeName=path[i].nodeName.toLowerCase();var nodeData="";if(nodeName.indexOf("html:")==0)nodeName=nodeName.substring(5);if(nodeName=="b"){nodeName="strong"}if(nodeName=="i"){nodeName="em"}if(nodeName=="span"){var cn=tinyMCE.getAttrib(path[i],"class");if(cn!=""&&cn.indexOf('mceItem')==-1)nodeData+="class: "+cn+" ";var st=tinyMCE.getAttrib(path[i],"style");if(st!=""){st=tinyMCE.serializeStyle(tinyMCE.parseStyle(st));nodeData+="style: "+tinyMCE.xmlEncode(st)+" "}}if(nodeName=="font"){if(tinyMCE.getParam("convert_fonts_to_spans"))nodeName="span";var face=tinyMCE.getAttrib(path[i],"face");if(face!="")nodeData+="font: "+tinyMCE.xmlEncode(face)+" ";var size=tinyMCE.getAttrib(path[i],"size");if(size!="")nodeData+="size: "+tinyMCE.xmlEncode(size)+" ";var color=tinyMCE.getAttrib(path[i],"color");if(color!="")nodeData+="color: "+tinyMCE.xmlEncode(color)+" "}if(tinyMCE.getAttrib(path[i],'id')!=""){nodeData+="id: "+path[i].getAttribute('id')+" "}var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1)nodeData+="class: "+className+" ";if(tinyMCE.getAttrib(path[i],'src')!=""){var src=tinyMCE.getAttrib(path[i],"mce_src");if(src=="")src=tinyMCE.getAttrib(path[i],"src");nodeData+="src: "+tinyMCE.xmlEncode(src)+" "}if(path[i].nodeName=='A'&&tinyMCE.getAttrib(path[i],'href')!=""){var href=tinyMCE.getAttrib(path[i],"mce_href");if(href=="")href=tinyMCE.getAttrib(path[i],"href");nodeData+="href: "+tinyMCE.xmlEncode(href)+" "}className=tinyMCE.getAttrib(path[i],"class");if((nodeName=="img"||nodeName=="span")&&className.indexOf('mceItem')!=-1){nodeName=className.replace(/mceItem([a-z]+)/gi,'$1').toLowerCase();nodeData=path[i].getAttribute('title')}if(nodeName=="a"&&(anchor=tinyMCE.getAttrib(path[i],"name"))!=""){nodeName="a";nodeName+="#"+tinyMCE.xmlEncode(anchor);nodeData=""}if(tinyMCE.getAttrib(path[i],'name').indexOf("mce_")!=0){var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1){nodeName+="."+className}}var cmd='tinyMCE.execInstanceCommand(\''+editor_id+'\',\'mceSelectNodeDepth\',false,\''+i+'\');';html+='<a title="'+nodeData+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" target="_self" class="mcePathItem">'+nodeName+'</a>';if(i>0){html+=" &raquo; "}}pathElm.innerHTML='<a href="#" accesskey="x"></a>'+tinyMCE.getLang('lang_theme_path')+": "+html+'&#160;'}tinyMCE.switchClass(editor_id+'_justifyleft','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifyright','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifyfull','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClass(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClass(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClass(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_numlist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_sub','mceButtonNormal');tinyMCE.switchClass(editor_id+'_sup','mceButtonNormal');tinyMCE.switchClass(editor_id+'_anchor','mceButtonNormal');tinyMCE.switchClass(editor_id+'_link','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_unlink','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_outdent','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_image','mceButtonNormal');tinyMCE.switchClass(editor_id+'_hr','mceButtonNormal');if(node.nodeName=="A"&&tinyMCE.getAttrib(node,"class").indexOf('mceItemAnchor')!=-1)tinyMCE.switchClass(editor_id+'_anchor','mceButtonSelected');var anchorLink=tinyMCE.getParentElement(node,"a","href");if(anchorLink||any_selection){tinyMCE.switchClass(editor_id+'_link',anchorLink?'mceButtonSelected':'mceButtonNormal');tinyMCE.switchClass(editor_id+'_unlink',anchorLink?'mceButtonSelected':'mceButtonNormal')}tinyMCE.switchClass(editor_id+'_visualaid',visual_aid?'mceButtonSelected':'mceButtonNormal');if(undo_levels!=-1){tinyMCE.switchClass(editor_id+'_undo','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_redo','mceButtonDisabled')}if(tinyMCE.getParentElement(node,"li,blockquote"))tinyMCE.switchClass(editor_id+'_outdent','mceButtonNormal');if(undo_index!=-1&&(undo_index<undo_levels-1&&undo_levels>0))tinyMCE.switchClass(editor_id+'_redo','mceButtonNormal');if(undo_index!=-1&&(undo_index>0&&undo_levels>0))tinyMCE.switchClass(editor_id+'_undo','mceButtonNormal');var selectElm=document.getElementById(editor_id+"_styleSelect");if(selectElm){TinyMCE_AdvancedTheme._setupCSSClasses(editor_id);classNode=node;breakOut=false;var index=0;do{if(classNode&&classNode.className){for(var i=0;i<selectElm.options.length;i++){if(selectElm.options[i].value==classNode.className){index=i;breakOut=true;break}}}}while(!breakOut&&classNode!=null&&(classNode=classNode.parentNode)!=null);selectElm.selectedIndex=index}var selectElm=document.getElementById(editor_id+"_formatSelect");if(selectElm){var elm=tinyMCE.getParentElement(node,"p,div,h1,h2,h3,h4,h5,h6,pre,address");if(elm)selectByValue(selectElm,"<"+elm.nodeName.toLowerCase()+">");else selectByValue(selectElm,"")}var selectElm=document.getElementById(editor_id+"_fontNameSelect");if(selectElm){if(!tinyMCE.isSafari&&!(tinyMCE.isMSIE&&!tinyMCE.isOpera)){var face=inst.queryCommandValue('FontName');face=face==null||face==""?"":face;selectByValue(selectElm,face,face!="")}else{var elm=tinyMCE.getParentElement(node,"font","face");if(elm){var family=tinyMCE.getAttrib(elm,"face");if(family=='')family=''+elm.style.fontFamily;if(!selectByValue(selectElm,family,family!=""))selectByValue(selectElm,"")}else selectByValue(selectElm,"")}}var selectElm=document.getElementById(editor_id+"_fontSizeSelect");if(selectElm){if(!tinyMCE.isSafari&&!tinyMCE.isOpera){var size=inst.queryCommandValue('FontSize');selectByValue(selectElm,size==null||size==""?"0":size)}else{var elm=tinyMCE.getParentElement(node,"font","size");if(elm){var size=tinyMCE.getAttrib(elm,"size");if(size==''){var sizes=new Array('','8px','10px','12px','14px','18px','24px','36px');size=''+elm.style.fontSize;for(var i=0;i<sizes.length;i++){if((''+sizes[i])==size){size=i;break}}}if(!selectByValue(selectElm,size))selectByValue(selectElm,"")}else selectByValue(selectElm,"0")}}alignNode=node;breakOut=false;do{if(!alignNode.getAttribute||!alignNode.getAttribute('align'))continue;switch(alignNode.getAttribute('align').toLowerCase()){case"left":tinyMCE.switchClass(editor_id+'_justifyleft','mceButtonSelected');breakOut=true;break;case"right":tinyMCE.switchClass(editor_id+'_justifyright','mceButtonSelected');breakOut=true;break;case"middle":case"center":tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonSelected');breakOut=true;break;case"justify":tinyMCE.switchClass(editor_id+'_justifyfull','mceButtonSelected');breakOut=true;break}}while(!breakOut&&(alignNode=alignNode.parentNode)!=null);var div=tinyMCE.getParentElement(node,"div");if(div&&div.style.textAlign=="center")tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonSelected');if(!setup_content){var ar=new Array("Bold","_bold","Italic","_italic","Strikethrough","_strikethrough","superscript","_sup","subscript","_sub");for(var i=0;i<ar.length;i+=2){if(inst.queryCommandState(ar[i]))tinyMCE.switchClass(editor_id+ar[i+1],'mceButtonSelected')}if(inst.queryCommandState("Underline")&&(node.parentNode==null||node.parentNode.nodeName!="A"))tinyMCE.switchClass(editor_id+'_underline','mceButtonSelected')}do{switch(node.nodeName){case"UL":tinyMCE.switchClass(editor_id+'_bullist','mceButtonSelected');break;case"OL":tinyMCE.switchClass(editor_id+'_numlist','mceButtonSelected');break;case"HR":tinyMCE.switchClass(editor_id+'_hr','mceButtonSelected');break;case"IMG":if(tinyMCE.getAttrib(node,'name').indexOf('mce_')!=0&&tinyMCE.getAttrib(node,'class').indexOf('mceItem')==-1){tinyMCE.switchClass(editor_id+'_image','mceButtonSelected')}break}}while((node=node.parentNode)!=null)},_setupCSSClasses:function(editor_id){var i,selectElm;if(!TinyMCE_AdvancedTheme._autoImportCSSClasses)return;selectElm=document.getElementById(editor_id+'_styleSelect');if(selectElm&&selectElm.getAttribute('cssImported')!='true'){var csses=tinyMCE.getCSSClasses(editor_id);if(csses&&selectElm){for(i=0;i<csses.length;i++)selectElm.options[selectElm.options.length]=new Option(csses[i],csses[i])}if(csses!=null&&csses.length>0)selectElm.setAttribute('cssImported','true')}},_setCookie:function(name,value,expires,path,domain,secure){var curCookie=name+"="+escape(value)+((expires)?"; expires="+expires.toGMTString():"")+((path)?"; path="+escape(path):"")+((domain)?"; domain="+domain:"")+((secure)?"; secure":"");document.cookie=curCookie},_getCookie:function(name){var dc=document.cookie;var prefix=name+"=";var begin=dc.indexOf("; "+prefix);if(begin==-1){begin=dc.indexOf(prefix);if(begin!=0)return null}else begin+=2;var end=document.cookie.indexOf(";",begin);if(end==-1)end=dc.length;return unescape(dc.substring(begin+prefix.length,end))},_resizeTo:function(inst,w,h,set_w){var editorContainer=document.getElementById(inst.editorId+'_parent');var tableElm=editorContainer.firstChild;var iframe=inst.iframeElement;if(w==null||w=="null"){set_w=false;w=0}if(h==null||h=="null")return;w=parseInt(w);h=parseInt(h);if(tinyMCE.isGecko){w+=2;h+=2}var dx=w-tableElm.clientWidth;var dy=h-tableElm.clientHeight;w=w<1?30:w;h=h<1?30:h;if(set_w)tableElm.style.width=w+"px";tableElm.style.height=h+"px";iw=iframe.clientWidth+dx;ih=iframe.clientHeight+dy;iw=iw<1?30:iw;ih=ih<1?30:ih;if(tinyMCE.isGecko){iw-=2;ih-=2}if(set_w)iframe.style.width=iw+"px";iframe.style.height=ih+"px";if(set_w){var tableBodyElm=tableElm.firstChild;var minIframeWidth=tableBodyElm.scrollWidth;if(inst.iframeElement.clientWidth<minIframeWidth){dx=minIframeWidth-inst.iframeElement.clientWidth;inst.iframeElement.style.width=(iw+dx)+"px"}}inst.useCSS=false},_resizeEventHandler:function(e){var resizer=TinyMCE_AdvancedTheme._resizer;if(!resizer.resizing)return;e=typeof(e)=="undefined"?window.event:e;var dx=e.screenX-resizer.downX;var dy=e.screenY-resizer.downY;var resizeBox=resizer.resizeBox;var editorId=resizer.editorId;switch(e.type){case"mousemove":var w,h;w=resizer.width+dx;h=resizer.height+dy;w=w<1?1:w;h=h<1?1:h;if(resizer.horizontal)resizeBox.style.width=w+"px";resizeBox.style.height=h+"px";break;case"mouseup":TinyMCE_AdvancedTheme._setResizing(e,editorId,false);TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId),resizer.width+dx,resizer.height+dy,resizer.horizontal);if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var expires=new Date();expires.setTime(expires.getTime()+3600000*24*30);TinyMCE_AdvancedTheme._setCookie("TinyMCE_"+editorId+"_width",""+(resizer.horizontal?resizer.width+dx:""),expires);TinyMCE_AdvancedTheme._setCookie("TinyMCE_"+editorId+"_height",""+(resizer.height+dy),expires)}break}},_setResizing:function(e,editor_id,state){e=typeof(e)=="undefined"?window.event:e;var resizer=TinyMCE_AdvancedTheme._resizer;var editorContainer=document.getElementById(editor_id+'_parent');var editorArea=document.getElementById(editor_id+'_parent').firstChild;var resizeBox=document.getElementById(editor_id+'_resize_box');var inst=tinyMCE.getInstanceById(editor_id);if(state){var width=editorArea.clientWidth;var height=editorArea.clientHeight;resizeBox.style.width=width+"px";resizeBox.style.height=height+"px";resizer.iframeWidth=inst.iframeElement.clientWidth;resizer.iframeHeight=inst.iframeElement.clientHeight;editorArea.style.display="none";resizeBox.style.display="block";if(!resizer.eventHandlers){if(tinyMCE.isMSIE)tinyMCE.addEvent(document,"mousemove",TinyMCE_AdvancedTheme._resizeEventHandler);else tinyMCE.addEvent(window,"mousemove",TinyMCE_AdvancedTheme._resizeEventHandler);tinyMCE.addEvent(document,"mouseup",TinyMCE_AdvancedTheme._resizeEventHandler);resizer.eventHandlers=true}resizer.resizing=true;resizer.downX=e.screenX;resizer.downY=e.screenY;resizer.width=parseInt(resizeBox.style.width);resizer.height=parseInt(resizeBox.style.height);resizer.editorId=editor_id;resizer.resizeBox=resizeBox;resizer.horizontal=tinyMCE.getParam("theme_advanced_resize_horizontal",true)}else{resizer.resizing=false;resizeBox.style.display="none";editorArea.style.display=tinyMCE.isMSIE&&!tinyMCE.isOpera?"block":"table";tinyMCE.execCommand('mceResetDesignMode')}},_getColorHTML:function(id,n,cm){var i,h,cl;h='<span class="mceMenuLine"></span>';cl=tinyMCE.getParam(n,TinyMCE_AdvancedTheme._defColors).split(',');h+='<table class="mceColors"><tr>';for(i=0;i<cl.length;i++){c='tinyMCE.execInstanceCommand(\''+id+'\', \''+cm+'\', false, \'#'+cl[i]+'\');';h+='<td><a href="javascript:'+c+'" style="background-color: #'+cl[i]+'" onclick="'+c+';return false;"></a></td>';if((i+1)%8==0)h+='</tr><tr>'}h+='</tr></table>';if(tinyMCE.getParam("theme_advanced_more_colors",true))h+='<a href="javascript:void(0);" onclick="TinyMCE_AdvancedTheme._pickColor(\''+id+'\',\''+cm+'\');" class="mceMoreColors">'+tinyMCE.getLang('lang_more_colors')+'</a>';return h},_pickColor:function(id,cm){var inputColor,inst=tinyMCE.selectedInstance;if(cm=='forecolor'&&inst)inputColor=inst.foreColor;if((cm=='backcolor'||cm=='HiliteColor')&&inst)inputColor=inst.backColor;tinyMCE.execCommand('mceColorPicker',true,{color:inputColor,callback:function(c){tinyMCE.execInstanceCommand(id,cm,false,c)}})},_insertImage:function(src,alt,border,hspace,vspace,width,height,align,title,onmouseover,onmouseout){tinyMCE.execCommand("mceInsertContent",false,tinyMCE.createTagHTML('img',{src:tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],src),mce_src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout}))},_insertLink:function(href,target,title,onclick,style_class){tinyMCE.execCommand('mceBeginUndoLevel');if(tinyMCE.selectedInstance&&tinyMCE.selectedElement&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){var doc=tinyMCE.selectedInstance.getDoc();var linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");var newLink=false;if(!linkElement){linkElement=doc.createElement("a");newLink=true}var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(linkElement,'href',thref);tinyMCE.setAttrib(linkElement,'mce_href',mhref);tinyMCE.setAttrib(linkElement,'target',target);tinyMCE.setAttrib(linkElement,'title',title);tinyMCE.setAttrib(linkElement,'onclick',onclick);tinyMCE.setAttrib(linkElement,'class',style_class);if(newLink){linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));tinyMCE.selectedElement.parentNode.replaceChild(linkElement,tinyMCE.selectedElement)}return}if(!tinyMCE.linkElement&&tinyMCE.selectedInstance){if(tinyMCE.isSafari){tinyMCE.execCommand("mceInsertContent",false,'<a href="'+tinyMCE.uniqueURL+'">'+tinyMCE.selectedInstance.selection.getSelectedHTML()+'</a>')}else tinyMCE.selectedInstance.contentDocument.execCommand("createlink",false,tinyMCE.uniqueURL);tinyMCE.linkElement=tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);var elementArray=tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);for(var i=0;i<elementArray.length;i++){var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, elementArray[i]);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(elementArray[i],'href',thref);tinyMCE.setAttrib(elementArray[i],'mce_href',mhref);tinyMCE.setAttrib(elementArray[i],'target',target);tinyMCE.setAttrib(elementArray[i],'title',title);tinyMCE.setAttrib(elementArray[i],'onclick',onclick);tinyMCE.setAttrib(elementArray[i],'class',style_class)}tinyMCE.linkElement=elementArray[0]}if(tinyMCE.linkElement){var mhref=href;href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(tinyMCE.linkElement,'href',href);tinyMCE.setAttrib(tinyMCE.linkElement,'mce_href',mhref);tinyMCE.setAttrib(tinyMCE.linkElement,'target',target);tinyMCE.setAttrib(tinyMCE.linkElement,'title',title);tinyMCE.setAttrib(tinyMCE.linkElement,'onclick',onclick);tinyMCE.setAttrib(tinyMCE.linkElement,'class',style_class)}tinyMCE.execCommand('mceEndUndoLevel')}};tinyMCE.addTheme("advanced",TinyMCE_AdvancedTheme);tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);
\ No newline at end of file
index a0217d19c4d93755b2f4713a8163b212b861c199..06544d749b0eaa523c671cda5e0f3bbb411e9769 100644 (file)
-/**\r
- * $Id: editor_template_src.js 256 2007-04-24 09:03:20Z spocke $\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-/* Import theme specific language pack */\r
-tinyMCE.importThemeLanguagePack('advanced');\r
-\r
-var TinyMCE_AdvancedTheme = {\r
-       // Private theme fields\r
-       _defColors : "000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",\r
-       _autoImportCSSClasses : true,\r
-       _resizer : {},\r
-       _buttons : [\r
-               // Control id, button img, button title, command, user_interface, value\r
-               ['bold', '{$lang_bold_img}', 'lang_bold_desc', 'Bold'],\r
-               ['italic', '{$lang_italic_img}', 'lang_italic_desc', 'Italic'],\r
-               ['underline', '{$lang_underline_img}', 'lang_underline_desc', 'Underline'],\r
-               ['strikethrough', 'strikethrough.gif', 'lang_striketrough_desc', 'Strikethrough'],\r
-               ['justifyleft', 'justifyleft.gif', 'lang_justifyleft_desc', 'JustifyLeft'],\r
-               ['justifycenter', 'justifycenter.gif', 'lang_justifycenter_desc', 'JustifyCenter'],\r
-               ['justifyright', 'justifyright.gif', 'lang_justifyright_desc', 'JustifyRight'],\r
-               ['justifyfull', 'justifyfull.gif', 'lang_justifyfull_desc', 'JustifyFull'],\r
-               ['bullist', 'bullist.gif', 'lang_bullist_desc', 'InsertUnorderedList'],\r
-               ['numlist', 'numlist.gif', 'lang_numlist_desc', 'InsertOrderedList'],\r
-               ['outdent', 'outdent.gif', 'lang_outdent_desc', 'Outdent'],\r
-               ['indent', 'indent.gif', 'lang_indent_desc', 'Indent'],\r
-               ['cut', 'cut.gif', 'lang_cut_desc', 'Cut'],\r
-               ['copy', 'copy.gif', 'lang_copy_desc', 'Copy'],\r
-               ['paste', 'paste.gif', 'lang_paste_desc', 'Paste'],\r
-               ['undo', 'undo.gif', 'lang_undo_desc', 'Undo'],\r
-               ['redo', 'redo.gif', 'lang_redo_desc', 'Redo'],\r
-               ['link', 'link.gif', 'lang_link_desc', 'mceLink', true],\r
-               ['unlink', 'unlink.gif', 'lang_unlink_desc', 'unlink'],\r
-               ['image', 'image.gif', 'lang_image_desc', 'mceImage', true],\r
-               ['cleanup', 'cleanup.gif', 'lang_cleanup_desc', 'mceCleanup'],\r
-               ['help', 'help.gif', 'lang_help_desc', 'mceHelp'],\r
-               ['code', 'code.gif', 'lang_theme_code_desc', 'mceCodeEditor'],\r
-               ['hr', 'hr.gif', 'lang_theme_hr_desc', 'inserthorizontalrule'],\r
-               ['removeformat', 'removeformat.gif', 'lang_theme_removeformat_desc', 'removeformat'],\r
-               ['sub', 'sub.gif', 'lang_theme_sub_desc', 'subscript'],\r
-               ['sup', 'sup.gif', 'lang_theme_sup_desc', 'superscript'],\r
-               ['forecolor', 'forecolor.gif', 'lang_theme_forecolor_desc', 'forecolor', true],\r
-               ['forecolorpicker', 'forecolor.gif', 'lang_theme_forecolor_desc', 'forecolorpicker', true],\r
-               ['backcolor', 'backcolor.gif', 'lang_theme_backcolor_desc', 'HiliteColor', true],\r
-               ['backcolorpicker', 'backcolor.gif', 'lang_theme_backcolor_desc', 'backcolorpicker', true],\r
-               ['charmap', 'charmap.gif', 'lang_theme_charmap_desc', 'mceCharMap'],\r
-               ['visualaid', 'visualaid.gif', 'lang_theme_visualaid_desc', 'mceToggleVisualAid'],\r
-               ['anchor', 'anchor.gif', 'lang_theme_anchor_desc', 'mceInsertAnchor'],\r
-               ['newdocument', 'newdocument.gif', 'lang_newdocument_desc', 'mceNewDocument']\r
-       ],\r
-\r
-       _buttonMap : 'anchor,backcolor,bold,bullist,charmap,cleanup,code,copy,cut,forecolor,help,hr,image,indent,italic,justifycenter,justifyfull,justifyleft,justifyright,link,newdocument,numlist,outdent,paste,redo,removeformat,strikethrough,sub,sup,underline,undo,unlink,visualaid,advhr,ltr,rtl,emotions,flash,fullpage,fullscreen,iespell,insertdate,inserttime,pastetext,pasteword,selectall,preview,print,save,replace,search,table,cell_props,delete_col,delete_row,col_after,col_before,row_after,row_before,merge_cells,row_props,split_cells,delete_table',\r
-\r
-       /**\r
-        * Returns HTML code for the specificed control.\r
-        */\r
-       getControlHTML : function(button_name) {\r
-               var i, x, but;\r
-\r
-               // Lookup button in button list\r
-               for (i=0; i<TinyMCE_AdvancedTheme._buttons.length; i++) {\r
-                       but = TinyMCE_AdvancedTheme._buttons[i];\r
-\r
-                       if (but[0] == button_name && (button_name == "forecolor" || button_name == "backcolor"))\r
-                               return tinyMCE.getMenuButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3] + "Menu", but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null));\r
-\r
-                       if (but[0] == button_name)\r
-                               return tinyMCE.getButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null));\r
-               }\r
-\r
-               // Custom controlls other than buttons\r
-               switch (button_name) {\r
-                       case "formatselect":\r
-                               var html = '<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';\r
-                               var formats = tinyMCE.getParam("theme_advanced_blockformats", "p,address,pre,h1,h2,h3,h4,h5,h6", true).split(',');\r
-                               var lookup = [\r
-                                       ['p', '{$lang_theme_paragraph}'],\r
-                                       ['address', '{$lang_theme_address}'],\r
-                                       ['pre', '{$lang_theme_pre}'],\r
-                                       ['h1', '{$lang_theme_h1}'],\r
-                                       ['h2', '{$lang_theme_h2}'],\r
-                                       ['h3', '{$lang_theme_h3}'],\r
-                                       ['h4', '{$lang_theme_h4}'],\r
-                                       ['h5', '{$lang_theme_h5}'],\r
-                                       ['h6', '{$lang_theme_h6}'],\r
-                                       ['div', '{$lang_theme_div}'],\r
-                                       ['blockquote', '{$lang_theme_blockquote}'],\r
-                                       ['code', '{$lang_theme_code}'],\r
-                                       ['dt', '{$lang_theme_dt}'],\r
-                                       ['dd', '{$lang_theme_dd}'],\r
-                                       ['samp', '{$lang_theme_samp}']\r
-                               ];\r
-\r
-                               html += '<option value="">{$lang_theme_block}</option>';\r
-\r
-                               // Build format select\r
-                               for (var i=0; i<formats.length; i++) {\r
-                                       for (var x=0; x<lookup.length; x++) {\r
-                                               if (formats[i] == lookup[x][0])\r
-                                                       html += '<option value="&lt;' + lookup[x][0] + '&gt;">' + lookup[x][1] + '</option>';\r
-                                       }\r
-                               }\r
-\r
-                               html += '</select>';\r
-\r
-                               return html;\r
-\r
-                       case "styleselect":\r
-                               return '<select id="{$editor_id}_styleSelect" onmousedown="tinyMCE.themes.advanced._setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event,this,window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';\r
-\r
-                       case "fontselect":\r
-                               var fontHTML = '<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';\r
-                               var iFonts = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';\r
-                               var nFonts = 'Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sand;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';\r
-                               var fonts = tinyMCE.getParam("theme_advanced_fonts", nFonts).split(';');\r
-                               for (i=0; i<fonts.length; i++) {\r
-                                       if (fonts[i] != '') {\r
-                                               var parts = fonts[i].split('=');\r
-                                               fontHTML += '<option value="' + parts[1] + '">' + parts[0] + '</option>';\r
-                                       }\r
-                               }\r
-\r
-                               fontHTML += '</select>';\r
-                               return fontHTML;\r
-\r
-                       case "fontsizeselect":\r
-                               return '<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+\r
-                                               '<option value="0">{$lang_theme_font_size}</option>'+\r
-                                               '<option value="1">1 (8 pt)</option>'+\r
-                                               '<option value="2">2 (10 pt)</option>'+\r
-                                               '<option value="3">3 (12 pt)</option>'+\r
-                                               '<option value="4">4 (14 pt)</option>'+\r
-                                               '<option value="5">5 (18 pt)</option>'+\r
-                                               '<option value="6">6 (24 pt)</option>'+\r
-                                               '<option value="7">7 (36 pt)</option>'+\r
-                                               '</select>';\r
-\r
-                       case "|":\r
-                       case "separator":\r
-                               return '<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" alt="" />';\r
-\r
-                       case "spacer":\r
-                               return '<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" alt="" />';\r
-\r
-                       case "rowseparator":\r
-                               return '<br />';\r
-               }\r
-\r
-               return "";\r
-       },\r
-\r
-       /**\r
-        * Theme specific execcommand handling.\r
-        */\r
-       execCommand : function(editor_id, element, command, user_interface, value) {\r
-               switch (command) {\r
-                       case 'mceHelp':\r
-                               tinyMCE.openWindow({\r
-                                       file : 'about.htm',\r
-                                       width : 480,\r
-                                       height : 380\r
-                               }, {\r
-                                       tinymce_version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion,\r
-                                       tinymce_releasedate : tinyMCE.releaseDate,\r
-                                       inline : "yes"\r
-                               });\r
-                       return true;\r
-\r
-                       case "mceLink":\r
-                               var inst = tinyMCE.getInstanceById(editor_id);\r
-                               var doc = inst.getDoc();\r
-                               var selectedText = "";\r
-\r
-                               if (tinyMCE.isMSIE) {\r
-                                       var rng = doc.selection.createRange();\r
-                                       selectedText = rng.text;\r
-                               } else\r
-                                       selectedText = inst.getSel().toString();\r
-\r
-                               if (!tinyMCE.linkElement) {\r
-                                       if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0))\r
-                                               return true;\r
-                               }\r
-\r
-                               var href = "", target = "", title = "", onclick = "", action = "insert", style_class = "";\r
-\r
-                               if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a")\r
-                                       tinyMCE.linkElement = tinyMCE.selectedElement;\r
-\r
-                               // Is anchor not a link\r
-                               if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "")\r
-                                       tinyMCE.linkElement = null;\r
-\r
-                               if (tinyMCE.linkElement) {\r
-                                       href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href');\r
-                                       target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target');\r
-                                       title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title');\r
-                                       onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');\r
-                                       style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class');\r
-\r
-                                       // Try old onclick to if copy/pasted content\r
-                                       if (onclick == "")\r
-                                               onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');\r
-\r
-                                       onclick = tinyMCE.cleanupEventStr(onclick);\r
-\r
-                                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");\r
-\r
-                                       // Use mce_href if defined\r
-                                       mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_href');\r
-                                       if (mceRealHref != "") {\r
-                                               href = mceRealHref;\r
-\r
-                                               if (tinyMCE.getParam('convert_urls'))\r
-                                                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");\r
-                                       }\r
-\r
-                                       action = "update";\r
-                               }\r
-\r
-                               var template = new Array();\r
-\r
-                               template['file'] = 'link.htm';\r
-                               template['width'] = 310;\r
-                               template['height'] = 200;\r
-\r
-                               // Language specific width and height addons\r
-                               template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0);\r
-                               template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0);\r
-\r
-                               if (inst.settings['insertlink_callback']) {\r
-                                       var returnVal = eval(inst.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);");\r
-                                       if (returnVal && returnVal['href'])\r
-                                               TinyMCE_AdvancedTheme._insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']);\r
-                               } else {\r
-                                       tinyMCE.openWindow(template, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class, inline : "yes"});\r
-                               }\r
-\r
-                               return true;\r
-\r
-                       case "mceImage":\r
-                               var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = "";\r
-                               var title = "", onmouseover = "", onmouseout = "", action = "insert";\r
-                               var img = tinyMCE.imgElement;\r
-                               var inst = tinyMCE.getInstanceById(editor_id);\r
-\r
-                               if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {\r
-                                       img = tinyMCE.selectedElement;\r
-                                       tinyMCE.imgElement = img;\r
-                               }\r
-\r
-                               if (img) {\r
-                                       // Is it a internal MCE visual aid image, then skip this one.\r
-                                       if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0)\r
-                                               return true;\r
-\r
-                                       src = tinyMCE.getAttrib(img, 'src');\r
-                                       alt = tinyMCE.getAttrib(img, 'alt');\r
-\r
-                                       // Try polling out the title\r
-                                       if (alt == "")\r
-                                               alt = tinyMCE.getAttrib(img, 'title');\r
-\r
-                                       // Fix width/height attributes if the styles is specified\r
-                                       if (tinyMCE.isGecko) {\r
-                                               var w = img.style.width;\r
-                                               if (w != null && w != "")\r
-                                                       img.setAttribute("width", w);\r
-\r
-                                               var h = img.style.height;\r
-                                               if (h != null && h != "")\r
-                                                       img.setAttribute("height", h);\r
-                                       }\r
-\r
-                                       border = tinyMCE.getAttrib(img, 'border');\r
-                                       hspace = tinyMCE.getAttrib(img, 'hspace');\r
-                                       vspace = tinyMCE.getAttrib(img, 'vspace');\r
-                                       width = tinyMCE.getAttrib(img, 'width');\r
-                                       height = tinyMCE.getAttrib(img, 'height');\r
-                                       align = tinyMCE.getAttrib(img, 'align');\r
-                                       onmouseover = tinyMCE.getAttrib(img, 'onmouseover');\r
-                                       onmouseout = tinyMCE.getAttrib(img, 'onmouseout');\r
-                                       title = tinyMCE.getAttrib(img, 'title');\r
-\r
-                                       // Is realy specified?\r
-                                       if (tinyMCE.isMSIE) {\r
-                                               width = img.attributes['width'].specified ? width : "";\r
-                                               height = img.attributes['height'].specified ? height : "";\r
-                                       }\r
-\r
-                                       //onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));\r
-                                       //onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));\r
-\r
-                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");\r
-\r
-                                       // Use mce_src if defined\r
-                                       mceRealSrc = tinyMCE.getAttrib(img, 'mce_src');\r
-                                       if (mceRealSrc != "") {\r
-                                               src = mceRealSrc;\r
-\r
-                                               if (tinyMCE.getParam('convert_urls'))\r
-                                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");\r
-                                       }\r
-\r
-                                       //if (onmouseover != "")\r
-                                       //      onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);");\r
-\r
-                                       //if (onmouseout != "")\r
-                                       //      onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);");\r
-\r
-                                       action = "update";\r
-                               }\r
-\r
-                               var template = new Array();\r
-\r
-                               template['file'] = 'image.htm?src={$src}';\r
-                               template['width'] = 355;\r
-                               template['height'] = 265 + (tinyMCE.isMSIE ? 25 : 0);\r
-\r
-                               // Language specific width and height addons\r
-                               template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0);\r
-                               template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0);\r
-\r
-                               if (inst.settings['insertimage_callback']) {\r
-                                       var returnVal = eval(inst.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");\r
-                                       if (returnVal && returnVal['src'])\r
-                                               TinyMCE_AdvancedTheme._insertImage(returnVal['src'], returnVal['alt'], returnVal['border'], returnVal['hspace'], returnVal['vspace'], returnVal['width'], returnVal['height'], returnVal['align'], returnVal['title'], returnVal['onmouseover'], returnVal['onmouseout']);\r
-                               } else\r
-                                       tinyMCE.openWindow(template, {src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align, title : title, onmouseover : onmouseover, onmouseout : onmouseout, action : action, inline : "yes"});\r
-\r
-                               return true;\r
-\r
-                       case "forecolor":\r
-                               var fcp = new TinyMCE_Layer(editor_id + '_fcPreview', false), p, img, elm;\r
-\r
-                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
-\r
-                               if (!fcp.exists()) {\r
-                                       fcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar'));\r
-                                       elm = fcp.getElement();\r
-                                       elm._editor_id = editor_id;\r
-                                       elm._command = "forecolor";\r
-                                       elm._switchId = editor_id + "_forecolor";\r
-                                       tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent);\r
-                                       tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent);\r
-                                       tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent);\r
-                               }\r
-\r
-                               img = tinyMCE.selectNodes(document.getElementById(editor_id + "_forecolor"), function(n) {return n.nodeName == "IMG";})[0];\r
-                               p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar'));\r
-\r
-                               fcp.moveTo(p.absLeft, p.absTop);\r
-                               fcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).foreColor;\r
-                               fcp.show();\r
-\r
-                               return false;\r
-\r
-                       case "forecolorpicker":\r
-                               this._pickColor(editor_id, 'forecolor');\r
-                               return true;\r
-\r
-                       case "forecolorMenu":\r
-                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
-\r
-                               // Create color layer\r
-                               var ml = new TinyMCE_Layer(editor_id + '_fcMenu');\r
-\r
-                               if (!ml.exists())\r
-                                       ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_text_colors', 'forecolor'));\r
-\r
-                               tinyMCE.switchClass(editor_id + '_forecolor', 'mceMenuButtonFocus');\r
-                               ml.moveRelativeTo(document.getElementById(editor_id + "_forecolor"), 'bl');\r
-\r
-                               ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1);\r
-\r
-                               if (tinyMCE.isOpera)\r
-                                       ml.moveBy(0, -2);\r
-\r
-                               ml.show();\r
-                       return true;\r
-\r
-                       case "HiliteColor":\r
-                               var bcp = new TinyMCE_Layer(editor_id + '_bcPreview', false), p, img;\r
-\r
-                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
-\r
-                               if (!bcp.exists()) {\r
-                                       bcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar'));\r
-                                       elm = bcp.getElement();\r
-                                       elm._editor_id = editor_id;\r
-                                       elm._command = "HiliteColor";\r
-                                       elm._switchId = editor_id + "_backcolor";\r
-                                       tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent);\r
-                                       tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent);\r
-                                       tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent);\r
-                               }\r
-\r
-                               img = tinyMCE.selectNodes(document.getElementById(editor_id + "_backcolor"), function(n) {return n.nodeName == "IMG";})[0];\r
-                               p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar'));\r
-\r
-                               bcp.moveTo(p.absLeft, p.absTop);\r
-                               bcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).backColor;\r
-                               bcp.show();\r
-\r
-                               return false;\r
-\r
-                       case "HiliteColorMenu":\r
-                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
-\r
-                               // Create color layer\r
-                               var ml = new TinyMCE_Layer(editor_id + '_bcMenu');\r
-\r
-                               if (!ml.exists())\r
-                                       ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_background_colors', 'HiliteColor'));\r
-\r
-                               tinyMCE.switchClass(editor_id + '_backcolor', 'mceMenuButtonFocus');\r
-                               ml.moveRelativeTo(document.getElementById(editor_id + "_backcolor"), 'bl');\r
-\r
-                               ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1);\r
-\r
-                               if (tinyMCE.isOpera)\r
-                                       ml.moveBy(0, -2);\r
-\r
-                               ml.show();\r
-                       return true;\r
-       \r
-                       case "backcolorpicker":\r
-                               this._pickColor(editor_id, 'HiliteColor');\r
-                               return true;\r
-\r
-                       case "mceColorPicker":\r
-                               if (user_interface) {\r
-                                       var template = [];\r
-       \r
-                                       if (!value['callback'] && !value['color'])\r
-                                               value['color'] = value['document'].getElementById(value['element_id']).value;\r
-\r
-                                       template['file'] = 'color_picker.htm';\r
-                                       template['width'] = 380;\r
-                                       template['height'] = 250;\r
-                                       template['close_previous'] = "no";\r
-\r
-                                       template['width'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width', 0);\r
-                                       template['height'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height', 0);\r
-\r
-                                       if (typeof(value['store_selection']) == "undefined")\r
-                                               value['store_selection'] = true;\r
-\r
-                                       tinyMCE.lastColorPickerValue = value;\r
-                                       tinyMCE.openWindow(template, {editor_id : editor_id, mce_store_selection : value['store_selection'], inline : "yes", command : "mceColorPicker", input_color : value['color']});\r
-                               } else {\r
-                                       var savedVal = tinyMCE.lastColorPickerValue, elm;\r
-\r
-                                       if (savedVal['callback']) {\r
-                                               savedVal['callback'](value);\r
-                                               return true;\r
-                                       }\r
-\r
-                                       elm = savedVal['document'].getElementById(savedVal['element_id']);\r
-                                       elm.value = value;\r
-\r
-                                       if (elm.onchange != null && elm.onchange != '')\r
-                                               eval('elm.onchange();');\r
-                               }\r
-                       return true;\r
-\r
-                       case "mceCodeEditor":\r
-                               var template = new Array();\r
-\r
-                               template['file'] = 'source_editor.htm';\r
-                               template['width'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_width", 720));\r
-                               template['height'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_height", 580));\r
-\r
-                               tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no", inline : "yes"});\r
-                               return true;\r
-\r
-                       case "mceCharMap":\r
-                               var template = new Array();\r
-\r
-                               template['file'] = 'charmap.htm';\r
-                               template['width'] = 550 + (tinyMCE.isOpera ? 40 : 0);\r
-                               template['height'] = 250;\r
-\r
-                               template['width'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_width', 0);\r
-                               template['height'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_height', 0);\r
-\r
-                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
-                               return true;\r
-\r
-                       case "mceInsertAnchor":\r
-                               var template = new Array();\r
-\r
-                               template['file'] = 'anchor.htm';\r
-                               template['width'] = 320;\r
-                               template['height'] = 90 + (tinyMCE.isNS7 ? 30 : 0);\r
-\r
-                               template['width'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_width', 0);\r
-                               template['height'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_height', 0);\r
-\r
-                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
-                               return true;\r
-\r
-                       case "mceNewDocument":\r
-                               if (confirm(tinyMCE.getLang('lang_newdocument')))\r
-                                       tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, ' ');\r
-\r
-                               return true;\r
-               }\r
-\r
-               return false;\r
-       },\r
-\r
-       /**\r
-        * Editor instance template function.\r
-        */\r
-       getEditorTemplate : function(settings, editorId) {\r
-               function removeFromArray(in_array, remove_array) {\r
-                       var outArray = new Array(), skip;\r
-                       \r
-                       for (var i=0; i<in_array.length; i++) {\r
-                               skip = false;\r
-\r
-                               for (var j=0; j<remove_array.length; j++) {\r
-                                       if (in_array[i] == remove_array[j]) {\r
-                                               skip = true;\r
-                                       }\r
-                               }\r
-\r
-                               if (!skip) {\r
-                                       outArray[outArray.length] = in_array[i];\r
-                               }\r
-                       }\r
-\r
-                       return outArray;\r
-               }\r
-\r
-               function addToArray(in_array, add_array) {\r
-                       for (var i=0; i<add_array.length; i++) {\r
-                               in_array[in_array.length] = add_array[i];\r
-                       }\r
-\r
-                       return in_array;\r
-               }\r
-\r
-               var template = new Array();\r
-               var deltaHeight = 0;\r
-               var resizing = tinyMCE.getParam("theme_advanced_resizing", false);\r
-               var path = tinyMCE.getParam("theme_advanced_path", true);\r
-               var statusbarHTML = '<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: ' + (path ? "block" : "none") + '">&#160;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: ' + (resizing ? "block" : "none") + '" onmousedown="tinyMCE.themes.advanced._setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';\r
-               var layoutManager = tinyMCE.getParam("theme_advanced_layout_manager", "SimpleLayout");\r
-\r
-               // Setup style select options -- MOVED UP FOR EXTERNAL TOOLBAR COMPATABILITY!\r
-               var styleSelectHTML = '<option value="">{$lang_theme_style_select}</option>';\r
-               if (settings['theme_advanced_styles']) {\r
-                       var stylesAr = settings['theme_advanced_styles'].split(';');\r
-                       \r
-                       for (var i=0; i<stylesAr.length; i++) {\r
-                               var key, value;\r
-\r
-                               key = stylesAr[i].split('=')[0];\r
-                               value = stylesAr[i].split('=')[1];\r
-\r
-                               styleSelectHTML += '<option value="' + value + '">' + key + '</option>';\r
-                       }\r
-\r
-                       TinyMCE_AdvancedTheme._autoImportCSSClasses = false;\r
-               }\r
-\r
-               switch(layoutManager) {\r
-                       case "SimpleLayout" : //the default TinyMCE Layout (for backwards compatibility)...\r
-                               var toolbarHTML = "";\r
-                               var toolbarLocation = tinyMCE.getParam("theme_advanced_toolbar_location", "bottom");\r
-                               var toolbarAlign = tinyMCE.getParam("theme_advanced_toolbar_align", "center");\r
-                               var pathLocation = tinyMCE.getParam("theme_advanced_path_location", "none"); // Compatiblity\r
-                               var statusbarLocation = tinyMCE.getParam("theme_advanced_statusbar_location", pathLocation);\r
-                               var defVals = {\r
-                                       theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",\r
-                                       theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",\r
-                                       theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"\r
-                               };\r
-\r
-                               // Add accessibility control\r
-                               toolbarHTML += '<a href="#" accesskey="q" title="' + tinyMCE.getLang("lang_toolbar_focus") + '"';\r
-\r
-                               if (!tinyMCE.getParam("accessibility_focus"))\r
-                                       toolbarHTML += ' onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"';\r
-\r
-                               toolbarHTML += '></a>';\r
-\r
-                               // Render rows\r
-                               for (var i=1; i<100; i++) {\r
-                                       var def = defVals["theme_advanced_buttons" + i];\r
-\r
-                                       var buttons = tinyMCE.getParam("theme_advanced_buttons" + i, def == null ? '' : def, true, ',');\r
-                                       if (buttons.length == 0)\r
-                                               break;\r
-\r
-                                       buttons = removeFromArray(buttons, tinyMCE.getParam("theme_advanced_disable", "", true, ','));\r
-                                       buttons = addToArray(buttons, tinyMCE.getParam("theme_advanced_buttons" + i + "_add", "", true, ','));\r
-                                       buttons = addToArray(tinyMCE.getParam("theme_advanced_buttons" + i + "_add_before", "", true, ','), buttons);\r
-\r
-                                       for (var b=0; b<buttons.length; b++)\r
-                                               toolbarHTML += tinyMCE.getControlHTML(buttons[b]);\r
-\r
-                                       if (buttons.length > 0) {\r
-                                               toolbarHTML += "<br />";\r
-                                               deltaHeight -= 23;\r
-                                       }\r
-                               }\r
-\r
-                               // Add accessibility control\r
-                               toolbarHTML += '<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"></a>';\r
-\r
-                               // Setup template html\r
-                               template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width_style};height:{$height_style}"><tbody>';\r
-\r
-                               if (toolbarLocation == "top")\r
-                                       template['html'] += '<tr><td dir="ltr" class="mceToolbarTop" align="' + toolbarAlign + '" height="1" nowrap="nowrap"><span id="' + editorId + '_toolbar" class="mceToolbarContainer">' + toolbarHTML + '</span></td></tr>';\r
-\r
-                               if (statusbarLocation == "top") {\r
-                                       template['html'] += '<tr><td class="mceStatusbarTop" height="1">' + statusbarHTML + '</td></tr>';\r
-                                       deltaHeight -= 23;\r
-                               }\r
-\r
-                               template['html'] += '<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';\r
-\r
-                               if (toolbarLocation == "bottom")\r
-                                       template['html'] += '<tr><td dir="ltr" class="mceToolbarBottom" align="' + toolbarAlign + '" height="1"><span id="' + editorId + '_toolbar" class="mceToolbarContainer">' + toolbarHTML + '</span></td></tr>';\r
-\r
-                               // External toolbar changes\r
-                               if (toolbarLocation == "external") {\r
-                                       var bod = document.body;\r
-                                       var elm = document.createElement ("div");\r
-\r
-                                       toolbarHTML = tinyMCE.replaceVar(toolbarHTML, 'style_select_options', styleSelectHTML);\r
-                                       toolbarHTML = tinyMCE.applyTemplate(toolbarHTML, {editor_id : editorId});\r
-\r
-                                       elm.className = "mceToolbarExternal";\r
-                                       elm.id = editorId+"_toolbar";\r
-                                       elm.innerHTML = '<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';\r
-                                       bod.appendChild (elm);\r
-                                       // bod.style.marginTop = elm.offsetHeight + "px";\r
-\r
-                                       deltaHeight = 0;\r
-                                       tinyMCE.getInstanceById(editorId).toolbarElement = elm;\r
-\r
-                                       //template['html'] = '<div id="mceExternalToolbar" align="center" class="mceToolbarExternal"><table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table></div>' + template["html"];\r
-                               } else {\r
-                                       tinyMCE.getInstanceById(editorId).toolbarElement = null;\r
-                               }\r
-\r
-                               if (statusbarLocation == "bottom") {\r
-                                       template['html'] += '<tr><td class="mceStatusbarBottom" height="1">' + statusbarHTML + '</td></tr>';\r
-                                       deltaHeight -= 23;\r
-                               }\r
-\r
-                               template['html'] += '</tbody></table>';\r
-                               //"SimpleLayout"\r
-                       break;\r
-\r
-                       case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom.\r
-                               template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';\r
-\r
-                               var containers = tinyMCE.getParam("theme_advanced_containers", "", true, ",");\r
-                               var defaultContainerCSS = tinyMCE.getParam("theme_advanced_containers_default_class", "container");\r
-                               var defaultContainerAlign = tinyMCE.getParam("theme_advanced_containers_default_align", "center");\r
-\r
-                               //Render Containers:\r
-                               for (var i = 0; i < containers.length; i++)\r
-                               {\r
-                                       if (containers[i] == "mceEditor") //Exceptions for mceEditor and ...\r
-                                               template['html'] += '<tr><td align="center" class="mceEditor_border"><span id="{$editor_id}"></span></td></tr>';\r
-                                       else if (containers[i] == "mceElementpath" || containers[i] == "mceStatusbar") // ... mceElementpath:\r
-                                       {\r
-                                               var pathClass = "mceStatusbar";\r
-\r
-                                               if (i == containers.length-1)\r
-                                               {\r
-                                                       pathClass = "mceStatusbarBottom";\r
-                                               }\r
-                                               else if (i == 0)\r
-                                               {\r
-                                                       pathClass = "mceStatusbar";\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       deltaHeight-=2;\r
-                                               }\r
-\r
-                                               template['html'] += '<tr><td class="' + pathClass + '" height="1">' + statusbarHTML + '</td></tr>';\r
-                                               deltaHeight -= 22;\r
-                                       } else { // Render normal Container\r
-                                               var curContainer = tinyMCE.getParam("theme_advanced_container_"+containers[i], "", true, ',');\r
-                                               var curContainerHTML = "";\r
-                                               var curAlign = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align", defaultContainerAlign);\r
-                                               var curCSS = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class", defaultContainerCSS);\r
-\r
-                                               curContainer = removeFromArray(curContainer, tinyMCE.getParam("theme_advanced_disable", "", true, ','));\r
-\r
-                                               for (var j=0; j<curContainer.length; j++)\r
-                                                       curContainerHTML += tinyMCE.getControlHTML(curContainer[j]);\r
-\r
-                                               if (curContainer.length > 0) {\r
-                                                       curContainerHTML += "<br />";\r
-                                                       deltaHeight -= 23;\r
-                                               }\r
-\r
-                                               template['html'] += '<tr><td class="' + curCSS + '" align="' + curAlign + '" height="1">' + curContainerHTML + '</td></tr>';\r
-                                       }\r
-                               }\r
-\r
-                               template['html'] += '</tbody></table>';\r
-                               //RowLayout\r
-                       break;\r
-\r
-                       case "CustomLayout" : //User defined layout callback...\r
-                               var customLayout = tinyMCE.getParam("theme_advanced_custom_layout","");\r
-\r
-                               if (customLayout != "" && eval("typeof(" + customLayout + ")") != "undefined") {\r
-                                       template = eval(customLayout + "(template);");\r
-                               }\r
-                       break;\r
-               }\r
-\r
-               if (resizing)\r
-                       template['html'] += '<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';\r
-\r
-               template['html'] = tinyMCE.replaceVar(template['html'], 'style_select_options', styleSelectHTML);\r
-\r
-               // Set to default values\r
-               if (!template['delta_width'])\r
-                       template['delta_width'] = 0;\r
-\r
-               if (!template['delta_height'])\r
-                       template['delta_height'] = deltaHeight;\r
-\r
-               return template;\r
-       },\r
-\r
-       initInstance : function(inst) {\r
-               if (tinyMCE.getParam("theme_advanced_resizing", false)) {\r
-                       if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {\r
-                               var w = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_width");\r
-                               var h = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_height");\r
-\r
-                               TinyMCE_AdvancedTheme._resizeTo(inst, w, h, tinyMCE.getParam("theme_advanced_resize_horizontal", true));\r
-                       }\r
-               }\r
-\r
-               inst.addShortcut('ctrl', 'k', 'lang_link_desc', 'mceLink');\r
-       },\r
-\r
-       removeInstance : function(inst) {\r
-               new TinyMCE_Layer(inst.editorId + '_fcMenu').remove();\r
-               new TinyMCE_Layer(inst.editorId + '_bcMenu').remove();\r
-       },\r
-\r
-       hideInstance : function(inst) {\r
-               TinyMCE_AdvancedTheme._hideMenus(inst.editorId);\r
-       },\r
-\r
-       _handleMenuEvent : function(e) {\r
-               var te = tinyMCE.isMSIE ? window.event.srcElement : e.target;\r
-               tinyMCE._menuButtonEvent(e.type == "mouseover" ? "over" : "out", document.getElementById(te._switchId));\r
-\r
-               if (e.type == "click")\r
-                       tinyMCE.execInstanceCommand(te._editor_id, te._command);\r
-       },\r
-\r
-       _hideMenus : function(id) {\r
-               var fcml = new TinyMCE_Layer(id + '_fcMenu'), bcml = new TinyMCE_Layer(id + '_bcMenu');\r
-\r
-               if (fcml.exists() && fcml.isVisible()) {\r
-                       tinyMCE.switchClass(id + '_forecolor', 'mceMenuButton');\r
-                       fcml.hide();\r
-               }\r
-\r
-               if (bcml.exists() && bcml.isVisible()) {\r
-                       tinyMCE.switchClass(id + '_backcolor', 'mceMenuButton');\r
-                       bcml.hide();\r
-               }\r
-       },\r
-\r
-       /**\r
-        * Node change handler.\r
-        */\r
-       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection, setup_content) {\r
-               var alignNode, breakOut, classNode;\r
-\r
-               function selectByValue(select_elm, value, first_index) {\r
-                       first_index = typeof(first_index) == "undefined" ? false : true;\r
-\r
-                       if (select_elm) {\r
-                               for (var i=0; i<select_elm.options.length; i++) {\r
-                                       var ov = "" + select_elm.options[i].value;\r
-\r
-                                       if (first_index && ov.toLowerCase().indexOf(value.toLowerCase()) == 0) {\r
-                                               select_elm.selectedIndex = i;\r
-                                               return true;\r
-                                       }\r
-\r
-                                       if (ov == value) {\r
-                                               select_elm.selectedIndex = i;\r
-                                               return true;\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       return false;\r
-               };\r
-\r
-               // No node provided\r
-               if (node == null)\r
-                       return;\r
-\r
-               // Update path\r
-               var pathElm = document.getElementById(editor_id + "_path");\r
-               var inst = tinyMCE.getInstanceById(editor_id);\r
-               var doc = inst.getDoc();\r
-               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
-\r
-               if (pathElm) {\r
-                       // Get node path\r
-                       var parentNode = node;\r
-                       var path = new Array();\r
-                       \r
-                       while (parentNode != null) {\r
-                               if (parentNode.nodeName.toUpperCase() == "BODY") {\r
-                                       break;\r
-                               }\r
-\r
-                               // Only append element nodes to path\r
-                               if (parentNode.nodeType == 1 && tinyMCE.getAttrib(parentNode, "class").indexOf('mceItemHidden') == -1) {\r
-                                       path[path.length] = parentNode;\r
-                               }\r
-\r
-                               parentNode = parentNode.parentNode;\r
-                       }\r
-\r
-                       // Setup HTML\r
-                       var html = "";\r
-                       for (var i=path.length-1; i>=0; i--) {\r
-                               var nodeName = path[i].nodeName.toLowerCase();\r
-                               var nodeData = "";\r
-\r
-                               if (nodeName.indexOf("html:") == 0)\r
-                                       nodeName = nodeName.substring(5);\r
-\r
-                               if (nodeName == "b") {\r
-                                       nodeName = "strong";\r
-                               }\r
-\r
-                               if (nodeName == "i") {\r
-                                       nodeName = "em";\r
-                               }\r
-\r
-                               if (nodeName == "span") {\r
-                                       var cn = tinyMCE.getAttrib(path[i], "class");\r
-                                       if (cn != "" && cn.indexOf('mceItem') == -1)\r
-                                               nodeData += "class: " + cn + " ";\r
-\r
-                                       var st = tinyMCE.getAttrib(path[i], "style");\r
-                                       if (st != "") {\r
-                                               st = tinyMCE.serializeStyle(tinyMCE.parseStyle(st));\r
-                                               nodeData += "style: " + tinyMCE.xmlEncode(st) + " ";\r
-                                       }\r
-                               }\r
-\r
-                               if (nodeName == "font") {\r
-                                       if (tinyMCE.getParam("convert_fonts_to_spans"))\r
-                                               nodeName = "span";\r
-\r
-                                       var face = tinyMCE.getAttrib(path[i], "face");\r
-                                       if (face != "")\r
-                                               nodeData += "font: " + tinyMCE.xmlEncode(face) + " ";\r
-\r
-                                       var size = tinyMCE.getAttrib(path[i], "size");\r
-                                       if (size != "")\r
-                                               nodeData += "size: " + tinyMCE.xmlEncode(size) + " ";\r
-\r
-                                       var color = tinyMCE.getAttrib(path[i], "color");\r
-                                       if (color != "")\r
-                                               nodeData += "color: " + tinyMCE.xmlEncode(color) + " ";\r
-                               }\r
-\r
-                               if (tinyMCE.getAttrib(path[i], 'id') != "") {\r
-                                       nodeData += "id: " + path[i].getAttribute('id') + " ";\r
-                               }\r
-\r
-                               var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);\r
-                               if (className != "" && className.indexOf('mceItem') == -1)\r
-                                       nodeData += "class: " + className + " ";\r
-\r
-                               if (tinyMCE.getAttrib(path[i], 'src') != "") {\r
-                                       var src = tinyMCE.getAttrib(path[i], "mce_src");\r
-\r
-                                       if (src == "")\r
-                                                src = tinyMCE.getAttrib(path[i], "src");\r
-\r
-                                       nodeData += "src: " + tinyMCE.xmlEncode(src) + " ";\r
-                               }\r
-\r
-                               if (path[i].nodeName == 'A' && tinyMCE.getAttrib(path[i], 'href') != "") {\r
-                                       var href = tinyMCE.getAttrib(path[i], "mce_href");\r
-\r
-                                       if (href == "")\r
-                                                href = tinyMCE.getAttrib(path[i], "href");\r
-\r
-                                       nodeData += "href: " + tinyMCE.xmlEncode(href) + " ";\r
-                               }\r
-\r
-                               className = tinyMCE.getAttrib(path[i], "class");\r
-                               if ((nodeName == "img" || nodeName == "span") && className.indexOf('mceItem') != -1) {\r
-                                       nodeName = className.replace(/mceItem([a-z]+)/gi, '$1').toLowerCase();\r
-                                       nodeData = path[i].getAttribute('title');\r
-                               }\r
-\r
-                               if (nodeName == "a" && (anchor = tinyMCE.getAttrib(path[i], "name")) != "") {\r
-                                       nodeName = "a";\r
-                                       nodeName += "#" + tinyMCE.xmlEncode(anchor);\r
-                                       nodeData = "";\r
-                               }\r
-\r
-                               if (tinyMCE.getAttrib(path[i], 'name').indexOf("mce_") != 0) {\r
-                                       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);\r
-                                       if (className != "" && className.indexOf('mceItem') == -1) {\r
-                                               nodeName += "." + className;\r
-                                       }\r
-                               }\r
-\r
-                               var cmd = 'tinyMCE.execInstanceCommand(\'' + editor_id + '\',\'mceSelectNodeDepth\',false,\'' + i + '\');';\r
-                               html += '<a title="' + nodeData + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" target="_self" class="mcePathItem">' + nodeName + '</a>';\r
-\r
-                               if (i > 0) {\r
-                                       html += " &raquo; ";\r
-                               }\r
-                       }\r
-\r
-                       pathElm.innerHTML = '<a href="#" accesskey="x"></a>' + tinyMCE.getLang('lang_theme_path') + ": " + html + '&#160;';\r
-               }\r
-\r
-               // Reset old states\r
-               tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_bold', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_italic', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_underline', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_sub', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_sup', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_link', 'mceButtonDisabled');\r
-               tinyMCE.switchClass(editor_id + '_unlink', 'mceButtonDisabled');\r
-               tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonDisabled');\r
-               tinyMCE.switchClass(editor_id + '_image', 'mceButtonNormal');\r
-               tinyMCE.switchClass(editor_id + '_hr', 'mceButtonNormal');\r
-\r
-               if (node.nodeName == "A" && tinyMCE.getAttrib(node, "class").indexOf('mceItemAnchor') != -1)\r
-                       tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonSelected');\r
-\r
-               // Get link\r
-               var anchorLink = tinyMCE.getParentElement(node, "a", "href");\r
-\r
-               if (anchorLink || any_selection) {\r
-                       tinyMCE.switchClass(editor_id + '_link', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal');\r
-                       tinyMCE.switchClass(editor_id + '_unlink', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal');\r
-               }\r
-\r
-               // Handle visual aid\r
-               tinyMCE.switchClass(editor_id + '_visualaid', visual_aid ? 'mceButtonSelected' : 'mceButtonNormal');\r
-\r
-               if (undo_levels != -1) {\r
-                       tinyMCE.switchClass(editor_id + '_undo', 'mceButtonDisabled');\r
-                       tinyMCE.switchClass(editor_id + '_redo', 'mceButtonDisabled');\r
-               }\r
-\r
-               // Within li, blockquote\r
-               if (tinyMCE.getParentElement(node, "li,blockquote"))\r
-                       tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonNormal');\r
-\r
-               // Has redo levels\r
-               if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0))\r
-                       tinyMCE.switchClass(editor_id + '_redo', 'mceButtonNormal');\r
-\r
-               // Has undo levels\r
-               if (undo_index != -1 && (undo_index > 0 && undo_levels > 0))\r
-                       tinyMCE.switchClass(editor_id + '_undo', 'mceButtonNormal');\r
-\r
-               // Select class in select box\r
-               var selectElm = document.getElementById(editor_id + "_styleSelect");\r
-               \r
-               if (selectElm) {\r
-                       TinyMCE_AdvancedTheme._setupCSSClasses(editor_id);\r
-\r
-                       classNode = node;\r
-                       breakOut = false;\r
-                       var index = 0;\r
-\r
-                       do {\r
-                               if (classNode && classNode.className) {\r
-                                       for (var i=0; i<selectElm.options.length; i++) {\r
-                                               if (selectElm.options[i].value == classNode.className) {\r
-                                                       index = i;\r
-                                                       breakOut = true;\r
-                                                       break;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       } while (!breakOut && classNode != null && (classNode = classNode.parentNode) != null);\r
-\r
-                       selectElm.selectedIndex = index;\r
-               }\r
-\r
-               // Select formatblock\r
-               var selectElm = document.getElementById(editor_id + "_formatSelect");\r
-               if (selectElm) {\r
-                       var elm = tinyMCE.getParentElement(node, "p,div,h1,h2,h3,h4,h5,h6,pre,address");\r
-\r
-                       if (elm)\r
-                               selectByValue(selectElm, "<" + elm.nodeName.toLowerCase() + ">");\r
-                       else\r
-                               selectByValue(selectElm, "");\r
-               }\r
-\r
-               // Select fontselect\r
-               var selectElm = document.getElementById(editor_id + "_fontNameSelect");\r
-               if (selectElm) {\r
-                       if (!tinyMCE.isSafari && !(tinyMCE.isMSIE && !tinyMCE.isOpera)) {\r
-                               var face = inst.queryCommandValue('FontName');\r
-\r
-                               face = face == null || face == "" ? "" : face;\r
-\r
-                               selectByValue(selectElm, face, face != "");\r
-                       } else {\r
-                               var elm = tinyMCE.getParentElement(node, "font", "face");\r
-\r
-                               if (elm) {\r
-                                       var family = tinyMCE.getAttrib(elm, "face");\r
-\r
-                                       if (family == '')\r
-                                               family = '' + elm.style.fontFamily;\r
-\r
-                                       if (!selectByValue(selectElm, family, family != ""))\r
-                                               selectByValue(selectElm, "");\r
-                               } else\r
-                                       selectByValue(selectElm, "");\r
-                       }\r
-               }\r
-\r
-               // Select fontsize\r
-               var selectElm = document.getElementById(editor_id + "_fontSizeSelect");\r
-               if (selectElm) {\r
-                       if (!tinyMCE.isSafari && !tinyMCE.isOpera) {\r
-                               var size = inst.queryCommandValue('FontSize');\r
-                               selectByValue(selectElm, size == null || size == "" ? "0" : size);\r
-                       } else {\r
-                               var elm = tinyMCE.getParentElement(node, "font", "size");\r
-                               if (elm) {\r
-                                       var size = tinyMCE.getAttrib(elm, "size");\r
-\r
-                                       if (size == '') {\r
-                                               var sizes = new Array('', '8px', '10px', '12px', '14px', '18px', '24px', '36px');\r
-\r
-                                               size = '' + elm.style.fontSize;\r
-\r
-                                               for (var i=0; i<sizes.length; i++) {\r
-                                                       if (('' + sizes[i]) == size) {\r
-                                                               size = i;\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-\r
-                                       if (!selectByValue(selectElm, size))\r
-                                               selectByValue(selectElm, "");\r
-                               } else\r
-                                       selectByValue(selectElm, "0");\r
-                       }\r
-               }\r
-\r
-               // Handle align attributes\r
-               alignNode = node;\r
-               breakOut = false;\r
-               do {\r
-                       if (!alignNode.getAttribute || !alignNode.getAttribute('align'))\r
-                               continue;\r
-\r
-                       switch (alignNode.getAttribute('align').toLowerCase()) {\r
-                               case "left":\r
-                                       tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonSelected');\r
-                                       breakOut = true;\r
-                               break;\r
-\r
-                               case "right":\r
-                                       tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonSelected');\r
-                                       breakOut = true;\r
-                               break;\r
-\r
-                               case "middle":\r
-                               case "center":\r
-                                       tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonSelected');\r
-                                       breakOut = true;\r
-                               break;\r
-\r
-                               case "justify":\r
-                                       tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonSelected');\r
-                                       breakOut = true;\r
-                               break;\r
-                       }\r
-               } while (!breakOut && (alignNode = alignNode.parentNode) != null);\r
-\r
-               // Div justification\r
-               var div = tinyMCE.getParentElement(node, "div");\r
-               if (div && div.style.textAlign == "center")\r
-                       tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonSelected');\r
-\r
-               // Do special text\r
-               if (!setup_content) {\r
-                       // , "JustifyLeft", "_justifyleft", "JustifyCenter", "justifycenter", "JustifyRight", "justifyright", "JustifyFull", "justifyfull", "InsertUnorderedList", "bullist", "InsertOrderedList", "numlist", "InsertUnorderedList", "bullist", "Outdent", "outdent", "Indent", "indent", "subscript", "sub"\r
-                       var ar = new Array("Bold", "_bold", "Italic", "_italic", "Strikethrough", "_strikethrough", "superscript", "_sup", "subscript", "_sub");\r
-                       for (var i=0; i<ar.length; i+=2) {\r
-                               if (inst.queryCommandState(ar[i]))\r
-                                       tinyMCE.switchClass(editor_id + ar[i+1], 'mceButtonSelected');\r
-                       }\r
-\r
-                       if (inst.queryCommandState("Underline") && (node.parentNode == null || node.parentNode.nodeName != "A"))\r
-                               tinyMCE.switchClass(editor_id + '_underline', 'mceButtonSelected');\r
-               }\r
-\r
-               // Handle elements\r
-               do {\r
-                       switch (node.nodeName) {\r
-                               case "UL":\r
-                                       tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonSelected');\r
-                               break;\r
-\r
-                               case "OL":\r
-                                       tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonSelected');\r
-                               break;\r
-\r
-                               case "HR":\r
-                                        tinyMCE.switchClass(editor_id + '_hr', 'mceButtonSelected');\r
-                               break;\r
-\r
-                               case "IMG":\r
-                               if (tinyMCE.getAttrib(node, 'name').indexOf('mce_') != 0 && tinyMCE.getAttrib(node, 'class').indexOf('mceItem') == -1) {\r
-                                       tinyMCE.switchClass(editor_id + '_image', 'mceButtonSelected');\r
-                               }\r
-                               break;\r
-                       }\r
-               } while ((node = node.parentNode) != null);\r
-       },\r
-\r
-       // Private theme internal functions\r
-\r
-       // This function auto imports CSS classes into the class selection droplist\r
-       _setupCSSClasses : function(editor_id) {\r
-               var i, selectElm;\r
-\r
-               if (!TinyMCE_AdvancedTheme._autoImportCSSClasses)\r
-                       return;\r
-\r
-               selectElm = document.getElementById(editor_id + '_styleSelect');\r
-\r
-               if (selectElm && selectElm.getAttribute('cssImported') != 'true') {\r
-                       var csses = tinyMCE.getCSSClasses(editor_id);\r
-                       if (csses && selectElm) {\r
-                               for (i=0; i<csses.length; i++)\r
-                                       selectElm.options[selectElm.options.length] = new Option(csses[i], csses[i]);\r
-                       }\r
-\r
-                       // Only do this once\r
-                       if (csses != null && csses.length > 0)\r
-                               selectElm.setAttribute('cssImported', 'true');\r
-               }\r
-       },\r
-\r
-       _setCookie : function(name, value, expires, path, domain, secure) {\r
-               var curCookie = name + "=" + escape(value) +\r
-                       ((expires) ? "; expires=" + expires.toGMTString() : "") +\r
-                       ((path) ? "; path=" + escape(path) : "") +\r
-                       ((domain) ? "; domain=" + domain : "") +\r
-                       ((secure) ? "; secure" : "");\r
-\r
-               document.cookie = curCookie;\r
-       },\r
-\r
-       _getCookie : function(name) {\r
-               var dc = document.cookie;\r
-               var prefix = name + "=";\r
-               var begin = dc.indexOf("; " + prefix);\r
-\r
-               if (begin == -1) {\r
-                       begin = dc.indexOf(prefix);\r
-\r
-                       if (begin != 0)\r
-                               return null;\r
-               } else\r
-                       begin += 2;\r
-\r
-               var end = document.cookie.indexOf(";", begin);\r
-\r
-               if (end == -1)\r
-                       end = dc.length;\r
-\r
-               return unescape(dc.substring(begin + prefix.length, end));\r
-       },\r
-\r
-       _resizeTo : function(inst, w, h, set_w) {\r
-               var editorContainer = document.getElementById(inst.editorId + '_parent');\r
-               var tableElm = editorContainer.firstChild;\r
-               var iframe = inst.iframeElement;\r
-\r
-               if (w == null || w == "null") {\r
-                       set_w = false;\r
-                       w = 0;\r
-               }\r
-\r
-               if (h == null || h == "null")\r
-                       return;\r
-\r
-               w = parseInt(w);\r
-               h = parseInt(h);\r
-\r
-               if (tinyMCE.isGecko) {\r
-                       w += 2;\r
-                       h += 2;\r
-               }\r
-\r
-               var dx = w - tableElm.clientWidth;\r
-               var dy = h - tableElm.clientHeight;\r
-\r
-               w = w < 1 ? 30 : w;\r
-               h = h < 1 ? 30 : h;\r
-\r
-               if (set_w)\r
-                       tableElm.style.width = w + "px";\r
-\r
-               tableElm.style.height = h + "px";\r
-\r
-               iw = iframe.clientWidth + dx;\r
-               ih = iframe.clientHeight + dy;\r
-\r
-               iw = iw < 1 ? 30 : iw;\r
-               ih = ih < 1 ? 30 : ih;\r
-\r
-               if (tinyMCE.isGecko) {\r
-                       iw -= 2;\r
-                       ih -= 2;\r
-               }\r
-\r
-               if (set_w)\r
-                       iframe.style.width = iw + "px";\r
-\r
-               iframe.style.height = ih + "px";\r
-\r
-               // Is it to small, make it bigger again\r
-               if (set_w) {\r
-                       var tableBodyElm = tableElm.firstChild;\r
-                       var minIframeWidth = tableBodyElm.scrollWidth;\r
-                       if (inst.iframeElement.clientWidth < minIframeWidth) {\r
-                               dx = minIframeWidth - inst.iframeElement.clientWidth;\r
-\r
-                               inst.iframeElement.style.width = (iw + dx) + "px";\r
-                       }\r
-               }\r
-\r
-               // Remove pesky table controls\r
-               inst.useCSS = false;\r
-       },\r
-\r
-       /**\r
-        * Handles resizing events.\r
-        */\r
-       _resizeEventHandler : function(e) {\r
-               var resizer = TinyMCE_AdvancedTheme._resizer;\r
-\r
-               // Do nothing\r
-               if (!resizer.resizing)\r
-                       return;\r
-\r
-               e = typeof(e) == "undefined" ? window.event : e;\r
-\r
-               var dx = e.screenX - resizer.downX;\r
-               var dy = e.screenY - resizer.downY;\r
-               var resizeBox = resizer.resizeBox;\r
-               var editorId = resizer.editorId;\r
-\r
-               switch (e.type) {\r
-                       case "mousemove":\r
-                               var w, h;\r
-\r
-                               w = resizer.width + dx;\r
-                               h = resizer.height + dy;\r
-\r
-                               w = w < 1 ? 1 : w;\r
-                               h = h < 1 ? 1 : h;\r
-\r
-                               if (resizer.horizontal)\r
-                                       resizeBox.style.width = w + "px";\r
-\r
-                               resizeBox.style.height = h + "px";\r
-                               break;\r
-\r
-                       case "mouseup":\r
-                               TinyMCE_AdvancedTheme._setResizing(e, editorId, false);\r
-                               TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId), resizer.width + dx, resizer.height + dy, resizer.horizontal);\r
-\r
-                               // Expire in a month\r
-                               if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {\r
-                                       var expires = new Date();\r
-                                       expires.setTime(expires.getTime() + 3600000 * 24 * 30);\r
-\r
-                                       // Set the cookies\r
-                                       TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires);\r
-                                       TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires);\r
-                               }\r
-                               break;\r
-               }\r
-       },\r
-\r
-       /**\r
-        * Starts/stops the editor resizing.\r
-        */\r
-       _setResizing : function(e, editor_id, state) {\r
-               e = typeof(e) == "undefined" ? window.event : e;\r
-\r
-               var resizer = TinyMCE_AdvancedTheme._resizer;\r
-               var editorContainer = document.getElementById(editor_id + '_parent');\r
-               var editorArea = document.getElementById(editor_id + '_parent').firstChild;\r
-               var resizeBox = document.getElementById(editor_id + '_resize_box');\r
-               var inst = tinyMCE.getInstanceById(editor_id);\r
-\r
-               if (state) {\r
-                       // Place box over editor area\r
-                       var width = editorArea.clientWidth;\r
-                       var height = editorArea.clientHeight;\r
-\r
-                       resizeBox.style.width = width + "px";\r
-                       resizeBox.style.height = height + "px";\r
-\r
-                       resizer.iframeWidth = inst.iframeElement.clientWidth;\r
-                       resizer.iframeHeight = inst.iframeElement.clientHeight;\r
-\r
-                       // Hide editor and show resize box\r
-                       editorArea.style.display = "none";\r
-                       resizeBox.style.display = "block";\r
-\r
-                       // Add event handlers, only once\r
-                       if (!resizer.eventHandlers) {\r
-                               if (tinyMCE.isMSIE)\r
-                                       tinyMCE.addEvent(document, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);\r
-                               else\r
-                                       tinyMCE.addEvent(window, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);\r
-\r
-                               tinyMCE.addEvent(document, "mouseup", TinyMCE_AdvancedTheme._resizeEventHandler);\r
-\r
-                               resizer.eventHandlers = true;\r
-                       }\r
-\r
-                       resizer.resizing = true;\r
-                       resizer.downX = e.screenX;\r
-                       resizer.downY = e.screenY;\r
-                       resizer.width = parseInt(resizeBox.style.width);\r
-                       resizer.height = parseInt(resizeBox.style.height);\r
-                       resizer.editorId = editor_id;\r
-                       resizer.resizeBox = resizeBox;\r
-                       resizer.horizontal = tinyMCE.getParam("theme_advanced_resize_horizontal", true);\r
-               } else {\r
-                       resizer.resizing = false;\r
-                       resizeBox.style.display = "none";\r
-                       editorArea.style.display = tinyMCE.isMSIE && !tinyMCE.isOpera ? "block" : "table";\r
-                       tinyMCE.execCommand('mceResetDesignMode');\r
-               }\r
-       },\r
-\r
-       _getColorHTML : function(id, n, cm) {\r
-               var i, h, cl;\r
-\r
-               h = '<span class="mceMenuLine"></span>';\r
-               cl = tinyMCE.getParam(n, TinyMCE_AdvancedTheme._defColors).split(',');\r
-\r
-               h += '<table class="mceColors"><tr>';\r
-               for (i=0; i<cl.length; i++) {\r
-                       c = 'tinyMCE.execInstanceCommand(\'' + id + '\', \'' + cm + '\', false, \'#' + cl[i] + '\');';\r
-                       h += '<td><a href="javascript:' + c + '" style="background-color: #' + cl[i] + '" onclick="' + c + ';return false;"></a></td>';\r
-\r
-                       if ((i+1) % 8 == 0)\r
-                               h += '</tr><tr>';\r
-               }\r
-\r
-               h += '</tr></table>';\r
-\r
-               if (tinyMCE.getParam("theme_advanced_more_colors", true))\r
-                       h += '<a href="javascript:void(0);" onclick="TinyMCE_AdvancedTheme._pickColor(\'' + id + '\',\'' + cm + '\');" class="mceMoreColors">' + tinyMCE.getLang('lang_more_colors') + '</a>';\r
-\r
-               return h;\r
-       },\r
-\r
-       _pickColor : function(id, cm) {\r
-               var inputColor, inst = tinyMCE.selectedInstance;\r
-\r
-               if (cm == 'forecolor' && inst)\r
-                       inputColor = inst.foreColor;\r
-\r
-               if ((cm == 'backcolor' || cm == 'HiliteColor') && inst)\r
-                       inputColor = inst.backColor;\r
-\r
-               tinyMCE.execCommand('mceColorPicker', true, {color : inputColor, callback : function(c) {\r
-                       tinyMCE.execInstanceCommand(id, cm, false, c);\r
-               }});\r
-       },\r
-\r
-       _insertImage : function(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout) {\r
-               tinyMCE.execCommand("mceInsertContent", false, tinyMCE.createTagHTML('img', {\r
-                       src : tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src), // Force absolute\r
-                       mce_src : src,\r
-                       alt : alt,\r
-                       border : border,\r
-                       hspace : hspace,\r
-                       vspace : vspace,\r
-                       width : width,\r
-                       height : height,\r
-                       align : align,\r
-                       title : title,\r
-                       onmouseover : onmouseover,\r
-                       onmouseout : onmouseout\r
-               }));\r
-       },\r
-\r
-       _insertLink : function(href, target, title, onclick, style_class) {\r
-               tinyMCE.execCommand('mceBeginUndoLevel');\r
-\r
-               if (tinyMCE.selectedInstance && tinyMCE.selectedElement && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {\r
-                       var doc = tinyMCE.selectedInstance.getDoc();\r
-                       var linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");\r
-                       var newLink = false;\r
-\r
-                       if (!linkElement) {\r
-                               linkElement = doc.createElement("a");\r
-                               newLink = true;\r
-                       }\r
-\r
-                       var mhref = href;\r
-                       var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);");\r
-                       mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
-\r
-                       tinyMCE.setAttrib(linkElement, 'href', thref);\r
-                       tinyMCE.setAttrib(linkElement, 'mce_href', mhref);\r
-                       tinyMCE.setAttrib(linkElement, 'target', target);\r
-                       tinyMCE.setAttrib(linkElement, 'title', title);\r
-                       tinyMCE.setAttrib(linkElement, 'onclick', onclick);\r
-                       tinyMCE.setAttrib(linkElement, 'class', style_class);\r
-\r
-                       if (newLink) {\r
-                               linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));\r
-                               tinyMCE.selectedElement.parentNode.replaceChild(linkElement, tinyMCE.selectedElement);\r
-                       }\r
-\r
-                       return;\r
-               }\r
-\r
-               if (!tinyMCE.linkElement && tinyMCE.selectedInstance) {\r
-                       if (tinyMCE.isSafari) {\r
-                               tinyMCE.execCommand("mceInsertContent", false, '<a href="' + tinyMCE.uniqueURL + '">' + tinyMCE.selectedInstance.selection.getSelectedHTML() + '</a>');\r
-                       } else\r
-                               tinyMCE.selectedInstance.contentDocument.execCommand("createlink", false, tinyMCE.uniqueURL);\r
-\r
-                       tinyMCE.linkElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);\r
-\r
-                       var elementArray = tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);\r
-\r
-                       for (var i=0; i<elementArray.length; i++) {\r
-                               var mhref = href;\r
-                               var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, elementArray[i]);");\r
-                               mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
-\r
-                               tinyMCE.setAttrib(elementArray[i], 'href', thref);\r
-                               tinyMCE.setAttrib(elementArray[i], 'mce_href', mhref);\r
-                               tinyMCE.setAttrib(elementArray[i], 'target', target);\r
-                               tinyMCE.setAttrib(elementArray[i], 'title', title);\r
-                               tinyMCE.setAttrib(elementArray[i], 'onclick', onclick);\r
-                               tinyMCE.setAttrib(elementArray[i], 'class', style_class);\r
-                       }\r
-\r
-                       tinyMCE.linkElement = elementArray[0];\r
-               }\r
-\r
-               if (tinyMCE.linkElement) {\r
-                       var mhref = href;\r
-                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement);");\r
-                       mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
-\r
-                       tinyMCE.setAttrib(tinyMCE.linkElement, 'href', href);\r
-                       tinyMCE.setAttrib(tinyMCE.linkElement, 'mce_href', mhref);\r
-                       tinyMCE.setAttrib(tinyMCE.linkElement, 'target', target);\r
-                       tinyMCE.setAttrib(tinyMCE.linkElement, 'title', title);\r
-                       tinyMCE.setAttrib(tinyMCE.linkElement, 'onclick', onclick);\r
-                       tinyMCE.setAttrib(tinyMCE.linkElement, 'class', style_class);\r
-               }\r
-\r
-               tinyMCE.execCommand('mceEndUndoLevel');\r
-       }\r
-};\r
-\r
-tinyMCE.addTheme("advanced", TinyMCE_AdvancedTheme);\r
-\r
-// Add default buttons maps for advanced theme and all internal plugins\r
-tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);\r
+/**
+ * $Id: editor_template_src.js 296 2007-08-21 10:36:35Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+/* Import theme specific language pack */
+tinyMCE.importThemeLanguagePack('advanced');
+
+var TinyMCE_AdvancedTheme = {
+       // Private theme fields
+       _defColors : "000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",
+       _autoImportCSSClasses : true,
+       _resizer : {},
+       _buttons : [
+               // 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', 'forecolor', true],
+               ['forecolorpicker', 'forecolor.gif', 'lang_theme_forecolor_desc', 'forecolorpicker', true],
+               ['backcolor', 'backcolor.gif', 'lang_theme_backcolor_desc', 'HiliteColor', true],
+               ['backcolorpicker', 'backcolor.gif', 'lang_theme_backcolor_desc', 'backcolorpicker', true],
+               ['charmap', 'charmap.gif', 'lang_theme_charmap_desc', 'mceCharMap'],
+               ['visualaid', 'visualaid.gif', 'lang_theme_visualaid_desc', 'mceToggleVisualAid'],
+               ['anchor', 'anchor.gif', 'lang_theme_anchor_desc', 'mceInsertAnchor'],
+               ['newdocument', 'newdocument.gif', 'lang_newdocument_desc', 'mceNewDocument']
+       ],
+
+       _buttonMap : 'anchor,backcolor,bold,bullist,charmap,cleanup,code,copy,cut,forecolor,help,hr,image,indent,italic,justifycenter,justifyfull,justifyleft,justifyright,link,newdocument,numlist,outdent,paste,redo,removeformat,strikethrough,sub,sup,underline,undo,unlink,visualaid,advhr,ltr,rtl,emotions,flash,fullpage,fullscreen,iespell,insertdate,inserttime,pastetext,pasteword,selectall,preview,print,save,replace,search,table,cell_props,delete_col,delete_row,col_after,col_before,row_after,row_before,merge_cells,row_props,split_cells,delete_table',
+
+       /**
+        * Returns HTML code for the specificed control.
+        */
+       getControlHTML : function(button_name) {
+               var i, x, but;
+
+               // Lookup button in button list
+               for (i=0; i<TinyMCE_AdvancedTheme._buttons.length; i++) {
+                       but = TinyMCE_AdvancedTheme._buttons[i];
+
+                       if (but[0] == button_name && (button_name == "forecolor" || button_name == "backcolor"))
+                               return tinyMCE.getMenuButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3] + "Menu", but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null));
+
+                       if (but[0] == button_name)
+                               return tinyMCE.getButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null));
+               }
+
+               // 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,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';
+                               var fonts = tinyMCE.getParam("theme_advanced_fonts", nFonts).split(';');
+                               for (i=0; i<fonts.length; i++) {
+                                       if (fonts[i] != '') {
+                                               var parts = fonts[i].split('=');
+                                               fontHTML += '<option value="' + parts[1] + '">' + parts[0] + '</option>';
+                                       }
+                               }
+
+                               fontHTML += '</select>';
+                               return fontHTML;
+
+                       case "fontsizeselect":
+                               return '<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+
+                                               '<option value="0">{$lang_theme_font_size}</option>'+
+                                               '<option value="1">1 (8 pt)</option>'+
+                                               '<option value="2">2 (10 pt)</option>'+
+                                               '<option value="3">3 (12 pt)</option>'+
+                                               '<option value="4">4 (14 pt)</option>'+
+                                               '<option value="5">5 (18 pt)</option>'+
+                                               '<option value="6">6 (24 pt)</option>'+
+                                               '<option value="7">7 (36 pt)</option>'+
+                                               '</select>';
+
+                       case "|":
+                       case "separator":
+                               return '<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" alt="" />';
+
+                       case "spacer":
+                               return '<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" alt="" />';
+
+                       case "rowseparator":
+                               return '<br />';
+               }
+
+               return "";
+       },
+
+       /**
+        * Theme specific execcommand handling.
+        */
+       execCommand : function(editor_id, element, command, user_interface, value) {
+               switch (command) {
+                       case 'mceHelp':
+                               tinyMCE.openWindow({
+                                       file : 'about.htm',
+                                       width : 480,
+                                       height : 380
+                               }, {
+                                       tinymce_version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion,
+                                       tinymce_releasedate : tinyMCE.releaseDate,
+                                       inline : "yes"
+                               });
+                       return true;
+
+                       case "mceLink":
+                               var inst = tinyMCE.getInstanceById(editor_id);
+                               var doc = inst.getDoc();
+                               var selectedText = "";
+
+                               if (tinyMCE.isMSIE) {
+                                       var rng = doc.selection.createRange();
+                                       selectedText = rng.text;
+                               } else
+                                       selectedText = inst.getSel().toString();
+
+                               if (!tinyMCE.linkElement) {
+                                       if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0))
+                                               return true;
+                               }
+
+                               var href = "", target = "", title = "", onclick = "", action = "insert", style_class = "";
+
+                               if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a")
+                                       tinyMCE.linkElement = tinyMCE.selectedElement;
+
+                               // Is anchor not a link
+                               if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "")
+                                       tinyMCE.linkElement = null;
+
+                               if (tinyMCE.linkElement) {
+                                       href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href');
+                                       target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target');
+                                       title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title');
+                                       onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');
+                                       style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class');
+
+                                       // Try old onclick to if copy/pasted content
+                                       if (onclick == "")
+                                               onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');
+
+                                       onclick = tinyMCE.cleanupEventStr(onclick);
+
+                                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");
+
+                                       // Use mce_href if defined
+                                       mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_href');
+                                       if (mceRealHref != "") {
+                                               href = mceRealHref;
+
+                                               if (tinyMCE.getParam('convert_urls'))
+                                                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");
+                                       }
+
+                                       action = "update";
+                               }
+
+                               var template = new Array();
+
+                               template['file'] = 'link.htm';
+                               template['width'] = 310;
+                               template['height'] = 200;
+
+                               // Language specific width and height addons
+                               template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0);
+                               template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0);
+
+                               if (inst.settings['insertlink_callback']) {
+                                       var returnVal = eval(inst.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);");
+                                       if (returnVal && returnVal['href'])
+                                               TinyMCE_AdvancedTheme._insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']);
+                               } else {
+                                       tinyMCE.openWindow(template, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class, inline : "yes"});
+                               }
+
+                               return true;
+
+                       case "mceImage":
+                               var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = "";
+                               var title = "", onmouseover = "", onmouseout = "", action = "insert";
+                               var img = tinyMCE.imgElement;
+                               var inst = tinyMCE.getInstanceById(editor_id);
+
+                               if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {
+                                       img = tinyMCE.selectedElement;
+                                       tinyMCE.imgElement = img;
+                               }
+
+                               if (img) {
+                                       // Is it a internal MCE visual aid image, then skip this one.
+                                       if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0)
+                                               return true;
+
+                                       src = tinyMCE.getAttrib(img, 'src');
+                                       alt = tinyMCE.getAttrib(img, 'alt');
+
+                                       // Try polling out the title
+                                       if (alt == "")
+                                               alt = tinyMCE.getAttrib(img, 'title');
+
+                                       // Fix width/height attributes if the styles is specified
+                                       if (tinyMCE.isGecko) {
+                                               var w = img.style.width;
+                                               if (w != null && w != "")
+                                                       img.setAttribute("width", w);
+
+                                               var h = img.style.height;
+                                               if (h != null && h != "")
+                                                       img.setAttribute("height", h);
+                                       }
+
+                                       border = tinyMCE.getAttrib(img, 'border');
+                                       hspace = tinyMCE.getAttrib(img, 'hspace');
+                                       vspace = tinyMCE.getAttrib(img, 'vspace');
+                                       width = tinyMCE.getAttrib(img, 'width');
+                                       height = tinyMCE.getAttrib(img, 'height');
+                                       align = tinyMCE.getAttrib(img, 'align');
+                                       onmouseover = tinyMCE.getAttrib(img, 'onmouseover');
+                                       onmouseout = tinyMCE.getAttrib(img, 'onmouseout');
+                                       title = tinyMCE.getAttrib(img, 'title');
+
+                                       // Is realy specified?
+                                       if (tinyMCE.isMSIE) {
+                                               width = img.attributes['width'].specified ? width : "";
+                                               height = img.attributes['height'].specified ? height : "";
+                                       }
+
+                                       //onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));
+                                       //onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));
+
+                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");
+
+                                       // Use mce_src if defined
+                                       mceRealSrc = tinyMCE.getAttrib(img, 'mce_src');
+                                       if (mceRealSrc != "") {
+                                               src = mceRealSrc;
+
+                                               if (tinyMCE.getParam('convert_urls'))
+                                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");
+                                       }
+
+                                       //if (onmouseover != "")
+                                       //      onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);");
+
+                                       //if (onmouseout != "")
+                                       //      onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);");
+
+                                       action = "update";
+                               }
+
+                               var template = new Array();
+
+                               template['file'] = 'image.htm?src={$src}';
+                               template['width'] = 355;
+                               template['height'] = 265 + (tinyMCE.isMSIE ? 25 : 0);
+
+                               // Language specific width and height addons
+                               template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0);
+                               template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0);
+
+                               if (inst.settings['insertimage_callback']) {
+                                       var returnVal = eval(inst.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");
+                                       if (returnVal && returnVal['src'])
+                                               TinyMCE_AdvancedTheme._insertImage(returnVal['src'], returnVal['alt'], returnVal['border'], returnVal['hspace'], returnVal['vspace'], returnVal['width'], returnVal['height'], returnVal['align'], returnVal['title'], returnVal['onmouseover'], returnVal['onmouseout']);
+                               } else
+                                       tinyMCE.openWindow(template, {src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align, title : title, onmouseover : onmouseover, onmouseout : onmouseout, action : action, inline : "yes"});
+
+                               return true;
+
+                       case "forecolor":
+                               var fcp = new TinyMCE_Layer(editor_id + '_fcPreview', false), p, img, elm;
+
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);
+
+                               if (!fcp.exists()) {
+                                       fcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar'));
+                                       elm = fcp.getElement();
+                                       elm._editor_id = editor_id;
+                                       elm._command = "forecolor";
+                                       elm._switchId = editor_id + "_forecolor";
+                                       tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent);
+                                       tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent);
+                                       tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent);
+                               }
+
+                               img = tinyMCE.selectNodes(document.getElementById(editor_id + "_forecolor"), function(n) {return n.nodeName == "IMG";})[0];
+                               p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar'));
+
+                               fcp.moveTo(p.absLeft, p.absTop);
+                               fcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).foreColor;
+                               fcp.show();
+
+                               return false;
+
+                       case "forecolorpicker":
+                               this._pickColor(editor_id, 'forecolor');
+                               return true;
+
+                       case "forecolorMenu":
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);
+
+                               // Create color layer
+                               var ml = new TinyMCE_Layer(editor_id + '_fcMenu');
+
+                               if (!ml.exists())
+                                       ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_text_colors', 'forecolor'));
+
+                               tinyMCE.switchClass(editor_id + '_forecolor', 'mceMenuButtonFocus');
+                               ml.moveRelativeTo(document.getElementById(editor_id + "_forecolor"), 'bl');
+
+                               ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1);
+
+                               if (tinyMCE.isOpera)
+                                       ml.moveBy(0, -2);
+
+                               ml.show();
+                       return true;
+
+                       case "HiliteColor":
+                               var bcp = new TinyMCE_Layer(editor_id + '_bcPreview', false), p, img;
+
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);
+
+                               if (!bcp.exists()) {
+                                       bcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar'));
+                                       elm = bcp.getElement();
+                                       elm._editor_id = editor_id;
+                                       elm._command = "HiliteColor";
+                                       elm._switchId = editor_id + "_backcolor";
+                                       tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent);
+                                       tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent);
+                                       tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent);
+                               }
+
+                               img = tinyMCE.selectNodes(document.getElementById(editor_id + "_backcolor"), function(n) {return n.nodeName == "IMG";})[0];
+                               p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar'));
+
+                               bcp.moveTo(p.absLeft, p.absTop);
+                               bcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).backColor;
+                               bcp.show();
+
+                               return false;
+
+                       case "HiliteColorMenu":
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);
+
+                               // Create color layer
+                               var ml = new TinyMCE_Layer(editor_id + '_bcMenu');
+
+                               if (!ml.exists())
+                                       ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_background_colors', 'HiliteColor'));
+
+                               tinyMCE.switchClass(editor_id + '_backcolor', 'mceMenuButtonFocus');
+                               ml.moveRelativeTo(document.getElementById(editor_id + "_backcolor"), 'bl');
+
+                               ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1);
+
+                               if (tinyMCE.isOpera)
+                                       ml.moveBy(0, -2);
+
+                               ml.show();
+                       return true;
+       
+                       case "backcolorpicker":
+                               this._pickColor(editor_id, 'HiliteColor');
+                               return true;
+
+                       case "mceColorPicker":
+                               if (user_interface) {
+                                       var template = [];
+       
+                                       if (!value['callback'] && !value['color'])
+                                               value['color'] = value['document'].getElementById(value['element_id']).value;
+
+                                       template['file'] = 'color_picker.htm';
+                                       template['width'] = 380;
+                                       template['height'] = 250;
+                                       template['close_previous'] = "no";
+
+                                       template['width'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width', 0);
+                                       template['height'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height', 0);
+
+                                       if (typeof(value['store_selection']) == "undefined")
+                                               value['store_selection'] = true;
+
+                                       tinyMCE.lastColorPickerValue = value;
+                                       tinyMCE.openWindow(template, {editor_id : editor_id, mce_store_selection : value['store_selection'], inline : "yes", command : "mceColorPicker", input_color : value['color']});
+                               } else {
+                                       var savedVal = tinyMCE.lastColorPickerValue, elm;
+
+                                       if (savedVal['callback']) {
+                                               savedVal['callback'](value);
+                                               return true;
+                                       }
+
+                                       elm = savedVal['document'].getElementById(savedVal['element_id']);
+                                       elm.value = value;
+
+                                       if (elm.onchange != null && elm.onchange != '')
+                                               eval('elm.onchange();');
+                               }
+                       return true;
+
+                       case "mceCodeEditor":
+                               var template = new Array();
+
+                               template['file'] = 'source_editor.htm';
+                               template['width'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_width", 720));
+                               template['height'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_height", 580));
+
+                               tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no", inline : "yes"});
+                               return true;
+
+                       case "mceCharMap":
+                               var template = new Array();
+
+                               template['file'] = 'charmap.htm';
+                               template['width'] = 550 + (tinyMCE.isOpera ? 40 : 0);
+                               template['height'] = 250;
+
+                               template['width'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_width', 0);
+                               template['height'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_height', 0);
+
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});
+                               return true;
+
+                       case "mceInsertAnchor":
+                               var template = new Array();
+
+                               template['file'] = 'anchor.htm';
+                               template['width'] = 320;
+                               template['height'] = 90 + (tinyMCE.isNS7 ? 30 : 0);
+
+                               template['width'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_width', 0);
+                               template['height'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_height', 0);
+
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});
+                               return true;
+
+                       case "mceNewDocument":
+                               if (confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_newdocument'))))
+                                       tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, ' ');
+
+                               return true;
+               }
+
+               return false;
+       },
+
+       /**
+        * Editor instance template function.
+        */
+       getEditorTemplate : function(settings, editorId) {
+               function removeFromArray(in_array, remove_array) {
+                       var outArray = new Array(), skip;
+                       
+                       for (var i=0; i<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_style};height:{$height_style}"><tbody>';
+
+                               if (toolbarLocation == "top")
+                                       template['html'] += '<tr><td dir="ltr" class="mceToolbarTop" align="' + toolbarAlign + '" height="1" nowrap="nowrap"><span id="' + editorId + '_toolbar" class="mceToolbarContainer">' + toolbarHTML + '</span></td></tr>';
+
+                               if (statusbarLocation == "top") {
+                                       template['html'] += '<tr><td class="mceStatusbarTop" height="1">' + statusbarHTML + '</td></tr>';
+                                       deltaHeight -= 23;
+                               }
+
+                               template['html'] += '<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';
+
+                               if (toolbarLocation == "bottom")
+                                       template['html'] += '<tr><td dir="ltr" class="mceToolbarBottom" align="' + toolbarAlign + '" height="1"><span id="' + editorId + '_toolbar" class="mceToolbarContainer">' + toolbarHTML + '</span></td></tr>';
+
+                               // 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);
+
+                                               curContainer = removeFromArray(curContainer, tinyMCE.getParam("theme_advanced_disable", "", true, ','));
+
+                                               for (var j=0; j<curContainer.length; j++)
+                                                       curContainerHTML += tinyMCE.getControlHTML(curContainer[j]);
+
+                                               if (curContainer.length > 0) {
+                                                       curContainerHTML += "<br />";
+                                                       deltaHeight -= 23;
+                                               }
+
+                                               template['html'] += '<tr><td class="' + curCSS + '" align="' + curAlign + '" height="1">' + curContainerHTML + '</td></tr>';
+                                       }
+                               }
+
+                               template['html'] += '</tbody></table>';
+                               //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);
+
+               // Set to default values
+               if (!template['delta_width'])
+                       template['delta_width'] = 0;
+
+               if (!template['delta_height'])
+                       template['delta_height'] = deltaHeight;
+
+               return template;
+       },
+
+       initInstance : function(inst) {
+               if (tinyMCE.getParam("theme_advanced_resizing", false)) {
+                       if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {
+                               var w = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_width");
+                               var h = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_height");
+
+                               TinyMCE_AdvancedTheme._resizeTo(inst, w, h, tinyMCE.getParam("theme_advanced_resize_horizontal", true));
+                       }
+               }
+
+               inst.addShortcut('ctrl', 'k', 'lang_link_desc', 'mceLink');
+       },
+
+       removeInstance : function(inst) {
+               new TinyMCE_Layer(inst.editorId + '_fcMenu').remove();
+               new TinyMCE_Layer(inst.editorId + '_bcMenu').remove();
+       },
+
+       hideInstance : function(inst) {
+               TinyMCE_AdvancedTheme._hideMenus(inst.editorId);
+       },
+
+       _handleMenuEvent : function(e) {
+               var te = tinyMCE.isMSIE ? window.event.srcElement : e.target;
+               tinyMCE._menuButtonEvent(e.type == "mouseover" ? "over" : "out", document.getElementById(te._switchId));
+
+               if (e.type == "click")
+                       tinyMCE.execInstanceCommand(te._editor_id, te._command);
+       },
+
+       _hideMenus : function(id) {
+               var fcml = new TinyMCE_Layer(id + '_fcMenu'), bcml = new TinyMCE_Layer(id + '_bcMenu');
+
+               if (fcml.exists() && fcml.isVisible()) {
+                       tinyMCE.switchClass(id + '_forecolor', 'mceMenuButton');
+                       fcml.hide();
+               }
+
+               if (bcml.exists() && bcml.isVisible()) {
+                       tinyMCE.switchClass(id + '_backcolor', 'mceMenuButton');
+                       bcml.hide();
+               }
+       },
+
+       /**
+        * Node change handler.
+        */
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection, setup_content) {
+               var alignNode, breakOut, classNode;
+
+               function selectByValue(select_elm, value, first_index) {
+                       first_index = typeof(first_index) == "undefined" ? false : true;
+
+                       if (select_elm) {
+                               for (var i=0; i<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;
+               };
+
+               // 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();
+               TinyMCE_AdvancedTheme._hideMenus(editor_id);
+
+               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.indexOf("html:") == 0)
+                                       nodeName = nodeName.substring(5);
+
+                               if (nodeName == "b") {
+                                       nodeName = "strong";
+                               }
+
+                               if (nodeName == "i") {
+                                       nodeName = "em";
+                               }
+
+                               if (nodeName == "span") {
+                                       var cn = tinyMCE.getAttrib(path[i], "class");
+                                       if (cn != "" && cn.indexOf('mceItem') == -1)
+                                               nodeData += "class: " + cn + " ";
+
+                                       var st = tinyMCE.getAttrib(path[i], "style");
+                                       if (st != "") {
+                                               st = tinyMCE.serializeStyle(tinyMCE.parseStyle(st));
+                                               nodeData += "style: " + tinyMCE.xmlEncode(st) + " ";
+                                       }
+                               }
+
+                               if (nodeName == "font") {
+                                       if (tinyMCE.getParam("convert_fonts_to_spans"))
+                                               nodeName = "span";
+
+                                       var face = tinyMCE.getAttrib(path[i], "face");
+                                       if (face != "")
+                                               nodeData += "font: " + tinyMCE.xmlEncode(face) + " ";
+
+                                       var size = tinyMCE.getAttrib(path[i], "size");
+                                       if (size != "")
+                                               nodeData += "size: " + tinyMCE.xmlEncode(size) + " ";
+
+                                       var color = tinyMCE.getAttrib(path[i], "color");
+                                       if (color != "")
+                                               nodeData += "color: " + tinyMCE.xmlEncode(color) + " ";
+                               }
+
+                               if (tinyMCE.getAttrib(path[i], 'id') != "") {
+                                       nodeData += "id: " + path[i].getAttribute('id') + " ";
+                               }
+
+                               var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);
+                               if (className != "" && className.indexOf('mceItem') == -1)
+                                       nodeData += "class: " + className + " ";
+
+                               if (tinyMCE.getAttrib(path[i], 'src') != "") {
+                                       var src = tinyMCE.getAttrib(path[i], "mce_src");
+
+                                       if (src == "")
+                                                src = tinyMCE.getAttrib(path[i], "src");
+
+                                       nodeData += "src: " + tinyMCE.xmlEncode(src) + " ";
+                               }
+
+                               if (path[i].nodeName == 'A' && tinyMCE.getAttrib(path[i], 'href') != "") {
+                                       var href = tinyMCE.getAttrib(path[i], "mce_href");
+
+                                       if (href == "")
+                                                href = tinyMCE.getAttrib(path[i], "href");
+
+                                       nodeData += "href: " + tinyMCE.xmlEncode(href) + " ";
+                               }
+
+                               className = tinyMCE.getAttrib(path[i], "class");
+                               if ((nodeName == "img" || nodeName == "span") && className.indexOf('mceItem') != -1) {
+                                       nodeName = className.replace(/mceItem([a-z]+)/gi, '$1').toLowerCase();
+                                       nodeData = path[i].getAttribute('title');
+                               }
+
+                               if (nodeName == "a" && (anchor = tinyMCE.getAttrib(path[i], "name")) != "") {
+                                       nodeName = "a";
+                                       nodeName += "#" + tinyMCE.xmlEncode(anchor);
+                                       nodeData = "";
+                               }
+
+                               if (tinyMCE.getAttrib(path[i], 'name').indexOf("mce_") != 0) {
+                                       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);
+                                       if (className != "" && className.indexOf('mceItem') == -1) {
+                                               nodeName += "." + className;
+                                       }
+                               }
+
+                               var cmd = 'tinyMCE.execInstanceCommand(\'' + editor_id + '\',\'mceSelectNodeDepth\',false,\'' + i + '\');';
+                               html += '<a title="' + nodeData + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" target="_self" class="mcePathItem">' + nodeName + '</a>';
+
+                               if (i > 0) {
+                                       html += " &raquo; ";
+                               }
+                       }
+
+                       pathElm.innerHTML = '<a href="#" accesskey="x"></a>' + tinyMCE.getLang('lang_theme_path') + ": " + html + '&#160;';
+               }
+
+               // 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 (tinyMCE.getAttrib(node, 'name').indexOf('mce_') != 0 && tinyMCE.getAttrib(node, 'class').indexOf('mceItem') == -1) {
+                                       tinyMCE.switchClass(editor_id + '_image', 'mceButtonSelected');
+                               }
+                               break;
+                       }
+               } while ((node = node.parentNode) != null);
+       },
+
+       // 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";
+                       }
+               }
+
+               // Remove pesky table controls
+               inst.useCSS = false;
+       },
+
+       /**
+        * Handles resizing events.
+        */
+       _resizeEventHandler : function(e) {
+               var resizer = TinyMCE_AdvancedTheme._resizer;
+
+               // Do nothing
+               if (!resizer.resizing)
+                       return;
+
+               e = typeof(e) == "undefined" ? window.event : e;
+
+               var dx = e.screenX - resizer.downX;
+               var dy = e.screenY - resizer.downY;
+               var resizeBox = resizer.resizeBox;
+               var editorId = resizer.editorId;
+
+               switch (e.type) {
+                       case "mousemove":
+                               var w, h;
+
+                               w = resizer.width + dx;
+                               h = resizer.height + dy;
+
+                               w = w < 1 ? 1 : w;
+                               h = h < 1 ? 1 : h;
+
+                               if (resizer.horizontal)
+                                       resizeBox.style.width = w + "px";
+
+                               resizeBox.style.height = h + "px";
+                               break;
+
+                       case "mouseup":
+                               TinyMCE_AdvancedTheme._setResizing(e, editorId, false);
+                               TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId), resizer.width + dx, resizer.height + dy, resizer.horizontal);
+
+                               // Expire in a month
+                               if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {
+                                       var expires = new Date();
+                                       expires.setTime(expires.getTime() + 3600000 * 24 * 30);
+
+                                       // Set the cookies
+                                       TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires);
+                                       TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires);
+                               }
+                               break;
+               }
+       },
+
+       /**
+        * Starts/stops the editor resizing.
+        */
+       _setResizing : function(e, editor_id, state) {
+               e = typeof(e) == "undefined" ? window.event : e;
+
+               var resizer = TinyMCE_AdvancedTheme._resizer;
+               var editorContainer = document.getElementById(editor_id + '_parent');
+               var editorArea = document.getElementById(editor_id + '_parent').firstChild;
+               var resizeBox = document.getElementById(editor_id + '_resize_box');
+               var inst = tinyMCE.getInstanceById(editor_id);
+
+               if (state) {
+                       // Place box over editor area
+                       var width = editorArea.clientWidth;
+                       var height = editorArea.clientHeight;
+
+                       resizeBox.style.width = width + "px";
+                       resizeBox.style.height = height + "px";
+
+                       resizer.iframeWidth = inst.iframeElement.clientWidth;
+                       resizer.iframeHeight = inst.iframeElement.clientHeight;
+
+                       // Hide editor and show resize box
+                       editorArea.style.display = "none";
+                       resizeBox.style.display = "block";
+
+                       // Add event handlers, only once
+                       if (!resizer.eventHandlers) {
+                               if (tinyMCE.isMSIE)
+                                       tinyMCE.addEvent(document, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);
+                               else
+                                       tinyMCE.addEvent(window, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);
+
+                               tinyMCE.addEvent(document, "mouseup", TinyMCE_AdvancedTheme._resizeEventHandler);
+
+                               resizer.eventHandlers = true;
+                       }
+
+                       resizer.resizing = true;
+                       resizer.downX = e.screenX;
+                       resizer.downY = e.screenY;
+                       resizer.width = parseInt(resizeBox.style.width);
+                       resizer.height = parseInt(resizeBox.style.height);
+                       resizer.editorId = editor_id;
+                       resizer.resizeBox = resizeBox;
+                       resizer.horizontal = tinyMCE.getParam("theme_advanced_resize_horizontal", true);
+               } else {
+                       resizer.resizing = false;
+                       resizeBox.style.display = "none";
+                       editorArea.style.display = tinyMCE.isMSIE && !tinyMCE.isOpera ? "block" : "table";
+                       tinyMCE.execCommand('mceResetDesignMode');
+               }
+       },
+
+       _getColorHTML : function(id, n, cm) {
+               var i, h, cl;
+
+               h = '<span class="mceMenuLine"></span>';
+               cl = tinyMCE.getParam(n, TinyMCE_AdvancedTheme._defColors).split(',');
+
+               h += '<table class="mceColors"><tr>';
+               for (i=0; i<cl.length; i++) {
+                       c = 'tinyMCE.execInstanceCommand(\'' + id + '\', \'' + cm + '\', false, \'#' + cl[i] + '\');';
+                       h += '<td><a href="javascript:' + c + '" style="background-color: #' + cl[i] + '" onclick="' + c + ';return false;"></a></td>';
+
+                       if ((i+1) % 8 == 0)
+                               h += '</tr><tr>';
+               }
+
+               h += '</tr></table>';
+
+               if (tinyMCE.getParam("theme_advanced_more_colors", true))
+                       h += '<a href="javascript:void(0);" onclick="TinyMCE_AdvancedTheme._pickColor(\'' + id + '\',\'' + cm + '\');" class="mceMoreColors">' + tinyMCE.getLang('lang_more_colors') + '</a>';
+
+               return h;
+       },
+
+       _pickColor : function(id, cm) {
+               var inputColor, inst = tinyMCE.selectedInstance;
+
+               if (cm == 'forecolor' && inst)
+                       inputColor = inst.foreColor;
+
+               if ((cm == 'backcolor' || cm == 'HiliteColor') && inst)
+                       inputColor = inst.backColor;
+
+               tinyMCE.execCommand('mceColorPicker', true, {color : inputColor, callback : function(c) {
+                       tinyMCE.execInstanceCommand(id, cm, false, c);
+               }});
+       },
+
+       _insertImage : function(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout) {
+               tinyMCE.execCommand("mceInsertContent", false, tinyMCE.createTagHTML('img', {
+                       src : tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, src), // Force absolute
+                       mce_src : src,
+                       alt : alt,
+                       border : border,
+                       hspace : hspace,
+                       vspace : vspace,
+                       width : width,
+                       height : height,
+                       align : align,
+                       title : title,
+                       onmouseover : onmouseover,
+                       onmouseout : onmouseout
+               }));
+       },
+
+       _insertLink : function(href, target, title, onclick, style_class) {
+               tinyMCE.execCommand('mceBeginUndoLevel');
+
+               if (tinyMCE.selectedInstance && tinyMCE.selectedElement && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {
+                       var doc = tinyMCE.selectedInstance.getDoc();
+                       var linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");
+                       var newLink = false;
+
+                       if (!linkElement) {
+                               linkElement = doc.createElement("a");
+                               newLink = true;
+                       }
+
+                       var mhref = href;
+                       var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);");
+                       mhref = tinyMCE.getParam('convert_urls') ? href : mhref;
+
+                       tinyMCE.setAttrib(linkElement, 'href', thref);
+                       tinyMCE.setAttrib(linkElement, 'mce_href', mhref);
+                       tinyMCE.setAttrib(linkElement, 'target', target);
+                       tinyMCE.setAttrib(linkElement, 'title', title);
+                       tinyMCE.setAttrib(linkElement, 'onclick', onclick);
+                       tinyMCE.setAttrib(linkElement, 'class', style_class);
+
+                       if (newLink) {
+                               linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));
+                               tinyMCE.selectedElement.parentNode.replaceChild(linkElement, tinyMCE.selectedElement);
+                       }
+
+                       return;
+               }
+
+               if (!tinyMCE.linkElement && tinyMCE.selectedInstance) {
+                       if (tinyMCE.isSafari) {
+                               tinyMCE.execCommand("mceInsertContent", false, '<a href="' + tinyMCE.uniqueURL + '">' + tinyMCE.selectedInstance.selection.getSelectedHTML() + '</a>');
+                       } else
+                               tinyMCE.selectedInstance.contentDocument.execCommand("createlink", false, tinyMCE.uniqueURL);
+
+                       tinyMCE.linkElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);
+
+                       var elementArray = tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);
+
+                       for (var i=0; i<elementArray.length; i++) {
+                               var mhref = href;
+                               var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, elementArray[i]);");
+                               mhref = tinyMCE.getParam('convert_urls') ? href : mhref;
+
+                               tinyMCE.setAttrib(elementArray[i], 'href', thref);
+                               tinyMCE.setAttrib(elementArray[i], 'mce_href', mhref);
+                               tinyMCE.setAttrib(elementArray[i], 'target', target);
+                               tinyMCE.setAttrib(elementArray[i], 'title', title);
+                               tinyMCE.setAttrib(elementArray[i], 'onclick', onclick);
+                               tinyMCE.setAttrib(elementArray[i], 'class', style_class);
+                       }
+
+                       tinyMCE.linkElement = elementArray[0];
+               }
+
+               if (tinyMCE.linkElement) {
+                       var mhref = href;
+                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement);");
+                       mhref = tinyMCE.getParam('convert_urls') ? href : mhref;
+
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'href', href);
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'mce_href', mhref);
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'target', target);
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'title', title);
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'onclick', onclick);
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'class', style_class);
+               }
+
+               tinyMCE.execCommand('mceEndUndoLevel');
+       }
+};
+
+tinyMCE.addTheme("advanced", TinyMCE_AdvancedTheme);
+
+// Add default buttons maps for advanced theme and all internal plugins
+tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);
index 96a9a758da38cf33c60fd3f0da6f67cf9eeb66eb..cceea955e40b66df26f9daa520ebabdc8602caad 100644 (file)
-<html xmlns="http://www.w3.org/1999/xhtml">\r
-<head>\r
-       <title>{$lang_insert_image_title}</title>\r
-       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
-       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
-       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
-       <script language="javascript" type="text/javascript" src="jscripts/image.js"></script>\r
-       <base target="_self" />\r
-</head>\r
-<body id="image" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
-<form onsubmit="insertImage();return false;" action="#">\r
-       <div class="tabs">\r
-               <ul>\r
-                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_insert_image_title}</a></span></li>\r
-               </ul>\r
-       </div>\r
-\r
-       <div class="panel_wrapper">\r
-               <div id="general_panel" class="panel current">\r
-     <table border="0" cellpadding="4" cellspacing="0">\r
-          <tr>\r
-            <td nowrap="nowrap"><label for="src">{$lang_insert_image_src}</label></td>\r
-            <td><table border="0" cellspacing="0" cellpadding="0">\r
-                <tr>\r
-                  <td><input id="src" name="src" type="text" value="" style="width: 200px" onchange="getImageData();" /></td>\r
-                  <td id="srcbrowsercontainer">&nbsp;</td>\r
-                </tr>\r
-              </table></td>\r
-          </tr>\r
-                 <!-- Image list -->\r
-                 <script language="javascript">\r
-                       if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {\r
-                               var html = "";\r
-\r
-                               html += '<tr><td><label for="image_list">{$lang_image_list}</label></td>';\r
-                               html += '<td><select id="image_list" name="image_list" style="width: 200px" onchange="this.form.src.value=this.options[this.selectedIndex].value;resetImageData();getImageData();">';\r
-                               html += '<option value="">---</option>';\r
-\r
-                               for (var i=0; i<tinyMCEImageList.length; i++)\r
-                                       html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[i][0] + '</option>';\r
-\r
-                               html += '</select></td></tr>';\r
-\r
-                               document.write(html);\r
-                       }\r
-                 </script>\r
-                 <!-- /Image list -->\r
-          <tr>\r
-            <td nowrap="nowrap"><label for="alt">{$lang_insert_image_alt}</label></td>\r
-            <td><input id="alt" name="alt" type="text" value="" style="width: 200px" /></td>\r
-          </tr>\r
-          <tr>\r
-            <td nowrap="nowrap"><label for="align">{$lang_insert_image_align}</label></td>\r
-            <td><select id="align" name="align">\r
-                <option value="">{$lang_insert_image_align_default}</option>\r
-                <option value="baseline">{$lang_insert_image_align_baseline}</option>\r
-                <option value="top">{$lang_insert_image_align_top}</option>\r
-                <option value="middle">{$lang_insert_image_align_middle}</option>\r
-                <option value="bottom">{$lang_insert_image_align_bottom}</option>\r
-                <option value="texttop">{$lang_insert_image_align_texttop}</option>\r
-                <option value="absmiddle">{$lang_insert_image_align_absmiddle}</option>\r
-                <option value="absbottom">{$lang_insert_image_align_absbottom}</option>\r
-                <option value="left">{$lang_insert_image_align_left}</option>\r
-                <option value="right">{$lang_insert_image_align_right}</option>\r
-              </select></td>\r
-          </tr>\r
-          <tr>\r
-            <td nowrap="nowrap"><label for="width">{$lang_insert_image_dimensions}</label></td>\r
-            <td><input id="width" name="width" type="text" value="" size="3" maxlength="5" />\r
-              x\r
-              <input id="height" name="height" type="text" value="" size="3" maxlength="5" /></td>\r
-          </tr>\r
-          <tr>\r
-            <td nowrap="nowrap"><label for="border">{$lang_insert_image_border}</label></td>\r
-            <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" /></td>\r
-          </tr>\r
-          <tr>\r
-            <td nowrap="nowrap"><label for="vspace">{$lang_insert_image_vspace}</label></td>\r
-            <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3" /></td>\r
-          </tr>\r
-          <tr>\r
-            <td nowrap="nowrap"><label for="hspace">{$lang_insert_image_hspace}</label></td>\r
-            <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3" /></td>\r
-          </tr>\r
-        </table>\r
-               </div>\r
-       </div>\r
-\r
-       <div class="mceActionPanel">\r
-               <div style="float: left">\r
-                       <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertImage();" />\r
-               </div>\r
-\r
-               <div style="float: right">\r
-                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
-               </div>\r
-       </div>\r
-</form>\r
-</body>\r
-</html>\r
+<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="5" />
+              x
+              <input id="height" name="height" type="text" value="" size="3" maxlength="5" /></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>
index ef604804e5a88b9c6b9249baa3117a23b9c96196..71e62a06d0646a284a28d00c375e108202fb26ee 100644 (file)
@@ -1 +1 @@
-function TinyMCE_Engine(){var ua;this.majorVersion="2";this.minorVersion="1.1.1";this.releaseDate="2007-05-14";this.instances=[];this.switchClassCache=[];this.windowArgs=[];this.loadedFiles=[];this.pendingFiles=[];this.loadingIndex=0;this.configs=[];this.currentConfig=0;this.eventHandlers=[];this.log=[];this.undoLevels=[];this.undoIndex=0;this.typingUndoIndex=-1;this.settings=[];ua=navigator.userAgent;this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.isMSIE5=this.isMSIE&&(ua.indexOf('MSIE 5')!=-1);this.isMSIE5_0=this.isMSIE&&(ua.indexOf('MSIE 5.0')!=-1);this.isMSIE7=this.isMSIE&&(ua.indexOf('MSIE 7')!=-1);this.isGecko=ua.indexOf('Gecko')!=-1;this.isSafari=ua.indexOf('Safari')!=-1;this.isOpera=window['opera']&&opera.buildNumber?true:false;this.isMac=ua.indexOf('Mac')!=-1;this.isNS7=ua.indexOf('Netscape/7')!=-1;this.isNS71=ua.indexOf('Netscape/7.1')!=-1;this.dialogCounter=0;this.plugins=[];this.themes=[];this.menus=[];this.loadedPlugins=[];this.buttonMap=[];this.isLoaded=false;if(this.isOpera){this.isMSIE=true;this.isGecko=false;this.isSafari=false}this.isIE=this.isMSIE;this.isRealIE=this.isMSIE&&!this.isOpera;this.idCounter=0};TinyMCE_Engine.prototype={init:function(settings){var theme,nl,baseHREF="",i,cssPath,entities,h,p,src,elements=[],head;if(this.isMSIE5_0)return;this.settings=settings;if(typeof(document.execCommand)=='undefined')return;if(!tinyMCE.baseURL){head=document.getElementsByTagName('head')[0];if(head){for(i=0,nl=head.getElementsByTagName('script');i<nl.length;i++)elements.push(nl[i])}for(i=0,nl=document.getElementsByTagName('script');i<nl.length;i++)elements.push(nl[i]);nl=document.getElementsByTagName('base');for(i=0;i<nl.length;i++){if(nl[i].href)baseHREF=nl[i].href}for(i=0;i<elements.length;i++){if(elements[i].src&&(elements[i].src.indexOf("tiny_mce.js")!=-1||elements[i].src.indexOf("tiny_mce_dev.js")!=-1||elements[i].src.indexOf("tiny_mce_src.js")!=-1||elements[i].src.indexOf("tiny_mce_gzip")!=-1)){src=elements[i].src;tinyMCE.srcMode=(src.indexOf('_src')!=-1||src.indexOf('_dev')!=-1)?'_src':'';tinyMCE.gzipMode=src.indexOf('_gzip')!=-1;src=src.substring(0,src.lastIndexOf('/'));if(settings.exec_mode=="src"||settings.exec_mode=="normal")tinyMCE.srcMode=settings.exec_mode=="src"?'_src':'';if(baseHREF!==''&&src.indexOf('://')==-1)tinyMCE.baseURL=baseHREF+src;else tinyMCE.baseURL=src;break}}}this.documentBasePath=document.location.href;if(this.documentBasePath.indexOf('?')!=-1)this.documentBasePath=this.documentBasePath.substring(0,this.documentBasePath.indexOf('?'));this.documentURL=this.documentBasePath;this.documentBasePath=this.documentBasePath.substring(0,this.documentBasePath.lastIndexOf('/'));if(tinyMCE.baseURL.indexOf('://')==-1&&tinyMCE.baseURL.charAt(0)!='/'){tinyMCE.baseURL=this.documentBasePath+"/"+tinyMCE.baseURL}this._def("mode","none");this._def("theme","advanced");this._def("plugins","",true);this._def("language","en");this._def("docs_language",this.settings.language);this._def("elements","");this._def("textarea_trigger","mce_editable");this._def("editor_selector","");this._def("editor_deselector","mceNoEditor");this._def("valid_elements","+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],cite[title|id|class|style|dir|lang],abbr[title|id|class|style|dir|lang],acronym[title|id|class|style|dir|lang],del[title|id|class|style|dir|lang|datetime|cite],ins[title|id|class|style|dir|lang|datetime|cite]");this._def("extended_valid_elements","");this._def("invalid_elements","");this._def("encoding","");this._def("urlconverter_callback",tinyMCE.getParam("urlconvertor_callback","TinyMCE_Engine.prototype.convertURL"));this._def("save_callback","");this._def("force_br_newlines",false);this._def("force_p_newlines",true);this._def("add_form_submit_trigger",true);this._def("relative_urls",true);this._def("remove_script_host",true);this._def("focus_alert",true);this._def("document_base_url",this.documentURL);this._def("visual",true);this._def("visual_table_class","mceVisualAid");this._def("setupcontent_callback","");this._def("fix_content_duplication",true);this._def("custom_undo_redo",true);this._def("custom_undo_redo_levels",-1);this._def("custom_undo_redo_keyboard_shortcuts",true);this._def("custom_undo_redo_restore_selection",true);this._def("custom_undo_redo_global",false);this._def("verify_html",true);this._def("apply_source_formatting",false);this._def("directionality","ltr");this._def("cleanup_on_startup",false);this._def("inline_styles",false);this._def("convert_newlines_to_brs",false);this._def("auto_reset_designmode",true);this._def("entities","39,#39,160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,34,quot,38,amp,60,lt,62,gt,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro",true);this._def("entity_encoding","named");this._def("cleanup_callback","");this._def("add_unload_trigger",true);this._def("ask",false);this._def("nowrap",false);this._def("auto_resize",false);this._def("auto_focus",false);this._def("cleanup",true);this._def("remove_linebreaks",true);this._def("button_tile_map",false);this._def("submit_patch",true);this._def("browsers","msie,safari,gecko,opera",true);this._def("dialog_type","window");this._def("accessibility_warnings",true);this._def("accessibility_focus",true);this._def("merge_styles_invalid_parents","");this._def("force_hex_style_colors",true);this._def("trim_span_elements",true);this._def("convert_fonts_to_spans",false);this._def("doctype",'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');this._def("font_size_classes",'');this._def("font_size_style_values",'xx-small,x-small,small,medium,large,x-large,xx-large',true);this._def("event_elements",'a,img',true);this._def("convert_urls",true);this._def("table_inline_editing",false);this._def("object_resizing",true);this._def("custom_shortcuts",true);this._def("convert_on_click",false);this._def("content_css",'');this._def("fix_list_elements",true);this._def("fix_table_elements",false);this._def("strict_loading_mode",document.contentType=='application/xhtml+xml');this._def("hidden_tab_class",'');this._def("display_tab_class",'');this._def("gecko_spellcheck",false);this._def("hide_selects_on_submit",true);this._def("forced_root_block",false);this._def("remove_trailing_nbsp",false);if(this.isMSIE&&!this.isOpera)this.settings.strict_loading_mode=false;if(this.isMSIE&&this.settings.browsers.indexOf('msie')==-1)return;if(this.isGecko&&this.settings.browsers.indexOf('gecko')==-1)return;if(this.isSafari&&this.settings.browsers.indexOf('safari')==-1)return;if(this.isOpera&&this.settings.browsers.indexOf('opera')==-1)return;baseHREF=tinyMCE.settings.document_base_url;h=document.location.href;p=h.indexOf('://');if(p>0&&document.location.protocol!="file:"){p=h.indexOf('/',p+3);h=h.substring(0,p);if(baseHREF.indexOf('://')==-1)baseHREF=h+baseHREF;tinyMCE.settings.document_base_url=baseHREF;tinyMCE.settings.document_base_prefix=h}if(baseHREF.indexOf('?')!=-1)baseHREF=baseHREF.substring(0,baseHREF.indexOf('?'));this.settings.base_href=baseHREF.substring(0,baseHREF.lastIndexOf('/'))+"/";theme=this.settings.theme;this.inlineStrict='A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';this.inlineTransitional='A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';this.blockElms='H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';this.blockRegExp=new RegExp("^("+this.blockElms+")$","i");this.posKeyCodes=[13,45,36,35,33,34,37,38,39,40];this.uniqueURL='javascript:void(091039730);';this.uniqueTag='<div id="mceTMPElement" style="display: none">TMP</div>';this.callbacks=['onInit','getInfo','getEditorTemplate','setupContent','onChange','onPageLoad','handleNodeChange','initInstance','execCommand','getControlHTML','handleEvent','cleanup','removeInstance'];this.settings.theme_href=tinyMCE.baseURL+"/themes/"+theme;if(!tinyMCE.isIE||tinyMCE.isOpera)this.settings.force_br_newlines=false;if(tinyMCE.getParam("popups_css",false)){cssPath=tinyMCE.getParam("popups_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings.popups_css=this.documentBasePath+"/"+cssPath;else this.settings.popups_css=cssPath}else this.settings.popups_css=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_popup.css";if(tinyMCE.getParam("editor_css",false)){cssPath=tinyMCE.getParam("editor_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings.editor_css=this.documentBasePath+"/"+cssPath;else this.settings.editor_css=cssPath}else{if(this.settings.editor_css!=='')this.settings.editor_css=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_ui.css"}if(this.configs.length==0){if(typeof(TinyMCECompressed)=="undefined"){tinyMCE.addEvent(window,"DOMContentLoaded",TinyMCE_Engine.prototype.onLoad);if(tinyMCE.isRealIE){if(document.body)tinyMCE.addEvent(document.body,"readystatechange",TinyMCE_Engine.prototype.onLoad);else tinyMCE.addEvent(document,"readystatechange",TinyMCE_Engine.prototype.onLoad)}tinyMCE.addEvent(window,"load",TinyMCE_Engine.prototype.onLoad);tinyMCE._addUnloadEvents()}}this.loadScript(tinyMCE.baseURL+'/themes/'+this.settings.theme+'/editor_template'+tinyMCE.srcMode+'.js');this.loadScript(tinyMCE.baseURL+'/langs/'+this.settings.language+'.js');this.loadCSS(this.settings.editor_css);p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(i=0;i<p.length;i++){if(p[i].charAt(0)!='-')this.loadScript(tinyMCE.baseURL+'/plugins/'+p[i]+'/editor_plugin'+tinyMCE.srcMode+'.js')}}if(tinyMCE.getParam('entity_encoding')=='named'){settings.cleanup_entities=[];entities=tinyMCE.getParam('entities','',true,',');for(i=0;i<entities.length;i+=2)settings.cleanup_entities['c'+entities[i]]=entities[i+1]}settings.index=this.configs.length;this.configs[this.configs.length]=settings;this.loadNextScript();if(this.isIE&&!this.isOpera){try{document.execCommand('BackgroundImageCache',false,true)}catch(e){}}this.xmlEncodeRe=new RegExp('[<>&"]','g')},_addUnloadEvents:function(){var st=tinyMCE.settings.add_unload_trigger;if(tinyMCE.isIE){if(st){tinyMCE.addEvent(window,"unload",TinyMCE_Engine.prototype.unloadHandler);tinyMCE.addEvent(window.document,"beforeunload",TinyMCE_Engine.prototype.unloadHandler)}}else{if(st)tinyMCE.addEvent(window,"unload",function(){tinyMCE.triggerSave(true,true)})}},_def:function(key,def_val,t){var v=tinyMCE.getParam(key,def_val);v=t?v.replace(/\s+/g,""):v;this.settings[key]=v},hasPlugin:function(n){return typeof(this.plugins[n])!="undefined"&&this.plugins[n]!=null},addPlugin:function(n,p){var op=this.plugins[n];p.baseURL=op?op.baseURL:tinyMCE.baseURL+"/plugins/"+n;this.plugins[n]=p;this.loadNextScript()},setPluginBaseURL:function(n,u){var op=this.plugins[n];if(op)op.baseURL=u;else this.plugins[n]={baseURL:u}},loadPlugin:function(n,u){u=u.indexOf('.js')!=-1?u.substring(0,u.lastIndexOf('/')):u;u=u.charAt(u.length-1)=='/'?u.substring(0,u.length-1):u;this.plugins[n]={baseURL:u};this.loadScript(u+"/editor_plugin"+(tinyMCE.srcMode?'_src':'')+".js")},hasTheme:function(n){return typeof(this.themes[n])!="undefined"&&this.themes[n]!=null},addTheme:function(n,t){this.themes[n]=t;this.loadNextScript()},addMenu:function(n,m){this.menus[n]=m},hasMenu:function(n){return typeof(this.plugins[n])!="undefined"&&this.plugins[n]!=null},loadScript:function(url){var i;for(i=0;i<this.loadedFiles.length;i++){if(this.loadedFiles[i]==url)return}if(tinyMCE.settings.strict_loading_mode)this.pendingFiles[this.pendingFiles.length]=url;else document.write('<sc'+'ript language="javascript" type="text/javascript" src="'+url+'"></script>');this.loadedFiles[this.loadedFiles.length]=url},loadNextScript:function(){var d=document,se;if(!tinyMCE.settings.strict_loading_mode)return;if(this.loadingIndex<this.pendingFiles.length){se=d.createElementNS('http://www.w3.org/1999/xhtml','script');se.setAttribute('language','javascript');se.setAttribute('type','text/javascript');se.setAttribute('src',this.pendingFiles[this.loadingIndex++]);d.getElementsByTagName("head")[0].appendChild(se)}else this.loadingIndex=-1;},loadCSS:function(url){var ar=url.replace(/\s+/,'').split(',');var lflen=0,csslen=0,skip=false;var x=0,i=0,nl,le;for(x=0,csslen=ar.length;x<csslen;x++){if(ar[x]!=null&&ar[x]!='null'&&ar[x].length>0){for(i=0,lflen=this.loadedFiles.length;i<lflen;i++){if(this.loadedFiles[i]==ar[x]){skip=true;break}}if(!skip){if(tinyMCE.settings.strict_loading_mode){nl=document.getElementsByTagName("head");le=document.createElement('link');le.setAttribute('href',ar[x]);le.setAttribute('rel','stylesheet');le.setAttribute('type','text/css');nl[0].appendChild(le)}else document.write('<link href="'+ar[x]+'" rel="stylesheet" type="text/css" />');this.loadedFiles[this.loadedFiles.length]=ar[x]}}}},importCSS:function(doc,css){var css_ary=css.replace(/\s+/,'').split(',');var csslen,elm,headArr,x,css_file;for(x=0,csslen=css_ary.length;x<csslen;x++){css_file=css_ary[x];if(css_file!=null&&css_file!='null'&&css_file.length>0){if(css_file.indexOf('://')==-1&&css_file.charAt(0)!='/')css_file=this.documentBasePath+"/"+css_file;if(typeof(doc.createStyleSheet)=="undefined"){elm=doc.createElement("link");elm.rel="stylesheet";elm.href=css_file;if((headArr=doc.getElementsByTagName("head"))!=null&&headArr.length>0)headArr[0].appendChild(elm)}else doc.createStyleSheet(css_file)}}},confirmAdd:function(e,settings){var elm=tinyMCE.isIE?event.srcElement:e.target;var elementId=elm.name?elm.name:elm.id;tinyMCE.settings=settings;if(tinyMCE.settings.convert_on_click||(!elm.getAttribute('mce_noask')&&confirm(tinyMCELang.lang_edit_confirm)))tinyMCE.addMCEControl(elm,elementId);elm.setAttribute('mce_noask','true')},updateContent:function(form_element_name){var formElement,n,inst,doc;formElement=document.getElementById(form_element_name);for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();if(inst.formElement==formElement){doc=inst.getDoc();tinyMCE._setHTML(doc,inst.formElement.value);if(!tinyMCE.isIE)doc.body.innerHTML=tinyMCE._cleanupHTML(inst,doc,this.settings,doc.body,inst.visualAid)}}},addMCEControl:function(replace_element,form_element_name,target_document){var id="mce_editor_"+tinyMCE.idCounter++;var inst=new TinyMCE_Control(tinyMCE.settings);inst.editorId=id;this.instances[id]=inst;inst._onAdd(replace_element,form_element_name,target_document)},removeInstance:function(ti){var t=[],n,i;for(n in tinyMCE.instances){i=tinyMCE.instances[n];if(tinyMCE.isInstance(i)&&ti!=i)t[n]=i}tinyMCE.instances=t;n=[];t=tinyMCE.undoLevels;for(i=0;i<t.length;i++){if(t[i]!=ti)n.push(t[i])}tinyMCE.undoLevels=n;tinyMCE.undoIndex=n.length;tinyMCE.dispatchCallback(ti,'remove_instance_callback','removeInstance',ti);return ti},removeMCEControl:function(editor_id){var inst=tinyMCE.getInstanceById(editor_id),h,re,ot,tn;if(inst){inst.switchSettings();editor_id=inst.editorId;h=tinyMCE.getContent(editor_id);this.removeInstance(inst);tinyMCE.selectedElement=null;tinyMCE.selectedInstance=null;re=document.getElementById(editor_id+"_parent");ot=inst.oldTargetElement;tn=ot.nodeName.toLowerCase();if(tn=="textarea"||tn=="input"){re.parentNode.removeChild(re);ot.style.display="inline";ot.value=h}else{ot.innerHTML=h;ot.style.display='block';re.parentNode.insertBefore(ot,re);re.parentNode.removeChild(re)}}},triggerSave:function(skip_cleanup,skip_callback){var inst,n;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.triggerSave(skip_cleanup,skip_callback)}},resetForm:function(form_index){var i,inst,n,formObj=document.forms[form_index];for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();for(i=0;i<formObj.elements.length;i++){if(inst.formTargetElementId==formObj.elements[i].name)inst.getBody().innerHTML=inst.startContent}}},execInstanceCommand:function(editor_id,command,user_interface,value,focus){var inst=tinyMCE.getInstanceById(editor_id),r;if(inst){r=inst.selection.getRng();if(typeof(focus)=="undefined")focus=true;if(focus&&(!r||!r.item))inst.contentWindow.focus();inst.autoResetDesignMode();this.selectedElement=inst.getFocusElement();inst.select();tinyMCE.execCommand(command,user_interface,value);if(tinyMCE.isIE&&window.event!=null)tinyMCE.cancelEvent(window.event)}},execCommand:function(command,user_interface,value){var inst=tinyMCE.selectedInstance,n,pe,te;user_interface=user_interface?user_interface:false;value=value?value:null;if(inst)inst.switchSettings();switch(command){case"Undo":if(this.getParam('custom_undo_redo_global')){if(this.undoIndex>0){tinyMCE.nextUndoRedoAction='Undo';inst=this.undoLevels[--this.undoIndex];inst.select();if(!tinyMCE.nextUndoRedoInstanceId)inst.execCommand('Undo')}}else inst.execCommand('Undo');return true;case"Redo":if(this.getParam('custom_undo_redo_global')){if(this.undoIndex<=this.undoLevels.length-1){tinyMCE.nextUndoRedoAction='Redo';inst=this.undoLevels[this.undoIndex++];inst.select();if(!tinyMCE.nextUndoRedoInstanceId)inst.execCommand('Redo')}}else inst.execCommand('Redo');return true;case'mceFocus':inst=tinyMCE.getInstanceById(value);if(inst)inst.getWin().focus();return;case"mceAddControl":case"mceAddEditor":tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case"mceAddFrameControl":tinyMCE.addMCEControl(tinyMCE._getElementById(value.element,value.document),value.element,value.document);return;case"mceRemoveControl":case"mceRemoveEditor":tinyMCE.removeMCEControl(value);return;case"mceToggleEditor":inst=tinyMCE.getInstanceById(value);if(inst){pe=document.getElementById(inst.editorId+'_parent');te=inst.oldTargetElement;if(typeof(inst.enabled)=='undefined')inst.enabled=true;inst.enabled=!inst.enabled;if(!inst.enabled){pe.style.display='none';if(te.nodeName=='TEXTAREA'||te.nodeName=='INPUT')te.value=inst.getHTML();else te.innerHTML=inst.getHTML();te.style.display=inst.oldTargetDisplay;tinyMCE.dispatchCallback(inst,'hide_instance_callback','hideInstance',inst)}else{pe.style.display='block';te.style.display='none';if(te.nodeName=='TEXTAREA'||te.nodeName=='INPUT')inst.setHTML(te.value);else inst.setHTML(te.innerHTML);inst.useCSS=false;tinyMCE.dispatchCallback(inst,'show_instance_callback','showInstance',inst)}}else tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case"mceResetDesignMode":if(tinyMCE.isGecko){for(n in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[n]))continue;try{tinyMCE.instances[n].getDoc().designMode="off";tinyMCE.instances[n].getDoc().designMode="on";tinyMCE.instances[n].useCSS=false}catch(e){}}}return}if(inst){inst.execCommand(command,user_interface,value)}else if(tinyMCE.settings.focus_alert)alert(tinyMCELang.lang_focus_alert)},_createIFrame:function(replace_element,doc,win){var iframe,id=replace_element.getAttribute("id");var aw,ah;if(typeof(doc)=="undefined")doc=document;if(typeof(win)=="undefined")win=window;iframe=doc.createElement("iframe");aw=""+tinyMCE.settings.area_width;ah=""+tinyMCE.settings.area_height;if(aw.indexOf('%')==-1){aw=parseInt(aw);aw=(isNaN(aw)||aw<0)?300:aw;aw=aw+"px"}if(ah.indexOf('%')==-1){ah=parseInt(ah);ah=(isNaN(ah)||ah<0)?240:ah;ah=ah+"px"}iframe.setAttribute("id",id);iframe.setAttribute("name",id);iframe.setAttribute("class","mceEditorIframe");iframe.setAttribute("border","0");iframe.setAttribute("frameBorder","0");iframe.setAttribute("marginWidth","0");iframe.setAttribute("marginHeight","0");iframe.setAttribute("leftMargin","0");iframe.setAttribute("topMargin","0");iframe.setAttribute("width",aw);iframe.setAttribute("height",ah);iframe.setAttribute("allowtransparency","true");iframe.className='mceEditorIframe';if(tinyMCE.settings.auto_resize)iframe.setAttribute("scrolling","no");if(tinyMCE.isRealIE)iframe.setAttribute("src",this.settings.default_document);iframe.style.width=aw;iframe.style.height=ah;if(tinyMCE.settings.strict_loading_mode)iframe.style.marginBottom='-5px';if(tinyMCE.isRealIE)replace_element.outerHTML=iframe.outerHTML;else replace_element.parentNode.replaceChild(iframe,replace_element);if(tinyMCE.isRealIE)return win.frames[id];else return iframe},setupContent:function(editor_id){var inst=tinyMCE.instances[editor_id],i,doc=inst.getDoc(),head=doc.getElementsByTagName('head').item(0);var content=inst.startContent,contentElement,body;if(tinyMCE.settings.strict_loading_mode){content=content.replace(/&lt;/g,'<');content=content.replace(/&gt;/g,'>');content=content.replace(/&quot;/g,'"');content=content.replace(/&amp;/g,'&')}tinyMCE.selectedInstance=inst;inst.switchSettings();if(!tinyMCE.isIE&&tinyMCE.getParam("setupcontent_reload",false)&&doc.title!="blank_page"){try{doc.location.href=tinyMCE.baseURL+"/blank.htm"}catch(ex){}window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",1000);return}if(!head||!doc.body){window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",10);return}tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/themes/"+inst.settings.theme+"/css/editor_content.css");tinyMCE.importCSS(inst.getDoc(),inst.settings.content_css);tinyMCE.dispatchCallback(inst,'init_instance_callback','initInstance',inst);if(tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')){inst.addShortcut('ctrl','z','lang_undo_desc','Undo');inst.addShortcut('ctrl','y','lang_redo_desc','Redo')}for(i=1;i<=6;i++)inst.addShortcut('ctrl',''+i,'','FormatBlock',false,'<h'+i+'>');inst.addShortcut('ctrl','7','','FormatBlock',false,'<p>');inst.addShortcut('ctrl','8','','FormatBlock',false,'<div>');inst.addShortcut('ctrl','9','','FormatBlock',false,'<address>');if(tinyMCE.isGecko){inst.addShortcut('ctrl','b','lang_bold_desc','Bold');inst.addShortcut('ctrl','i','lang_italic_desc','Italic');inst.addShortcut('ctrl','u','lang_underline_desc','Underline')}if(tinyMCE.getParam("convert_fonts_to_spans"))inst.getBody().setAttribute('id','mceSpanFonts');if(tinyMCE.settings.nowrap)doc.body.style.whiteSpace="nowrap";doc.body.dir=this.settings.directionality;doc.editorId=editor_id;if(!tinyMCE.isIE)doc.documentElement.editorId=editor_id;inst.setBaseHREF(tinyMCE.settings.base_href);if(tinyMCE.settings.convert_newlines_to_brs){content=tinyMCE.regexpReplace(content,"\r\n","<br />","gi");content=tinyMCE.regexpReplace(content,"\r","<br />","gi");content=tinyMCE.regexpReplace(content,"\n","<br />","gi")}content=tinyMCE.storeAwayURLs(content);content=tinyMCE._customCleanup(inst,"insert_to_editor",content);if(tinyMCE.isIE){window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["'+editor_id+'"].getDoc(), "'+editor_id+'");}catch(e){}',500);if(tinyMCE.settings.force_br_newlines)doc.styleSheets[0].addRule("p","margin: 0;");body=inst.getBody();body.editorId=editor_id}content=tinyMCE.cleanupHTMLCode(content);if(!tinyMCE.isIE){contentElement=inst.getDoc().createElement("body");doc=inst.getDoc();contentElement.innerHTML=content;if(tinyMCE.settings.cleanup_on_startup)tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,doc,this.settings,contentElement));else tinyMCE.setInnerHTML(inst.getBody(),content);tinyMCE.convertAllRelativeURLs(inst.getBody())}else{if(tinyMCE.settings.cleanup_on_startup){tinyMCE._setHTML(inst.getDoc(),content);try{tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,inst.contentDocument,this.settings,inst.getBody()))}catch(e){}}else tinyMCE._setHTML(inst.getDoc(),content)}tinyMCE.handleVisualAid(inst.getBody(),true,tinyMCE.settings.visual,inst);tinyMCE.dispatchCallback(inst,'setupcontent_callback','setupContent',editor_id,inst.getBody(),inst.getDoc());if(!tinyMCE.isIE)tinyMCE.addEventHandlers(inst);if(tinyMCE.isIE){tinyMCE.addEvent(inst.getBody(),"blur",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(inst.getBody(),"beforedeactivate",TinyMCE_Engine.prototype._eventPatch);if(!tinyMCE.isOpera){tinyMCE.addEvent(doc.body,"mousemove",TinyMCE_Engine.prototype.onMouseMove);tinyMCE.addEvent(doc.body,"beforepaste",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(doc.body,"drop",TinyMCE_Engine.prototype._eventPatch)}}inst.select();tinyMCE.selectedElement=inst.contentWindow.document.body;tinyMCE._customCleanup(inst,"insert_to_editor_dom",inst.getBody());tinyMCE._customCleanup(inst,"setup_content_dom",inst.getBody());tinyMCE._setEventsEnabled(inst.getBody(),false);tinyMCE.cleanupAnchors(inst.getDoc());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(inst.getDoc());inst.startContent=tinyMCE.trim(inst.getBody().innerHTML);inst.undoRedo.add({content:inst.startContent});if(tinyMCE.isGecko){tinyMCE.selectNodes(inst.getBody(),function(n){if(n.nodeType==3||n.nodeType==8)n.nodeValue=n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"','gi'),"");return false})}if(tinyMCE.isGecko)inst.getBody().spellcheck=tinyMCE.getParam("gecko_spellcheck");tinyMCE._removeInternal(inst.getBody());inst.select();tinyMCE.triggerNodeChange(false,true)},storeAwayURLs:function(s){if(!s.match(/(mce_src|mce_href)/gi,s)){s=s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"','gi'),'src="$1" mce_src="$1"');s=s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"','gi'),'href="$1" mce_href="$1"')}return s},_removeInternal:function(n){if(tinyMCE.isGecko){tinyMCE.selectNodes(n,function(n){if(n.nodeType==3||n.nodeType==8)n.nodeValue=n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"','gi'),"");return false})}},removeTinyMCEFormElements:function(form_obj){var i,elementId;if(!tinyMCE.getParam('hide_selects_on_submit'))return;if(typeof(form_obj)=="undefined"||form_obj==null)return;if(form_obj.nodeName!="FORM"){if(form_obj.form)form_obj=form_obj.form;else form_obj=tinyMCE.getParentElement(form_obj,"form")}if(form_obj==null)return;for(i=0;i<form_obj.elements.length;i++){elementId=form_obj.elements[i].name?form_obj.elements[i].name:form_obj.elements[i].id;if(elementId.indexOf('mce_editor_')==0)form_obj.elements[i].disabled=true}},handleEvent:function(e){var inst=tinyMCE.selectedInstance,i,elm,keys;if(typeof(tinyMCE)=="undefined")return true;if(tinyMCE.executeCallback(tinyMCE.selectedInstance,'handle_event_callback','handleEvent',e))return false;switch(e.type){case"beforedeactivate":case"blur":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.execCommand('mceEndTyping');tinyMCE.hideMenus();return;case"drop":case"beforepaste":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.setBaseHREF(null);if(tinyMCE.isRealIE){var ife=tinyMCE.selectedInstance.iframeElement;if(ife.style.height.indexOf('%')!=-1){ife._oldHeight=ife.style.height;ife.style.height=ife.clientHeight}}window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings.base_href);tinyMCE._resetIframeHeight();",1);return;case"submit":tinyMCE.formSubmit(tinyMCE.isMSIE?window.event.srcElement:e.target);return;case"reset":var formObj=tinyMCE.isIE?window.event.srcElement:e.target;for(i=0;i<document.forms.length;i++){if(document.forms[i]==formObj)window.setTimeout('tinyMCE.resetForm('+i+');',10)}return;case"keypress":if(inst&&inst.handleShortcut(e))return false;if(e.target.editorId){tinyMCE.instances[e.target.editorId].select()}else{if(e.target.ownerDocument.editorId)tinyMCE.instances[e.target.ownerDocument.editorId].select()}if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();if((tinyMCE.isGecko||tinyMCE.isOpera||tinyMCE.isSafari)&&tinyMCE.settings.force_p_newlines&&e.keyCode==13&&!e.shiftKey){if(TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance,e)){tinyMCE.execCommand("mceAddUndoLevel");return tinyMCE.cancelEvent(e)}}if((tinyMCE.isGecko&&!tinyMCE.isSafari)&&tinyMCE.settings.force_p_newlines&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance,e.type)){tinyMCE.execCommand("mceAddUndoLevel");return tinyMCE.cancelEvent(e)}}if(tinyMCE.isIE&&tinyMCE.settings.force_br_newlines&&e.keyCode==13){if(e.target.editorId)tinyMCE.instances[e.target.editorId].select();if(tinyMCE.selectedInstance){var sel=tinyMCE.selectedInstance.getDoc().selection;var rng=sel.createRange();if(tinyMCE.getParentElement(rng.parentElement(),"li")!=null)return false;e.returnValue=false;e.cancelBubble=true;rng.pasteHTML("<br />");rng.collapse(false);rng.select();tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange(false);return false}}if(e.keyCode==8||e.keyCode==46){tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(e.target,"a");tinyMCE.imgElement=tinyMCE.getParentElement(e.target,"img");tinyMCE.triggerNodeChange(false)}return false;case"keyup":case"keydown":tinyMCE.hideMenus();tinyMCE.hasMouseMoved=false;if(inst&&inst.handleShortcut(e))return false;inst._fixRootBlocks();if(inst.settings.remove_trailing_nbsp)inst._fixTrailingNbsp();if(e.target.editorId)tinyMCE.instances[e.target.editorId].select();if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();inst=tinyMCE.selectedInstance;if(tinyMCE.isGecko&&tinyMCE.settings.force_p_newlines&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance,e.type)){tinyMCE.execCommand("mceAddUndoLevel");e.preventDefault();return false}}tinyMCE.selectedElement=null;tinyMCE.selectedNode=null;elm=tinyMCE.selectedInstance.getFocusElement();tinyMCE.linkElement=tinyMCE.getParentElement(elm,"a");tinyMCE.imgElement=tinyMCE.getParentElement(elm,"img");tinyMCE.selectedElement=elm;if(tinyMCE.isGecko&&e.type=="keyup"&&e.keyCode==9)tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(),true,tinyMCE.settings.visual,tinyMCE.selectedInstance);if(tinyMCE.isIE&&e.type=="keydown"&&e.keyCode==13)tinyMCE.enterKeyElement=tinyMCE.selectedInstance.getFocusElement();if(tinyMCE.isIE&&e.type=="keyup"&&e.keyCode==13){elm=tinyMCE.enterKeyElement;if(elm){var re=new RegExp('^HR|IMG|BR$','g');var dre=new RegExp('^H[1-6]$','g');if(!elm.hasChildNodes()&&!re.test(elm.nodeName)){if(dre.test(elm.nodeName))elm.innerHTML="&nbsp;&nbsp;";else elm.innerHTML="&nbsp;"}}}keys=tinyMCE.posKeyCodes;var posKey=false;for(i=0;i<keys.length;i++){if(keys[i]==e.keyCode){posKey=true;break}}if(tinyMCE.isIE&&tinyMCE.settings.custom_undo_redo){keys=[8,46];for(i=0;i<keys.length;i++){if(keys[i]==e.keyCode){if(e.type=="keyup")tinyMCE.triggerNodeChange(false)}}}if(e.keyCode==17)return true;if(tinyMCE.isGecko){if(!posKey&&e.type=="keyup"&&!e.ctrlKey||(e.ctrlKey&&(e.keyCode==86||e.keyCode==88)))tinyMCE.execCommand("mceStartTyping")}else{if(!posKey&&e.type=="keyup")tinyMCE.execCommand("mceStartTyping")}if(e.type=="keydown"&&(posKey||e.ctrlKey)&&inst)inst.undoBookmark=inst.selection.getBookmark();if(e.type=="keyup"&&(posKey||e.ctrlKey))tinyMCE.execCommand("mceEndTyping");if(posKey&&e.type=="keyup")tinyMCE.triggerNodeChange(false);if(tinyMCE.isIE&&e.ctrlKey)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);break;case"mousedown":case"mouseup":case"click":case"dblclick":case"focus":tinyMCE.hideMenus();if(tinyMCE.selectedInstance){tinyMCE.selectedInstance.switchSettings();tinyMCE.selectedInstance.isFocused=true}var targetBody=tinyMCE.getParentElement(e.target,"html");for(var instanceName in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[instanceName]))continue;inst=tinyMCE.instances[instanceName];inst.autoResetDesignMode();if(inst.getBody().parentNode==targetBody){inst.select();tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");tinyMCE.imgElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"img");break}}if(!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark&&(e.type=="mouseup"||e.type=="dblclick"))tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark=tinyMCE.selectedInstance.selection.getBookmark();if(e.type!="focus")tinyMCE.selectedNode=null;tinyMCE.triggerNodeChange(false);tinyMCE.execCommand("mceEndTyping");if(e.type=="mouseup")tinyMCE.execCommand("mceAddUndoLevel");if(!tinyMCE.selectedInstance&&e.target.editorId)tinyMCE.instances[e.target.editorId].select();return false}},getButtonHTML:function(id,lang,img,cmd,ui,val){var h='',m,x,io='';cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+cmd+'\'';if(typeof(ui)!="undefined"&&ui!=null)cmd+=','+ui;if(typeof(val)!="undefined"&&val!=null)cmd+=",'"+val+"'";cmd+=');';if(tinyMCE.isRealIE)io='onmouseover="tinyMCE.lastHover = this;"';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isIE||tinyMCE.isOpera)&&(m=this.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" '+io+' class="mceTiledButton mceButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="background-position: '+x+'px 0" alt="{$'+lang+'}" title="{$'+lang+'}" />';h+='</a>'}else{h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" '+io+' class="mceButtonNormal" target="_self">';h+='<img src="'+img+'" alt="{$'+lang+'}" title="{$'+lang+'}" />';h+='</a>'}return h},getMenuButtonHTML:function(id,lang,img,mcmd,cmd,ui,val){var h='',m,x;mcmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+mcmd+'\');';cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+cmd+'\'';if(typeof(ui)!="undefined"&&ui!=null)cmd+=','+ui;if(typeof(val)!="undefined"&&val!=null)cmd+=",'"+val+"'";cmd+=');';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isIE||tinyMCE.isOpera)&&(m=tinyMCE.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);if(tinyMCE.isRealIE)h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';else h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton">';h+='<a href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceTiledButton mceMenuButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="width: 20px; height: 20px; background-position: '+x+'px 0" title="{$'+lang+'}" /></a>';h+='<a href="javascript:'+mcmd+'" onclick="'+mcmd+'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" />';h+='</a></span>'}else{if(tinyMCE.isRealIE)h+='<span id="{$editor_id}_'+id+'" dir="ltr" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';else h+='<span id="{$editor_id}_'+id+'" dir="ltr" class="mceMenuButton">';h+='<a href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';h+='<img src="'+img+'" title="{$'+lang+'}" /></a>';h+='<a href="javascript:'+mcmd+'" onclick="'+mcmd+'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" />';h+='</a></span>'}return h},_menuButtonEvent:function(e,o){if(o.className=='mceMenuButtonFocus')return;if(e=='over')o.className=o.className+' mceMenuHover';else o.className=o.className.replace(/\s.*$/,'')},addButtonMap:function(m){var i,a=m.replace(/\s+/,'').split(',');for(i=0;i<a.length;i++)this.buttonMap[a[i]]=i},formSubmit:function(f,p){var n,inst,found=false;if(f.form)f=f.form;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.formElement){if(f==inst.formElement.form){found=true;inst.isNotDirty=true}}}if(found){tinyMCE.removeTinyMCEFormElements(f);tinyMCE.triggerSave()}if(f.mceOldSubmit&&p)f.mceOldSubmit()},submitPatch:function(){tinyMCE.formSubmit(this,true)},onLoad:function(){var r,i,c,mode,trigger,elements,element,settings,elementId,elm;var selector,deselector,elementRefAr,form;if(tinyMCE.settings.strict_loading_mode&&this.loadingIndex!=-1){window.setTimeout('tinyMCE.onLoad();',1);return}if(tinyMCE.isRealIE&&window.event.type=="readystatechange"&&document.readyState!="complete")return true;if(tinyMCE.isLoaded)return true;tinyMCE.isLoaded=true;if(tinyMCE.isRealIE&&document.body&&window.location.href!=window.top.location.href){r=document.body.createTextRange();r.collapse(true);r.select()}tinyMCE.dispatchCallback(null,'onpageload','onPageLoad');for(c=0;c<tinyMCE.configs.length;c++){tinyMCE.settings=tinyMCE.configs[c];selector=tinyMCE.getParam("editor_selector");deselector=tinyMCE.getParam("editor_deselector");elementRefAr=[];if(document.forms&&tinyMCE.settings.add_form_submit_trigger&&!tinyMCE.submitTriggers){for(i=0;i<document.forms.length;i++){form=document.forms[i];tinyMCE.addEvent(form,"submit",TinyMCE_Engine.prototype.handleEvent);tinyMCE.addEvent(form,"reset",TinyMCE_Engine.prototype.handleEvent);tinyMCE.submitTriggers=true;if(tinyMCE.settings.submit_patch){try{form.mceOldSubmit=form.submit;form.submit=TinyMCE_Engine.prototype.submitPatch}catch(e){}}}}mode=tinyMCE.settings.mode;switch(mode){case"exact":elements=tinyMCE.getParam('elements','',true,',');for(i=0;i<elements.length;i++){element=tinyMCE._getElementById(elements[i]);trigger=element?element.getAttribute(tinyMCE.settings.textarea_trigger):"";if(new RegExp('\\b'+deselector+'\\b').test(tinyMCE.getAttrib(element,"class")))continue;if(trigger=="false")continue;if((tinyMCE.settings.ask||tinyMCE.settings.convert_on_click)&&element){elementRefAr[elementRefAr.length]=element;continue}if(element)tinyMCE.addMCEControl(element,elements[i])}break;case"specific_textareas":case"textareas":elements=document.getElementsByTagName("textarea");for(i=0;i<elements.length;i++){elm=elements.item(i);trigger=elm.getAttribute(tinyMCE.settings.textarea_trigger);if(selector!==''&&!new RegExp('\\b'+selector+'\\b').test(tinyMCE.getAttrib(elm,"class")))continue;if(selector!=='')trigger=selector!==''?"true":"";if(new RegExp('\\b'+deselector+'\\b').test(tinyMCE.getAttrib(elm,"class")))continue;if((mode=="specific_textareas"&&trigger=="true")||(mode=="textareas"&&trigger!="false"))elementRefAr[elementRefAr.length]=elm}break}for(i=0;i<elementRefAr.length;i++){element=elementRefAr[i];elementId=element.name?element.name:element.id;if(tinyMCE.settings.ask||tinyMCE.settings.convert_on_click){if(tinyMCE.isGecko){settings=tinyMCE.settings;tinyMCE.addEvent(element,"focus",function(e){window.setTimeout(function(){TinyMCE_Engine.prototype.confirmAdd(e,settings)},10)});if(element.nodeName!="TEXTAREA"&&element.nodeName!="INPUT")tinyMCE.addEvent(element,"click",function(e){window.setTimeout(function(){TinyMCE_Engine.prototype.confirmAdd(e,settings)},10)});}else{settings=tinyMCE.settings;tinyMCE.addEvent(element,"focus",function(){TinyMCE_Engine.prototype.confirmAdd(null,settings)});tinyMCE.addEvent(element,"click",function(){TinyMCE_Engine.prototype.confirmAdd(null,settings)});}}else tinyMCE.addMCEControl(element,elementId)}if(tinyMCE.settings.auto_focus){window.setTimeout(function(){var inst=tinyMCE.getInstanceById(tinyMCE.settings.auto_focus);inst.selection.selectNode(inst.getBody(),true,true);inst.contentWindow.focus()},100)}tinyMCE.dispatchCallback(null,'oninit','onInit')}},isInstance:function(o){return o!=null&&typeof(o)=="object"&&o.isTinyMCE_Control},getParam:function(name,default_value,strip_whitespace,split_chr){var i,outArray,value=(typeof(this.settings[name])=="undefined")?default_value:this.settings[name];if(value=="true"||value=="false")return(value=="true");if(strip_whitespace)value=tinyMCE.regexpReplace(value,"[ \t\r\n]","");if(typeof(split_chr)!="undefined"&&split_chr!=null){value=value.split(split_chr);outArray=[];for(i=0;i<value.length;i++){if(value[i]&&value[i]!=='')outArray[outArray.length]=value[i]}value=outArray}return value},getLang:function(name,default_value,parse_entities,va){var v=(typeof(tinyMCELang[name])=="undefined")?default_value:tinyMCELang[name],n;if(parse_entities)v=tinyMCE.entityDecode(v);if(va){for(n in va)v=this.replaceVar(v,n,va[n])}return v},entityDecode:function(s){var e=document.createElement("div");e.innerHTML=s;return!e.firstChild?s:e.firstChild.nodeValue},addToLang:function(prefix,ar){var k;for(k in ar){if(typeof(ar[k])=='function')continue;tinyMCELang[(k.indexOf('lang_')==-1?'lang_':'')+(prefix!==''?(prefix+"_"):'')+k]=ar[k]}this.loadNextScript()},triggerNodeChange:function(focus,setup_content){var elm,inst,editorId,undoIndex=-1,undoLevels=-1,doc,anySelection=false,st;if(tinyMCE.selectedInstance){inst=tinyMCE.selectedInstance;elm=(typeof(setup_content)!="undefined"&&setup_content)?tinyMCE.selectedElement:inst.getFocusElement();editorId=inst.editorId;st=inst.selection.getSelectedText();if(tinyMCE.settings.auto_resize)inst.resizeToContent();if(setup_content&&tinyMCE.isGecko&&inst.isHidden())elm=inst.getBody();inst.switchSettings();if(tinyMCE.selectedElement)anySelection=(tinyMCE.selectedElement.nodeName.toLowerCase()=="img")||(st&&st.length>0);if(tinyMCE.settings.custom_undo_redo){undoIndex=inst.undoRedo.undoIndex;undoLevels=inst.undoRedo.undoLevels.length}tinyMCE.dispatchCallback(inst,'handle_node_change_callback','handleNodeChange',editorId,elm,undoIndex,undoLevels,inst.visualAid,anySelection,setup_content)}if(this.selectedInstance&&(typeof(focus)=="undefined"||focus))this.selectedInstance.contentWindow.focus()},_customCleanup:function(inst,type,content){var pl,po,i,customCleanup;customCleanup=tinyMCE.settings.cleanup_callback;if(customCleanup!='')content=tinyMCE.resolveDots(tinyMCE.settings.cleanup_callback,window)(type,content,inst);po=tinyMCE.themes[tinyMCE.settings.theme];if(po&&po.cleanup)content=po.cleanup(type,content,inst);pl=inst.plugins;for(i=0;i<pl.length;i++){po=tinyMCE.plugins[pl[i]];if(po&&po.cleanup)content=po.cleanup(type,content,inst)}return content},setContent:function(h){if(tinyMCE.selectedInstance){tinyMCE.selectedInstance.execCommand('mceSetContent',false,h);tinyMCE.selectedInstance.repaint()}},importThemeLanguagePack:function(name){if(typeof(name)=="undefined")name=tinyMCE.settings.theme;tinyMCE.loadScript(tinyMCE.baseURL+'/themes/'+name+'/langs/'+tinyMCE.settings.language+'.js')},importPluginLanguagePack:function(name){var b=tinyMCE.baseURL+'/plugins/'+name;if(this.plugins[name])b=this.plugins[name].baseURL;tinyMCE.loadScript(b+'/langs/'+tinyMCE.settings.language+'.js')},applyTemplate:function(h,ag){return h.replace(new RegExp('\\{\\$([a-z0-9_]+)\\}','gi'),function(m,s){if(s.indexOf('lang_')==0&&tinyMCELang[s])return tinyMCELang[s];if(ag&&ag[s])return ag[s];if(tinyMCE.settings[s])return tinyMCE.settings[s];if(m=='themeurl')return tinyMCE.themeURL;return m})},replaceVar:function(h,r,v){return h.replace(new RegExp('{\\\$'+r+'}','g'),v)},openWindow:function(template,args){var html,width,height,x,y,resizable,scrollbars,url,name,win,modal,features;args=!args?{}:args;args.mce_template_file=template.file;args.mce_width=template.width;args.mce_height=template.height;tinyMCE.windowArgs=args;html=template.html;if(!(width=parseInt(template.width)))width=320;if(!(height=parseInt(template.height)))height=200;if(tinyMCE.isIE)height+=40;else height+=20;x=parseInt(screen.width/ 2.0) - (width /2.0);y=parseInt(screen.height/ 2.0) - (height /2.0);resizable=(args&&args.resizable)?args.resizable:"no";scrollbars=(args&&args.scrollbars)?args.scrollbars:"no";if(template.file.charAt(0)!='/'&&template.file.indexOf('://')==-1)url=tinyMCE.baseURL+"/themes/"+tinyMCE.getParam("theme")+"/"+template.file;else url=template.file;for(name in args){if(typeof(args[name])=='function')continue;url=tinyMCE.replaceVar(url,name,escape(args[name]))}if(html){html=tinyMCE.replaceVar(html,"css",this.settings.popups_css);html=tinyMCE.applyTemplate(html,args);win=window.open("","mcePopup"+new Date().getTime(),"top="+y+",left="+x+",scrollbars="+scrollbars+",dialog=yes,minimizable="+resizable+",modal=yes,width="+width+",height="+height+",resizable="+resizable);if(win==null){alert(tinyMCELang.lang_popup_blocked);return}win.document.write(html);win.document.close();win.resizeTo(width,height);win.focus()}else{if((tinyMCE.isRealIE)&&resizable!='yes'&&tinyMCE.settings.dialog_type=="modal"){height+=10;features="resizable:"+resizable+";scroll:"+scrollbars+";status:yes;center:yes;help:no;dialogWidth:"+width+"px;dialogHeight:"+height+"px;";window.showModalDialog(url,window,features)}else{modal=(resizable=="yes")?"no":"yes";if(tinyMCE.isGecko&&tinyMCE.isMac)modal="no";if(template.close_previous!="no")try{tinyMCE.lastWindow.close()}catch(ex){}win=window.open(url,"mcePopup"+new Date().getTime(),"top="+y+",left="+x+",scrollbars="+scrollbars+",dialog="+modal+",minimizable="+resizable+",modal="+modal+",width="+width+",height="+height+",resizable="+resizable);if(win==null){alert(tinyMCELang.lang_popup_blocked);return}if(template.close_previous!="no")tinyMCE.lastWindow=win;try{win.resizeTo(width,height)}catch(e){}if(tinyMCE.isGecko){if(win.document.defaultView.statusbar.visible)win.resizeBy(0,tinyMCE.isMac?10:24)}win.focus()}}},closeWindow:function(win){win.close()},getVisualAidClass:function(class_name,state){var i,classNames,ar,className,aidClass=tinyMCE.settings.visual_table_class;if(typeof(state)=="undefined")state=tinyMCE.settings.visual;classNames=[];ar=class_name.split(' ');for(i=0;i<ar.length;i++){if(ar[i]==aidClass)ar[i]="";if(ar[i]!=='')classNames[classNames.length]=ar[i]}if(state)classNames[classNames.length]=aidClass;className="";for(i=0;i<classNames.length;i++){if(i>0)className+=" ";className+=classNames[i]}return className},handleVisualAid:function(el,deep,state,inst,skip_dispatch){var i,x,y,tableElement,anchorName,oldW,oldH,bo,cn;if(!el)return;if(!skip_dispatch)tinyMCE.dispatchCallback(inst,'handle_visual_aid_callback','handleVisualAid',el,deep,state,inst);tableElement=null;switch(el.nodeName){case"TABLE":oldW=el.style.width;oldH=el.style.height;bo=tinyMCE.getAttrib(el,"border");bo=bo==''||bo=="0"?true:false;tinyMCE.setAttrib(el,"class",tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el,"class"),state&&bo));el.style.width=oldW;el.style.height=oldH;for(y=0;y<el.rows.length;y++){for(x=0;x<el.rows[y].cells.length;x++){cn=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x],"class"),state&&bo);tinyMCE.setAttrib(el.rows[y].cells[x],"class",cn)}}break;case"A":anchorName=tinyMCE.getAttrib(el,"name");if(anchorName!==''&&state){el.title=anchorName;tinyMCE.addCSSClass(el,'mceItemAnchor')}else if(anchorName!==''&&!state)el.className='';break}if(deep&&el.hasChildNodes()){for(i=0;i<el.childNodes.length;i++)tinyMCE.handleVisualAid(el.childNodes[i],deep,state,inst,true)}},fixGeckoBaseHREFBug:function(m,e,h){var xsrc,xhref;if(tinyMCE.isGecko){if(m==1){h=h.replace(/\ssrc=/gi," mce_tsrc=");h=h.replace(/\shref=/gi," mce_thref=");return h}else{if(!new RegExp('(src|href)=','g').test(h))return h;tinyMCE.selectElements(e,'A,IMG,SELECT,AREA,IFRAME,BASE,INPUT,SCRIPT,EMBED,OBJECT,LINK',function(n){xsrc=tinyMCE.getAttrib(n,"mce_tsrc");xhref=tinyMCE.getAttrib(n,"mce_thref");if(xsrc!==''){try{n.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,xsrc)}catch(e){}n.removeAttribute("mce_tsrc")}if(xhref!==''){try{n.href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,xhref)}catch(e){}n.removeAttribute("mce_thref")}return false});tinyMCE.selectNodes(e,function(n){if(n.nodeType==3||n.nodeType==8){n.nodeValue=n.nodeValue.replace(/\smce_tsrc=/gi," src=");n.nodeValue=n.nodeValue.replace(/\smce_thref=/gi," href=")}return false})}}return h},_setHTML:function(doc,html_content){var i,html,paras,node;html_content=tinyMCE.cleanupHTMLCode(html_content);try{tinyMCE.setInnerHTML(doc.body,html_content)}catch(e){if(this.isMSIE)doc.body.createTextRange().pasteHTML(html_content)}if(tinyMCE.isIE&&tinyMCE.settings.fix_content_duplication){paras=doc.getElementsByTagName("P");for(i=0;i<paras.length;i++){node=paras[i];while((node=node.parentNode)!=null){if(node.nodeName=="P")node.outerHTML=node.innerHTML}}html=doc.body.innerHTML;tinyMCE.setInnerHTML(doc.body,html)}tinyMCE.cleanupAnchors(doc);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc)},getEditorId:function(form_element){var inst=this.getInstanceById(form_element);if(!inst)return null;return inst.editorId},getInstanceById:function(editor_id){var inst=this.instances[editor_id],n;if(!inst){for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.formTargetElementId==editor_id)return inst}}else return inst;return null},queryInstanceCommandValue:function(editor_id,command){var inst=tinyMCE.getInstanceById(editor_id);if(inst)return inst.queryCommandValue(command);return false},queryInstanceCommandState:function(editor_id,command){var inst=tinyMCE.getInstanceById(editor_id);if(inst)return inst.queryCommandState(command);return null},setWindowArg:function(n,v){this.windowArgs[n]=v},getWindowArg:function(n,d){return(typeof(this.windowArgs[n])=="undefined")?d:this.windowArgs[n]},getCSSClasses:function(editor_id,doc){var i,c,x,rule,styles,rules,csses,selectorText,inst=tinyMCE.getInstanceById(editor_id);var cssClass,addClass,p;if(!inst)inst=tinyMCE.selectedInstance;if(!inst)return[];if(!doc)doc=inst.getDoc();if(inst&&inst.cssClasses.length>0)return inst.cssClasses;if(!doc)return;styles=doc.styleSheets;if(styles&&styles.length>0){for(x=0;x<styles.length;x++){csses=null;try{csses=tinyMCE.isIE?doc.styleSheets(x).rules:styles[x].cssRules}catch(e){}if(!csses)return[];for(i=0;i<csses.length;i++){selectorText=csses[i].selectorText;if(selectorText){rules=selectorText.split(',');for(c=0;c<rules.length;c++){rule=rules[c];while(rule.indexOf(' ')==0)rule=rule.substring(1);if(rule.indexOf(' ')!=-1||rule.indexOf(':')!=-1||rule.indexOf('mceItem')!=-1)continue;if(rule.indexOf(tinyMCE.settings.visual_table_class)!=-1||rule.indexOf('mceEditable')!=-1||rule.indexOf('mceNonEditable')!=-1)continue;if(rule.indexOf('.')!=-1){cssClass=rule.substring(rule.indexOf('.')+1);addClass=true;for(p=0;p<inst.cssClasses.length&&addClass;p++){if(inst.cssClasses[p]==cssClass)addClass=false}if(addClass)inst.cssClasses[inst.cssClasses.length]=cssClass}}}}}}return inst.cssClasses},regexpReplace:function(in_str,reg_exp,replace_str,opts){var re;if(in_str==null)return in_str;if(typeof(opts)=="undefined")opts='g';re=new RegExp(reg_exp,opts);return in_str.replace(re,replace_str)},trim:function(s){return s.replace(/^\s*|\s*$/g,"")},cleanupEventStr:function(s){s=""+s;s=s.replace('function anonymous()\n{\n','');s=s.replace('\n}','');s=s.replace(/^return true;/gi,'');return s},getControlHTML:function(c){var i,l,n,o,v,rtl=tinyMCE.getLang('lang_dir')=='rtl';l=tinyMCE.plugins;for(n in l){o=l[n];if(o.getControlHTML&&(v=o.getControlHTML(c))!==''){if(rtl)return'<span dir="rtl">'+tinyMCE.replaceVar(v,"pluginurl",o.baseURL)+'</span>';return tinyMCE.replaceVar(v,"pluginurl",o.baseURL)}}o=tinyMCE.themes[tinyMCE.settings.theme];if(o.getControlHTML&&(v=o.getControlHTML(c))!==''){if(rtl)return'<span dir="rtl">'+v+'</span>';return v}return''},evalFunc:function(f,idx,a,o){o=!o?window:o;f=typeof(f)=='function'?f:o[f];return f.apply(o,Array.prototype.slice.call(a,idx))},dispatchCallback:function(i,p,n){return this.callFunc(i,p,n,0,this.dispatchCallback.arguments)},executeCallback:function(i,p,n){return this.callFunc(i,p,n,1,this.executeCallback.arguments)},execCommandCallback:function(i,p,n){return this.callFunc(i,p,n,2,this.execCommandCallback.arguments)},callFunc:function(ins,p,n,m,a){var l,i,on,o,s,v;s=m==2;l=tinyMCE.getParam(p,'');if(l!==''&&(v=tinyMCE.evalFunc(l,3,a))==s&&m>0)return true;if(ins!=null){for(i=0,l=ins.plugins;i<l.length;i++){o=tinyMCE.plugins[l[i]];if(o[n]&&(v=tinyMCE.evalFunc(n,3,a,o))==s&&m>0)return true}}l=tinyMCE.themes;for(on in l){o=l[on];if(o[n]&&(v=tinyMCE.evalFunc(n,3,a,o))==s&&m>0)return true}return false},resolveDots:function(s,o){var i;if(typeof(s)=='string'){for(i=0,s=s.split('.');i<s.length;i++)o=o[s[i]]}else o=s;return o},xmlEncode:function(s){return s?(''+s).replace(this.xmlEncodeRe,function(c,b){switch(c){case'&':return'&amp;';case'"':return'&quot;';case'<':return'&lt;';case'>':return'&gt;'}return c}):s},add:function(c,m){var n;for(n in m)c.prototype[n]=m[n]},extend:function(p,np){var o={},n;o.parent=p;for(n in p)o[n]=p[n];for(n in np)o[n]=np[n];return o},hideMenus:function(){var e=tinyMCE.lastSelectedMenuBtn;if(tinyMCE.lastMenu){tinyMCE.lastMenu.hide();tinyMCE.lastMenu=null}if(e){tinyMCE.switchClass(e,tinyMCE.lastMenuBtnClass);tinyMCE.lastSelectedMenuBtn=null}}};var TinyMCE=TinyMCE_Engine;var tinyMCE=new TinyMCE_Engine();var tinyMCELang={};function TinyMCE_Control(settings){var t,i,tos,fu,p,x,fn,fu,pn,s=settings;this.undoRedoLevel=true;this.isTinyMCE_Control=true;this.enabled=true;this.settings=s;this.settings.theme=tinyMCE.getParam("theme","default");this.settings.width=tinyMCE.getParam("width",-1);this.settings.height=tinyMCE.getParam("height",-1);this.selection=new TinyMCE_Selection(this);this.undoRedo=new TinyMCE_UndoRedo(this);this.cleanup=new TinyMCE_Cleanup();this.shortcuts=[];this.hasMouseMoved=false;this.foreColor=this.backColor="#999999";this.data={};this.cssClasses=[];this.cleanup.init({valid_elements:s.valid_elements,extended_valid_elements:s.extended_valid_elements,valid_child_elements:s.valid_child_elements,entities:s.entities,entity_encoding:s.entity_encoding,debug:s.cleanup_debug,indent:s.apply_source_formatting,invalid_elements:s.invalid_elements,verify_html:s.verify_html,fix_content_duplication:s.fix_content_duplication,convert_fonts_to_spans:s.convert_fonts_to_spans});t=this.settings.theme;if(!tinyMCE.hasTheme(t)){fn=tinyMCE.callbacks;tos={};for(i=0;i<fn.length;i++){if((fu=window['TinyMCE_'+t+"_"+fn[i]]))tos[fn[i]]=fu}tinyMCE.addTheme(t,tos)}this.plugins=[];p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(i=0;i<p.length;i++){pn=p[i];if(pn.charAt(0)=='-')pn=pn.substring(1);if(!tinyMCE.hasPlugin(pn)){fn=tinyMCE.callbacks;tos={};for(x=0;x<fn.length;x++){if((fu=window['TinyMCE_'+pn+"_"+fn[x]]))tos[fn[x]]=fu}tinyMCE.addPlugin(pn,tos)}this.plugins[this.plugins.length]=pn}}};TinyMCE_Control.prototype={selection:null,settings:null,cleanup:null,getData:function(na){var o=this.data[na];if(!o)o=this.data[na]={};return o},hasPlugin:function(n){var i;for(i=0;i<this.plugins.length;i++){if(this.plugins[i]==n)return true}return false},addPlugin:function(n,p){if(!this.hasPlugin(n)){tinyMCE.addPlugin(n,p);this.plugins[this.plugins.length]=n}},repaint:function(){var s,b,ex;if(tinyMCE.isRealIE)return;try{s=this.selection;b=s.getBookmark(true);this.getBody().style.display='none';this.getDoc().execCommand('selectall',false,null);this.getSel().collapseToStart();this.getBody().style.display='block';s.moveToBookmark(b)}catch(ex){}},switchSettings:function(){if(tinyMCE.configs.length>1&&tinyMCE.currentConfig!=this.settings.index){tinyMCE.settings=this.settings;tinyMCE.currentConfig=this.settings.index}},select:function(){var oldInst=tinyMCE.selectedInstance;if(oldInst!=this){if(oldInst)oldInst.execCommand('mceEndTyping');tinyMCE.dispatchCallback(this,'select_instance_callback','selectInstance',this,oldInst);tinyMCE.selectedInstance=this}},getBody:function(){return this.contentBody?this.contentBody:this.getDoc().body},getDoc:function(){return this.contentWindow.document},getWin:function(){return this.contentWindow},getContainerWin:function(){return this.containerWindow?this.containerWindow:window},getViewPort:function(){return tinyMCE.getViewPort(this.getWin())},getParentNode:function(n,f){return tinyMCE.getParentNode(n,f,this.getBody())},getParentElement:function(n,na,f){return tinyMCE.getParentElement(n,na,f,this.getBody())},getParentBlockElement:function(n){return tinyMCE.getParentBlockElement(n,this.getBody())},resizeToContent:function(){var d=this.getDoc(),b=d.body,de=d.documentElement;this.iframeElement.style.height=(tinyMCE.isRealIE)?b.scrollHeight:de.offsetHeight+'px'},addShortcut:function(m,k,d,cmd,ui,va){var n=typeof(k)=="number",ie=tinyMCE.isIE,c,sc,i,scl=this.shortcuts;if(!tinyMCE.getParam('custom_shortcuts'))return false;m=m.toLowerCase();k=ie&&!n?k.toUpperCase():k;c=n?null:k.charCodeAt(0);d=d&&d.indexOf('lang_')==0?tinyMCE.getLang(d):d;sc={alt:m.indexOf('alt')!=-1,ctrl:m.indexOf('ctrl')!=-1,shift:m.indexOf('shift')!=-1,charCode:c,keyCode:n?k:(ie?c:null),desc:d,cmd:cmd,ui:ui,val:va};for(i=0;i<scl.length;i++){if(sc.alt==scl[i].alt&&sc.ctrl==scl[i].ctrl&&sc.shift==scl[i].shift&&sc.charCode==scl[i].charCode&&sc.keyCode==scl[i].keyCode){return false}}scl[scl.length]=sc;return true},handleShortcut:function(e){var i,s,o;if(!e.altKey&&!e.ctrlKey)return false;s=this.shortcuts;for(i=0;i<s.length;i++){o=s[i];if(o.alt==e.altKey&&o.ctrl==e.ctrlKey&&(o.keyCode==e.keyCode||o.charCode==e.charCode)){if(o.cmd&&(e.type=="keydown"||(e.type=="keypress"&&!tinyMCE.isOpera)))tinyMCE.execCommand(o.cmd,o.ui,o.val);tinyMCE.cancelEvent(e);return true}}return false},autoResetDesignMode:function(){if(!tinyMCE.isIE&&this.isHidden()&&tinyMCE.getParam('auto_reset_designmode'))eval('try { this.getDoc().designMode = "On"; this.useCSS = false; } catch(e) {}')},isHidden:function(){var s;if(tinyMCE.isIE)return false;s=this.getSel();return(!s||!s.rangeCount||s.rangeCount==0)},isDirty:function(){return tinyMCE.trim(this.startContent)!=tinyMCE.trim(this.getBody().innerHTML)&&!this.isNotDirty},_mergeElements:function(scmd,pa,ch,override){var st,stc,className,n;if(scmd=="removeformat"){pa.className="";pa.style.cssText="";ch.className="";ch.style.cssText="";return}st=tinyMCE.parseStyle(tinyMCE.getAttrib(pa,"style"));stc=tinyMCE.parseStyle(tinyMCE.getAttrib(ch,"style"));className=tinyMCE.getAttrib(pa,"class");className=tinyMCE.getAttrib(ch,"class");if(override){for(n in st){if(typeof(st[n])=='function')continue;stc[n]=st[n]}}else{for(n in stc){if(typeof(stc[n])=='function')continue;st[n]=stc[n]}}tinyMCE.setAttrib(pa,"style",tinyMCE.serializeStyle(st));tinyMCE.setAttrib(pa,"class",tinyMCE.trim(className));ch.className="";ch.style.cssText="";ch.removeAttribute("class");ch.removeAttribute("style")},_fixRootBlocks:function(){var rb,b,ne,be,nx,bm;rb=tinyMCE.getParam('forced_root_block');if(!rb)return;b=this.getBody();ne=b.firstChild;while(ne){nx=ne.nextSibling;if(ne.nodeType==3||!tinyMCE.blockRegExp.test(ne.nodeName)){if(!bm)bm=this.selection.getBookmark();if(!be){be=this.getDoc().createElement(rb);be.appendChild(ne.cloneNode(true));b.replaceChild(be,ne)}else{be.appendChild(ne.cloneNode(true));b.removeChild(ne)}}else be=null;ne=nx}if(bm)this.selection.moveToBookmark(bm)},_fixTrailingNbsp:function(){var s=this.selection,e=s.getFocusElement(),bm,v;if(e&&tinyMCE.blockRegExp.test(e.nodeName)&&e.firstChild){v=e.firstChild.nodeValue;if(v&&v.length>1&&/(^\u00a0|\u00a0$)/.test(v)){e.firstChild.nodeValue=v.replace(/(^\u00a0|\u00a0$)/,'');s.selectNode(e.firstChild,true,false,false);}}},_setUseCSS:function(b){var d=this.getDoc();try{d.execCommand("useCSS",false,!b)}catch(ex){}try{d.execCommand("styleWithCSS",false,b)}catch(ex){}if(!tinyMCE.getParam("table_inline_editing"))try{d.execCommand('enableInlineTableEditing',false,"false")}catch(ex){}if(!tinyMCE.getParam("object_resizing"))try{d.execCommand('enableObjectResizing',false,"false")}catch(ex){}},execCommand:function(command,user_interface,value){var i,x,z,align,img,div,doc=this.getDoc(),win=this.getWin(),focusElm=this.getFocusElement();if(!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel','gi').test(command))this.undoBookmark=null;if(!tinyMCE.isIE&&!this.useCSS){this._setUseCSS(false);this.useCSS=true}this.contentDocument=doc;if(!/mceStartTyping|mceEndTyping/.test(command)){if(tinyMCE.execCommandCallback(this,'execcommand_callback','execCommand',this.editorId,this.getBody(),command,user_interface,value))return}if(focusElm&&focusElm.nodeName=="IMG"){align=focusElm.getAttribute('align');img=command=="JustifyCenter"?focusElm.cloneNode(false):focusElm;switch(command){case"JustifyLeft":if(align=='left')img.removeAttribute('align');else img.setAttribute('align','left');div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case"JustifyCenter":img.removeAttribute('align');div=tinyMCE.getParentElement(focusElm,"div");if(div&&div.style.textAlign=="center"){if(div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div)}else{div=this.getDoc().createElement("div");div.style.textAlign='center';div.appendChild(img);focusElm.parentNode.replaceChild(div,focusElm)}this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case"JustifyRight":if(align=='right')img.removeAttribute('align');else img.setAttribute('align','right');div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return}}if(tinyMCE.settings.force_br_newlines){var alignValue="";if(doc.selection.type!="Control"){switch(command){case"JustifyLeft":alignValue="left";break;case"JustifyCenter":alignValue="center";break;case"JustifyFull":alignValue="justify";break;case"JustifyRight":alignValue="right";break}if(alignValue!==''){var rng=doc.selection.createRange();if((divElm=tinyMCE.getParentElement(rng.parentElement(),"div"))!=null)divElm.setAttribute("align",alignValue);else if(rng.pasteHTML&&rng.htmlText.length>0)rng.pasteHTML('<div align="'+alignValue+'">'+rng.htmlText+"</div>");tinyMCE.triggerNodeChange();return}}}switch(command){case"mceRepaint":this.repaint();return true;case"unlink":if(tinyMCE.isGecko&&this.getSel().isCollapsed){focusElm=tinyMCE.getParentElement(focusElm,'A');if(focusElm)this.selection.selectNode(focusElm,false)}this.getDoc().execCommand(command,user_interface,value);tinyMCE.isGecko&&this.getSel().collapseToEnd();tinyMCE.triggerNodeChange();return true;case"InsertUnorderedList":case"InsertOrderedList":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"Strikethrough":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"mceSelectNode":this.selection.selectNode(value);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=value;break;case"FormatBlock":if(value==null||value==''){var elm=tinyMCE.getParentElement(this.getFocusElement(),"p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");if(elm)this.execCommand("mceRemoveNode",false,elm)}else{if(!this.cleanup.isValid(value))return true;if(tinyMCE.isGecko&&new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>','gi').test(value))value=value.replace(/[^a-z]/gi,'');if(tinyMCE.isIE&&new RegExp('blockquote|code|samp','gi').test(value)){var b=this.selection.getBookmark();this.getDoc().execCommand("FormatBlock",false,'<p>');tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()),value);this.selection.moveToBookmark(b)}else this.getDoc().execCommand("FormatBlock",false,value)}tinyMCE.triggerNodeChange();break;case"mceRemoveNode":if(!value)value=tinyMCE.getParentElement(this.getFocusElement());if(tinyMCE.isIE){value.outerHTML=value.innerHTML}else{var rng=value.ownerDocument.createRange();rng.setStartBefore(value);rng.setEndAfter(value);rng.deleteContents();rng.insertNode(rng.createContextualFragment(value.innerHTML))}tinyMCE.triggerNodeChange();break;case"mceSelectNodeDepth":var parentNode=this.getFocusElement();for(i=0;parentNode;i++){if(parentNode.nodeName.toLowerCase()=="body")break;if(parentNode.nodeName.toLowerCase()=="#text"){i--;parentNode=parentNode.parentNode;continue}if(i==value){this.selection.selectNode(parentNode,false);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=parentNode;return}parentNode=parentNode.parentNode}break;case"mceSetStyleInfo":case"SetStyleInfo":var rng=this.getRng();var sel=this.getSel();var scmd=value.command;var sname=value.name;var svalue=value.value==null?'':value.value;var wrapper=value.wrapper?value.wrapper:"span";var parentElm=null;var invalidRe=new RegExp("^BODY|HTML$","g");var invalidParentsRe=tinyMCE.settings.merge_styles_invalid_parents!==''?new RegExp(tinyMCE.settings.merge_styles_invalid_parents,"gi"):null;if(tinyMCE.isIE){if(rng.item)parentElm=rng.item(0);else{var pelm=rng.parentElement();var prng=doc.selection.createRange();prng.moveToElementText(pelm);if(rng.htmlText==prng.htmlText||rng.boundingWidth==0){if(invalidParentsRe==null||!invalidParentsRe.test(pelm.nodeName))parentElm=pelm}}}else{var felm=this.getFocusElement();if(sel.isCollapsed||(new RegExp('td|tr|tbody|table|img','gi').test(felm.nodeName)&&sel.anchorNode==felm.parentNode))parentElm=felm}if(parentElm&&!invalidRe.test(parentElm.nodeName)){if(scmd=="setstyle")tinyMCE.setStyleAttrib(parentElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(parentElm,sname,svalue);if(scmd=="removeformat"){parentElm.style.cssText='';tinyMCE.setAttrib(parentElm,'class','')}var ch=tinyMCE.getNodeTree(parentElm,[],1);for(z=0;z<ch.length;z++){if(ch[z]==parentElm)continue;if(scmd=="setstyle")tinyMCE.setStyleAttrib(ch[z],sname,'');if(scmd=="setattrib")tinyMCE.setAttrib(ch[z],sname,'');if(scmd=="removeformat"){ch[z].style.cssText='';tinyMCE.setAttrib(ch[z],'class','')}}}else{this._setUseCSS(false);doc.execCommand("FontName",false,"#mce_temp_font#");var elementArray=tinyMCE.getElementsByAttributeValue(this.getBody(),"font","face","#mce_temp_font#");for(x=0;x<elementArray.length;x++){elm=elementArray[x];if(elm){var spanElm=doc.createElement(wrapper);if(scmd=="setstyle")tinyMCE.setStyleAttrib(spanElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(spanElm,sname,svalue);if(scmd=="removeformat"){spanElm.style.cssText='';tinyMCE.setAttrib(spanElm,'class','')}if(elm.hasChildNodes()){for(i=0;i<elm.childNodes.length;i++)spanElm.appendChild(elm.childNodes[i].cloneNode(true))}spanElm.setAttribute("mce_new","true");elm.parentNode.replaceChild(spanElm,elm);var ch=tinyMCE.getNodeTree(spanElm,[],1);for(z=0;z<ch.length;z++){if(ch[z]==spanElm)continue;if(scmd=="setstyle")tinyMCE.setStyleAttrib(ch[z],sname,'');if(scmd=="setattrib")tinyMCE.setAttrib(ch[z],sname,'');if(scmd=="removeformat"){ch[z].style.cssText='';tinyMCE.setAttrib(ch[z],'class','')}}}}}var nodes=doc.getElementsByTagName(wrapper);for(i=nodes.length-1;i>=0;i--){var elm=nodes[i];var isNew=tinyMCE.getAttrib(elm,"mce_new")=="true";elm.removeAttribute("mce_new");if(elm.childNodes&&elm.childNodes.length==1&&elm.childNodes[0].nodeType==1){this._mergeElements(scmd,elm,elm.childNodes[0],isNew);continue}if(elm.parentNode.childNodes.length==1&&!invalidRe.test(elm.nodeName)&&!invalidRe.test(elm.parentNode.nodeName)){if(invalidParentsRe==null||!invalidParentsRe.test(elm.parentNode.nodeName))this._mergeElements(scmd,elm.parentNode,elm,false)}}var nodes=doc.getElementsByTagName(wrapper);for(i=nodes.length-1;i>=0;i--){var elm=nodes[i],isEmpty=true;var tmp=doc.createElement("body");tmp.appendChild(elm.cloneNode(false));tmp.innerHTML=tmp.innerHTML.replace(new RegExp('style=""|class=""','gi'),'');if(new RegExp('<span>','gi').test(tmp.innerHTML)){for(x=0;x<elm.childNodes.length;x++){if(elm.parentNode!=null)elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true),elm)}elm.parentNode.removeChild(elm)}}if(scmd=="removeformat")tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE.triggerNodeChange();break;case"FontName":if(value==null){var s=this.getSel();if(tinyMCE.isGecko&&s.isCollapsed){var f=tinyMCE.getParentElement(this.getFocusElement(),"font");if(f!=null)this.selection.selectNode(f,false)}this.getDoc().execCommand("RemoveFormat",false,null);if(f!=null&&tinyMCE.isGecko){var r=this.getRng().cloneRange();r.collapse(true);s.removeAllRanges();s.addRange(r)}}else this.getDoc().execCommand('FontName',false,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);return;case"FontSize":this.getDoc().execCommand('FontSize',false,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);return;case"forecolor":value=value==null?this.foreColor:value;value=tinyMCE.trim(value);value=value.charAt(0)!='#'?(isNaN('0x'+value)?value:'#'+value):value;this.foreColor=value;this.getDoc().execCommand('forecolor',false,value);break;case"HiliteColor":value=value==null?this.backColor:value;value=tinyMCE.trim(value);value=value.charAt(0)!='#'?(isNaN('0x'+value)?value:'#'+value):value;this.backColor=value;if(tinyMCE.isGecko){this._setUseCSS(true);this.getDoc().execCommand('hilitecolor',false,value);this._setUseCSS(false)}else this.getDoc().execCommand('BackColor',false,value);break;case"Cut":case"Copy":case"Paste":var cmdFailed=false;eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');if(tinyMCE.isOpera&&cmdFailed)alert('Currently not supported by your browser, use keyboard shortcuts instead.');if(tinyMCE.isGecko&&cmdFailed){if(confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_clipboard_msg'))))window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');return}else tinyMCE.triggerNodeChange();break;case"mceSetContent":if(!value)value="";value=tinyMCE.storeAwayURLs(value);value=tinyMCE._customCleanup(this,"insert_to_editor",value);if(this.getBody().nodeName=='BODY')tinyMCE._setHTML(doc,value);else this.getBody().innerHTML=value;tinyMCE.setInnerHTML(this.getBody(),tinyMCE._cleanupHTML(this,doc,this.settings,this.getBody(),false,false,false,true));tinyMCE.convertAllRelativeURLs(this.getBody());tinyMCE._removeInternal(this.getBody());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE._setEventsEnabled(this.getBody(),false);this._addBogusBR();return true;case"mceCleanup":var b=this.selection.getBookmark();tinyMCE._setHTML(this.contentDocument,this.getBody().innerHTML);tinyMCE.setInnerHTML(this.getBody(),tinyMCE._cleanupHTML(this,this.contentDocument,this.settings,this.getBody(),this.visualAid));tinyMCE.convertAllRelativeURLs(doc.body);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE._setEventsEnabled(this.getBody(),false);this._addBogusBR();this.repaint();this.selection.moveToBookmark(b);tinyMCE.triggerNodeChange();break;case"mceReplaceContent":if(!value)value='';this.getWin().focus();var selectedText="";if(tinyMCE.isIE){var rng=doc.selection.createRange();selectedText=rng.text}else selectedText=this.getSel().toString();if(selectedText.length>0){value=tinyMCE.replaceVar(value,"selection",selectedText);tinyMCE.execCommand('mceInsertContent',false,value)}this._addBogusBR();tinyMCE.triggerNodeChange();break;case"mceSetAttribute":if(typeof(value)=='object'){var targetElms=(typeof(value.targets)=="undefined")?"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address":value.targets;var targetNode=tinyMCE.getParentElement(this.getFocusElement(),targetElms);if(targetNode){targetNode.setAttribute(value.name,value.value);tinyMCE.triggerNodeChange()}}break;case"mceSetCSSClass":this.execCommand("mceSetStyleInfo",false,{command:"setattrib",name:"class",value:value});break;case"mceInsertRawHTML":var key='tiny_mce_marker';this.execCommand('mceBeginUndoLevel');this.execCommand('mceInsertContent',false,key);var scrollX=this.getBody().scrollLeft+this.getDoc().documentElement.scrollLeft;var scrollY=this.getBody().scrollTop+this.getDoc().documentElement.scrollTop;var html=this.getBody().innerHTML;if((pos=html.indexOf(key))!=-1)tinyMCE.setInnerHTML(this.getBody(),html.substring(0,pos)+value+html.substring(pos+key.length));this.contentWindow.scrollTo(scrollX,scrollY);this.execCommand('mceEndUndoLevel');break;case"mceInsertContent":if(!value)value='';var insertHTMLFailed=false;if(tinyMCE.isGecko||tinyMCE.isOpera){try{if(value.indexOf('<')==-1&&!value.match(/(&#38;|&#160;|&#60;|&#62;)/g)){var r=this.getRng();var n=this.getDoc().createTextNode(tinyMCE.entityDecode(value));var s=this.getSel();var r2=r.cloneRange();s.removeAllRanges();r.deleteContents();r.insertNode(n);r2.selectNode(n);r2.collapse(false);s.removeAllRanges();s.addRange(r2)}else{value=tinyMCE.fixGeckoBaseHREFBug(1,this.getDoc(),value);this.getDoc().execCommand('inserthtml',false,value);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value)}}catch(ex){insertHTMLFailed=true}if(!insertHTMLFailed){tinyMCE.triggerNodeChange();return}}if(!tinyMCE.isIE){var isHTML=value.indexOf('<')!=-1;var sel=this.getSel();var rng=this.getRng();if(isHTML){if(tinyMCE.isSafari){var tmpRng=this.getDoc().createRange();tmpRng.setStart(this.getBody(),0);tmpRng.setEnd(this.getBody(),0);value=tmpRng.createContextualFragment(value)}else value=rng.createContextualFragment(value)}else{value=doc.createTextNode(tinyMCE.entityDecode(value))}if(tinyMCE.isSafari&&!isHTML){this.execCommand('InsertText',false,value.nodeValue);tinyMCE.triggerNodeChange();return true}else if(tinyMCE.isSafari&&isHTML){rng.deleteContents();rng.insertNode(value);tinyMCE.triggerNodeChange();return true}rng.deleteContents();if(rng.startContainer.nodeType==3){var node=rng.startContainer.splitText(rng.startOffset);node.parentNode.insertBefore(value,node)}else rng.insertNode(value);if(!isHTML){sel.selectAllChildren(doc.body);sel.removeAllRanges();var rng=doc.createRange();rng.selectNode(value);rng.collapse(false);sel.addRange(rng)}else rng.collapse(false);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value)}else{var rng=doc.selection.createRange(),tmpRng=null;var c=value.indexOf('<!--')!=-1;if(c)value=tinyMCE.uniqueTag+value;if(rng.item)rng.item(0).outerHTML=value;else rng.pasteHTML(value);if(c){var e=this.getDoc().getElementById('mceTMPElement');e.parentNode.removeChild(e)}}tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange();break;case"mceStartTyping":if(tinyMCE.settings.custom_undo_redo&&this.undoRedo.typingUndoIndex==-1){this.undoRedo.typingUndoIndex=this.undoRedo.undoIndex;tinyMCE.typingUndoIndex=tinyMCE.undoIndex;this.execCommand('mceAddUndoLevel')}break;case"mceEndTyping":if(tinyMCE.settings.custom_undo_redo&&this.undoRedo.typingUndoIndex!=-1){this.execCommand('mceAddUndoLevel');this.undoRedo.typingUndoIndex=-1}tinyMCE.typingUndoIndex=-1;break;case"mceBeginUndoLevel":this.undoRedoLevel=false;break;case"mceEndUndoLevel":this.undoRedoLevel=true;this.execCommand('mceAddUndoLevel');break;case"mceAddUndoLevel":if(tinyMCE.settings.custom_undo_redo&&this.undoRedoLevel){if(this.undoRedo.add())tinyMCE.triggerNodeChange(false)}break;case"Undo":if(tinyMCE.settings.custom_undo_redo){tinyMCE.execCommand("mceEndTyping");this.undoRedo.undo();tinyMCE.triggerNodeChange()}else this.getDoc().execCommand(command,user_interface,value);break;case"Redo":if(tinyMCE.settings.custom_undo_redo){tinyMCE.execCommand("mceEndTyping");this.undoRedo.redo();tinyMCE.triggerNodeChange()}else this.getDoc().execCommand(command,user_interface,value);break;case"mceToggleVisualAid":this.visualAid=!this.visualAid;tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE.triggerNodeChange();break;case"Indent":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();if(tinyMCE.isIE){var n=tinyMCE.getParentElement(this.getFocusElement(),"blockquote");do{if(n&&n.nodeName=="BLOCKQUOTE"){n.removeAttribute("dir");n.removeAttribute("style")}}while(n!=null&&(n=n.parentNode)!=null)}break;case"RemoveFormat":case"removeformat":var text=this.selection.getSelectedText();if(tinyMCE.isOpera){this.getDoc().execCommand("RemoveFormat",false,null);return}if(tinyMCE.isIE){try{var rng=doc.selection.createRange();rng.execCommand("RemoveFormat",false,null)}catch(e){}this.execCommand("mceSetStyleInfo",false,{command:"removeformat"})}else{this.getDoc().execCommand(command,user_interface,value);this.execCommand("mceSetStyleInfo",false,{command:"removeformat"})}if(text.length==0)this.execCommand("mceSetCSSClass",false,"");tinyMCE.triggerNodeChange();break;default:this.getDoc().execCommand(command,user_interface,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);else tinyMCE.triggerNodeChange()}if(command!="mceAddUndoLevel"&&command!="Undo"&&command!="Redo"&&command!="mceStartTyping"&&command!="mceEndTyping")tinyMCE.execCommand("mceAddUndoLevel")},queryCommandValue:function(c){try{return this.getDoc().queryCommandValue(c)}catch(e){return null}},queryCommandState:function(c){return this.getDoc().queryCommandState(c)},_addBogusBR:function(){var b=this.getBody();if(tinyMCE.isGecko&&!b.hasChildNodes())b.innerHTML='<br _moz_editor_bogus_node="TRUE" />'},_onAdd:function(replace_element,form_element_name,target_document){var hc,th,tos,editorTemplate,targetDoc,deltaWidth,deltaHeight,html,rng,fragment;var dynamicIFrame,tElm,doc,parentElm;th=this.settings.theme;tos=tinyMCE.themes[th];targetDoc=target_document?target_document:document;this.targetDoc=targetDoc;tinyMCE.themeURL=tinyMCE.baseURL+"/themes/"+this.settings.theme;this.settings.themeurl=tinyMCE.themeURL;if(!replace_element){alert("Error: Could not find the target element.");return false}if(tos.getEditorTemplate)editorTemplate=tos.getEditorTemplate(this.settings,this.editorId);deltaWidth=editorTemplate.delta_width?editorTemplate.delta_width:0;deltaHeight=editorTemplate.delta_height?editorTemplate.delta_height:0;html='<span id="'+this.editorId+'_parent" class="mceEditorContainer">'+editorTemplate.html;html=tinyMCE.replaceVar(html,"editor_id",this.editorId);if(!this.settings.default_document)this.settings.default_document=tinyMCE.baseURL+"/blank.htm";this.settings.old_width=this.settings.width;this.settings.old_height=this.settings.height;if(this.settings.width==-1)this.settings.width=replace_element.offsetWidth;if(this.settings.height==-1)this.settings.height=replace_element.offsetHeight;if(this.settings.width==0)this.settings.width=replace_element.style.width;if(this.settings.height==0)this.settings.height=replace_element.style.height;if(this.settings.width==0)this.settings.width=320;if(this.settings.height==0)this.settings.height=240;this.settings.area_width=parseInt(this.settings.width);this.settings.area_height=parseInt(this.settings.height);this.settings.area_width+=deltaWidth;this.settings.area_height+=deltaHeight;this.settings.width_style=""+this.settings.width;this.settings.height_style=""+this.settings.height;if((""+this.settings.width).indexOf('%')!=-1)this.settings.area_width="100%";else this.settings.width_style+='px';if((""+this.settings.height).indexOf('%')!=-1)this.settings.area_height="100%";else this.settings.height_style+='px';if((""+replace_element.style.width).indexOf('%')!=-1){this.settings.width=replace_element.style.width;this.settings.area_width="100%";this.settings.width_style="100%"}if((""+replace_element.style.height).indexOf('%')!=-1){this.settings.height=replace_element.style.height;this.settings.area_height="100%";this.settings.height_style="100%"}html=tinyMCE.applyTemplate(html);this.settings.width=this.settings.old_width;this.settings.height=this.settings.old_height;this.visualAid=this.settings.visual;this.formTargetElementId=form_element_name;if(replace_element.nodeName=="TEXTAREA"||replace_element.nodeName=="INPUT")this.startContent=replace_element.value;else this.startContent=replace_element.innerHTML;if(replace_element.nodeName!="TEXTAREA"&&replace_element.nodeName!="INPUT"){this.oldTargetElement=replace_element;hc='<input type="hidden" id="'+form_element_name+'" name="'+form_element_name+'" />';this.oldTargetDisplay=tinyMCE.getStyle(this.oldTargetElement,'display','inline');this.oldTargetElement.style.display="none";html+='</span>';if(tinyMCE.isGecko)html=hc+html;else html+=hc;if(tinyMCE.isGecko){rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);fragment=rng.createContextualFragment(html);tinyMCE.insertAfter(fragment,replace_element)}else replace_element.insertAdjacentHTML("beforeBegin",html)}else{html+='</span>';this.oldTargetElement=replace_element;this.oldTargetDisplay=tinyMCE.getStyle(this.oldTargetElement,'display','inline');this.oldTargetElement.style.display="none";if(tinyMCE.isGecko){rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);fragment=rng.createContextualFragment(html);tinyMCE.insertAfter(fragment,replace_element)}else replace_element.insertAdjacentHTML("beforeBegin",html)}dynamicIFrame=false;tElm=targetDoc.getElementById(this.editorId);if(!tinyMCE.isIE){if(tElm&&(tElm.nodeName=="SPAN"||tElm.nodeName=="span")){tElm=tinyMCE._createIFrame(tElm,targetDoc);dynamicIFrame=true}this.targetElement=tElm;this.iframeElement=tElm;this.contentDocument=tElm.contentDocument;this.contentWindow=tElm.contentWindow;}else{if(tElm&&tElm.nodeName=="SPAN")tElm=tinyMCE._createIFrame(tElm,targetDoc,targetDoc.parentWindow);else tElm=targetDoc.frames[this.editorId];this.targetElement=tElm;this.iframeElement=targetDoc.getElementById(this.editorId);if(tinyMCE.isOpera){this.contentDocument=this.iframeElement.contentDocument;this.contentWindow=this.iframeElement.contentWindow;dynamicIFrame=true}else{this.contentDocument=tElm.window.document;this.contentWindow=tElm.window}this.getDoc().designMode="on"}doc=this.contentDocument;if(dynamicIFrame){html=tinyMCE.getParam('doctype')+'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'+tinyMCE.settings.base_href+'" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';try{if(!this.isHidden())this.getDoc().designMode="on";doc.open();doc.write(html);doc.close()}catch(e){this.getDoc().location.href=tinyMCE.baseURL+"/blank.htm"}}if(tinyMCE.isIE)window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\""+this.editorId+"\"]);",1);parentElm=this.targetDoc.getElementById(this.editorId+'_parent');this.formElement=tinyMCE.isGecko?parentElm.previousSibling:parentElm.nextSibling;tinyMCE.setupContent(this.editorId,true);return true},setBaseHREF:function(u){var h,b,d,nl;d=this.getDoc();nl=d.getElementsByTagName("base");b=nl.length>0?nl[0]:null;if(!b){nl=d.getElementsByTagName("head");h=nl.length>0?nl[0]:null;b=d.createElement("base");b.setAttribute('href',u);h.appendChild(b)}else{if(u==''||u==null)b.parentNode.removeChild(b);else b.setAttribute('href',u)}},getHTML:function(r){var h,d=this.getDoc(),b=this.getBody();if(r)return b.innerHTML;h=tinyMCE._cleanupHTML(this,d,this.settings,b,false,true,false,true);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(d);return h},setHTML:function(h){this.execCommand('mceSetContent',false,h);this.repaint()},getFocusElement:function(){return this.selection.getFocusElement()},getSel:function(){return this.selection.getSel()},getRng:function(){return this.selection.getRng()},triggerSave:function(skip_cleanup,skip_callback){var e,nl=[],i,s,content,htm;if(!this.enabled)return;this.switchSettings();s=tinyMCE.settings;if(tinyMCE.isRealIE){e=this.iframeElement;do{if(e.style&&e.style.display=='none'){e.style.display='block';nl[nl.length]={elm:e,type:'style'}}if(e.style&&s.hidden_tab_class.length>0&&e.className.indexOf(s.hidden_tab_class)!=-1){e.className=s.display_tab_class;nl[nl.length]={elm:e,type:'class'}}}while((e=e.parentNode)!=null)}tinyMCE.settings.preformatted=false;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;tinyMCE._setHTML(this.getDoc(),this.getBody().innerHTML);if(this.settings.cleanup==false){tinyMCE.handleVisualAid(this.getBody(),true,false,this);tinyMCE._setEventsEnabled(this.getBody(),true)}tinyMCE._customCleanup(this,"submit_content_dom",this.contentWindow.document.body);htm=skip_cleanup?this.getBody().innerHTML:tinyMCE._cleanupHTML(this,this.getDoc(),this.settings,this.getBody(),tinyMCE.visualAid,true,true);htm=tinyMCE._customCleanup(this,"submit_content",htm);if(!skip_callback&&tinyMCE.settings.save_callback!=='')content=tinyMCE.resolveDots(tinyMCE.settings.save_callback,window)(this.formTargetElementId,htm,this.getBody());if((typeof(content)!="undefined")&&content!=null)htm=content;htm=tinyMCE.regexpReplace(htm,"&#40;","(","gi");htm=tinyMCE.regexpReplace(htm,"&#41;",")","gi");htm=tinyMCE.regexpReplace(htm,"&#59;",";","gi");htm=tinyMCE.regexpReplace(htm,"&#34;","&quot;","gi");htm=tinyMCE.regexpReplace(htm,"&#94;","^","gi");if(this.formElement)this.formElement.value=htm;if(tinyMCE.isSafari&&this.formElement)this.formElement.innerText=htm;for(i=0;i<nl.length;i++){if(nl[i].type=='style')nl[i].elm.style.display='none';else nl[i].elm.className=s.hidden_tab_class}}};tinyMCE.add(TinyMCE_Engine,{cleanupHTMLCode:function(s){s=s.replace(new RegExp('<p \\/>','gi'),'<p>&nbsp;</p>');s=s.replace(new RegExp('<p>\\s*<\\/p>','gi'),'<p>&nbsp;</p>');s=s.replace(new RegExp('<br>\\s*<\\/br>','gi'),'<br />');s=s.replace(new RegExp('<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>','gi'),'<$1$2$3></$1$2>');s=s.replace(new RegExp('\\s+></','gi'),'></');s=s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>','gi'),'<$1$2 />');if(tinyMCE.isIE)s=s.replace(new RegExp('<p><hr \\/><\\/p>','gi'),"<hr>");if(tinyMCE.isIE)s=s.replace(/<!(\s*)\/>/g,'');return s},parseStyle:function(str){var ar=[],st,i,re,pa;if(str==null)return ar;st=str.split(';');tinyMCE.clearArray(ar);for(i=0;i<st.length;i++){if(st[i]=='')continue;re=new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');pa=st[i].replace(re,'$1||$2').split('||');if(pa.length==2)ar[pa[0].toLowerCase()]=pa[1]}return ar},compressStyle:function(ar,pr,sf,res){var box=[],i,a;box[0]=ar[pr+'-top'+sf];box[1]=ar[pr+'-left'+sf];box[2]=ar[pr+'-right'+sf];box[3]=ar[pr+'-bottom'+sf];for(i=0;i<box.length;i++){if(box[i]==null)return;for(a=0;a<box.length;a++){if(box[a]!=box[i])return}}ar[res]=box[0];ar[pr+'-top'+sf]=null;ar[pr+'-left'+sf]=null;ar[pr+'-right'+sf]=null;ar[pr+'-bottom'+sf]=null},serializeStyle:function(ar){var str="",key,val,m;tinyMCE.compressStyle(ar,"border","","border");tinyMCE.compressStyle(ar,"border","-width","border-width");tinyMCE.compressStyle(ar,"border","-color","border-color");tinyMCE.compressStyle(ar,"border","-style","border-style");tinyMCE.compressStyle(ar,"padding","","padding");tinyMCE.compressStyle(ar,"margin","","margin");for(key in ar){val=ar[key];if(typeof(val)=='function')continue;if(key.indexOf('mso-')==0)continue;if(val!=null&&val!==''){val=''+val;val=val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)",'gi'),"url('$1')");if(val.indexOf('url(')!=-1&&tinyMCE.getParam('convert_urls')){m=new RegExp("url\\('(.*?)'\\)").exec(val);if(m.length>1)val="url('"+eval(tinyMCE.getParam('urlconverter_callback')+"(m[1], null, true);")+"')"}if(tinyMCE.getParam("force_hex_style_colors"))val=tinyMCE.convertRGBToHex(val,true);val=val.replace(/\"/g,'\'');if(val!="url('')")str+=key.toLowerCase()+": "+val+"; "}}if(new RegExp('; $').test(str))str=str.substring(0,str.length-2);return str},convertRGBToHex:function(s,k){var re,rgb;if(s.toLowerCase().indexOf('rgb')!=-1){re=new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)","gi");rgb=s.replace(re,"$1,$2,$3,$4,$5").split(',');if(rgb.length==5){r=parseInt(rgb[1]).toString(16);g=parseInt(rgb[2]).toString(16);b=parseInt(rgb[3]).toString(16);r=r.length==1?'0'+r:r;g=g.length==1?'0'+g:g;b=b.length==1?'0'+b:b;s="#"+r+g+b;if(k)s=rgb[0]+s+rgb[4]}}return s},convertHexToRGB:function(s){if(s.indexOf('#')!=-1){s=s.replace(new RegExp('[^0-9A-F]','gi'),'');return"rgb("+parseInt(s.substring(0,2),16)+","+parseInt(s.substring(2,4),16)+","+parseInt(s.substring(4,6),16)+")"}return s},convertSpansToFonts:function(doc){var s,i,size,fSize,x,fFace,fColor,sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');s=tinyMCE.selectElements(doc,'span,font');for(i=0;i<s.length;i++){size=tinyMCE.trim(s[i].style.fontSize).toLowerCase();fSize=0;for(x=0;x<sizes.length;x++){if(sizes[x]==size){fSize=x+1;break}}if(fSize>0){tinyMCE.setAttrib(s[i],'size',fSize);s[i].style.fontSize=''}fFace=s[i].style.fontFamily;if(fFace!=null&&fFace!==''){tinyMCE.setAttrib(s[i],'face',fFace);s[i].style.fontFamily=''}fColor=s[i].style.color;if(fColor!=null&&fColor!==''){tinyMCE.setAttrib(s[i],'color',tinyMCE.convertRGBToHex(fColor));s[i].style.color=''}}},convertFontsToSpans:function(doc){var fsClasses,s,i,fSize,fFace,fColor,sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');fsClasses=tinyMCE.getParam('font_size_classes');if(fsClasses!=='')fsClasses=fsClasses.replace(/\s+/,'').split(',');else fsClasses=null;s=tinyMCE.selectElements(doc,'span,font');for(i=0;i<s.length;i++){fSize=tinyMCE.getAttrib(s[i],'size');fFace=tinyMCE.getAttrib(s[i],'face');fColor=tinyMCE.getAttrib(s[i],'color');if(fSize!==''){fSize=parseInt(fSize);if(fSize>0&&fSize<8){if(fsClasses!=null)tinyMCE.setAttrib(s[i],'class',fsClasses[fSize-1]);else s[i].style.fontSize=sizes[fSize-1]}s[i].removeAttribute('size')}if(fFace!==''){s[i].style.fontFamily=fFace;s[i].removeAttribute('face')}if(fColor!==''){s[i].style.color=fColor;s[i].removeAttribute('color')}}},cleanupAnchors:function(doc){var i,cn,x,an=doc.getElementsByTagName("a");for(i=an.length-1;i>=0;i--){if(tinyMCE.getAttrib(an[i],"name")!==''&&tinyMCE.getAttrib(an[i],"href")==''){cn=an[i].childNodes;for(x=cn.length-1;x>=0;x--)tinyMCE.insertAfter(cn[x],an[i])}}},getContent:function(editor_id){if(typeof(editor_id)!="undefined")tinyMCE.getInstanceById(editor_id).select();if(tinyMCE.selectedInstance)return tinyMCE.selectedInstance.getHTML();return null},_fixListElements:function(d){var nl,x,a=['ol','ul'],i,n,p,r=new RegExp('^(OL|UL)$'),np;for(x=0;x<a.length;x++){nl=d.getElementsByTagName(a[x]);for(i=0;i<nl.length;i++){n=nl[i];p=n.parentNode;if(r.test(p.nodeName)){np=tinyMCE.prevNode(n,'LI');if(!np){np=d.createElement('li');np.innerHTML='&nbsp;';np.appendChild(n);p.insertBefore(np,p.firstChild)}else np.appendChild(n)}}}},_fixTables:function(d){var nl,i,n,p,np,x,t;nl=d.getElementsByTagName('table');for(i=0;i<nl.length;i++){n=nl[i];if((p=tinyMCE.getParentElement(n,'p,h1,h2,h3,h4,h5,h6'))!=null){np=p.cloneNode(false);np.removeAttribute('id');t=n;while((n=n.nextSibling))np.appendChild(n);tinyMCE.insertAfter(np,p);tinyMCE.insertAfter(t,p)}}},_cleanupHTML:function(inst,doc,config,elm,visual,on_save,on_submit,inn){var h,d,t1,t2,t3,t4,t5,c,s,nb;if(!tinyMCE.getParam('cleanup'))return elm.innerHTML;on_save=typeof(on_save)=='undefined'?false:on_save;c=inst.cleanup;s=inst.settings;d=c.settings.debug;if(d)t1=new Date().getTime();inst._fixRootBlocks();if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertFontsToSpans(doc);if(tinyMCE.getParam("fix_list_elements"))tinyMCE._fixListElements(doc);if(tinyMCE.getParam("fix_table_elements"))tinyMCE._fixTables(doc);tinyMCE._customCleanup(inst,on_save?"get_from_editor_dom":"insert_to_editor_dom",doc.body);if(d)t2=new Date().getTime();c.settings.on_save=on_save;c.idCount=0;c.serializationId=new Date().getTime().toString(32);c.serializedNodes=[];c.sourceIndex=-1;if(s.cleanup_serializer=="xml")h=c.serializeNodeAsXML(elm,inn);else h=c.serializeNodeAsHTML(elm,inn);if(d)t3=new Date().getTime();nb=tinyMCE.getParam('entity_encoding')=='numeric'?'&#160;':'&nbsp;';h=h.replace(/<\/?(body|head|html)[^>]*>/gi,'');h=h.replace(new RegExp(' (rowspan="1"|colspan="1")','g'),'');h=h.replace(/<p><hr \/><\/p>/g,'<hr />');h=h.replace(/<p>(&nbsp;|&#160;)<\/p><hr \/><p>(&nbsp;|&#160;)<\/p>/g,'<hr />');h=h.replace(/<td>\s*<br \/>\s*<\/td>/g,'<td>'+nb+'</td>');h=h.replace(/<p>\s*<br \/>\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<br \/>$/,'');h=h.replace(/<br \/><\/p>/g,'</p>');h=h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(new RegExp('<a>(.*?)<\\/a>','g'),'$1');h=h.replace(/<p([^>]*)>\s*<\/p>/g,'<p$1>'+nb+'</p>');if(/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))h='';if(s.preformatted){h=h.replace(/^<pre>/,'');h=h.replace(/<\/pre>$/,'');h='<pre>'+h+'</pre>'}if(tinyMCE.isGecko){h=h.replace(/<br \/>\s*<\/li>/g,'</li>');h=h.replace(/&nbsp;\s*<\/(dd|dt)>/g,'</$1>');h=h.replace(/<o:p _moz-userdefined="" \/>/g,'');h=h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g,'<td$1>'+nb+'</td>')}if(s.force_br_newlines)h=h.replace(/<p>(&nbsp;|&#160;)<\/p>/g,'<br />');h=tinyMCE._customCleanup(inst,on_save?"get_from_editor":"insert_to_editor",h);if(on_save){h=h.replace(new RegExp(' ?(mceItem[a-zA-Z0-9]*|'+s.visual_table_class+')','g'),'');h=h.replace(new RegExp(' ?class=""','g'),'')}if(s.remove_linebreaks&&!c.settings.indent)h=h.replace(/\n|\r/g,' ');if(d)t4=new Date().getTime();if(on_save&&c.settings.indent)h=c.formatHTML(h);if(on_submit&&(s.encoding=="xml"||s.encoding=="html"))h=c.xmlEncode(h);if(d)t5=new Date().getTime();if(c.settings.debug)tinyMCE.debug("Cleanup in ms: Pre="+(t2-t1)+", Serialize: "+(t3-t2)+", Post: "+(t4-t3)+", Format: "+(t5-t4)+", Sum: "+(t5-t1)+".");return h}});function TinyMCE_Cleanup(){this.isIE=(navigator.appName=="Microsoft Internet Explorer");this.rules=tinyMCE.clearArray([]);this.settings={indent_elements:'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object',newline_before_elements:'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td',newline_after_elements:'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script',newline_before_after_elements:'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div',indent_char:'\t',indent_levels:1,entity_encoding:'raw',valid_elements:'*[*]',entities:'',url_converter:'',invalid_elements:'',verify_html:false};this.vElements=tinyMCE.clearArray([]);this.vElementsRe='';this.closeElementsRe=/^(IMG|BR|HR|LINK|META|BASE|INPUT|AREA)$/;this.codeElementsRe=/^(SCRIPT|STYLE)$/;this.serializationId=0;this.mceAttribs={href:'mce_href',src:'mce_src',type:'mce_type'}}TinyMCE_Cleanup.prototype={init:function(s){var n,a,i,ir,or,st;for(n in s)this.settings[n]=s[n];s=this.settings;this.inRe=this._arrayToRe(s.indent_elements.split(','),'','^<(',')[^>]*');this.ouRe=this._arrayToRe(s.indent_elements.split(','),'','^<\\/(',')[^>]*');this.nlBeforeRe=this._arrayToRe(s.newline_before_elements.split(','),'gi','<(',')([^>]*)>');this.nlAfterRe=this._arrayToRe(s.newline_after_elements.split(','),'gi','<(',')([^>]*)>');this.nlBeforeAfterRe=this._arrayToRe(s.newline_before_after_elements.split(','),'gi','<(\\/?)(',')([^>]*)>');this.serializedNodes=[];if(s.invalid_elements!=='')this.iveRe=this._arrayToRe(s.invalid_elements.toUpperCase().split(','),'g','^(',')$');else this.iveRe=null;st='';for(i=0;i<s.indent_levels;i++)st+=s.indent_char;this.inStr=st;if(!s.verify_html){s.valid_elements='*[*]';s.extended_valid_elements=''}this.fillStr=s.entity_encoding=="named"?"&nbsp;":"&#160;";this.idCount=0;this.xmlEncodeRe=new RegExp('[\u007F-\uFFFF<>&"]','g')},addRuleStr:function(s){var r=this.parseRuleStr(s),n;for(n in r){if(r[n])this.rules[n]=r[n]}this.vElements=tinyMCE.clearArray([]);for(n in this.rules){if(this.rules[n])this.vElements[this.vElements.length]=this.rules[n].tag}this.vElementsRe=this._arrayToRe(this.vElements,'')},isValid:function(n){if(!this.rulesDone)this._setupRules();if(!n)return true;n=n.replace(/[^a-z0-9]+/gi,'').toUpperCase();return!tinyMCE.getParam('cleanup')||this.vElementsRe.test(n)},addChildRemoveRuleStr:function(s){var x,y,p,i,t,tn,ta,cl,r;if(!s)return;ta=s.split(',');for(x=0;x<ta.length;x++){s=ta[x];p=this.split(/\[|\]/,s);if(p==null||p.length<1)t=s.toUpperCase();else t=p[0].toUpperCase();tn=this.split('/',t);for(y=0;y<tn.length;y++){r="^(";cl=this.split(/\|/,p[1]);for(i=0;i<cl.length;i++){if(cl[i]=='%istrict')r+=tinyMCE.inlineStrict;else if(cl[i]=='%itrans')r+=tinyMCE.inlineTransitional;else if(cl[i]=='%istrict_na')r+=tinyMCE.inlineStrict.substring(2);else if(cl[i]=='%itrans_na')r+=tinyMCE.inlineTransitional.substring(2);else if(cl[i]=='%btrans')r+=tinyMCE.blockElms;else if(cl[i]=='%strict')r+=tinyMCE.blockStrict;else r+=(cl[i].charAt(0)!='#'?cl[i].toUpperCase():cl[i]);r+=(i!=cl.length-1?'|':'')}r+=')$';if(this.childRules==null)this.childRules=tinyMCE.clearArray([]);this.childRules[tn[y]]=new RegExp(r);if(p.length>1)this.childRules[tn[y]].wrapTag=p[2]}}},parseRuleStr:function(s){var ta,p,r,a,i,x,px,t,tn,y,av,or=tinyMCE.clearArray([]),dv;if(s==null||s.length==0)return or;ta=s.split(',');for(x=0;x<ta.length;x++){s=ta[x];if(s.length==0)continue;p=this.split(/\[|\]/,s);if(p==null||p.length<1)t=s.toUpperCase();else t=p[0].toUpperCase();tn=this.split('/',t);for(y=0;y<tn.length;y++){r={};r.tag=tn[y];r.forceAttribs=null;r.defaultAttribs=null;r.validAttribValues=null;px=r.tag.charAt(0);r.forceOpen=px=='+';r.removeEmpty=px=='-';r.fill=px=='#';r.tag=r.tag.replace(/\+|-|#/g,'');r.oTagName=tn[0].replace(/\+|-|#/g,'').toLowerCase();r.isWild=new RegExp('\\*|\\?|\\+','g').test(r.tag);r.validRe=new RegExp(this._wildcardToRe('^'+r.tag+'$'));if(p.length>1){r.vAttribsRe='^(';a=this.split(/\|/,p[1]);for(i=0;i<a.length;i++){t=a[i];if(t.charAt(0)=='!'){a[i]=t=t.substring(1);if(!r.reqAttribsRe)r.reqAttribsRe='\\s+('+t;else r.reqAttribsRe+='|'+t}av=new RegExp('(=|:|<)(.*?)$').exec(t);t=t.replace(new RegExp('(=|:|<).*?$'),'');if(av&&av.length>0){if(av[0].charAt(0)==':'){if(!r.forceAttribs)r.forceAttribs=tinyMCE.clearArray([]);r.forceAttribs[t.toLowerCase()]=av[0].substring(1)}else if(av[0].charAt(0)=='='){if(!r.defaultAttribs)r.defaultAttribs=tinyMCE.clearArray([]);dv=av[0].substring(1);r.defaultAttribs[t.toLowerCase()]=dv==''?"mce_empty":dv}else if(av[0].charAt(0)=='<'){if(!r.validAttribValues)r.validAttribValues=tinyMCE.clearArray([]);r.validAttribValues[t.toLowerCase()]=this._arrayToRe(this.split('?',av[0].substring(1)),'i')}}r.vAttribsRe+=''+t.toLowerCase()+(i!=a.length-1?'|':'');a[i]=t.toLowerCase()}if(r.reqAttribsRe)r.reqAttribsRe=new RegExp(r.reqAttribsRe+')=\"','g');r.vAttribsRe+=')$';r.vAttribsRe=this._wildcardToRe(r.vAttribsRe);r.vAttribsReIsWild=new RegExp('\\*|\\?|\\+','g').test(r.vAttribsRe);r.vAttribsRe=new RegExp(r.vAttribsRe);r.vAttribs=a.reverse();}else{r.vAttribsRe='';r.vAttribs=tinyMCE.clearArray([]);r.vAttribsReIsWild=false}or[r.tag]=r}}return or},serializeNodeAsXML:function(n){var s,b;if(!this.xmlDoc){if(this.isIE){try{this.xmlDoc=new ActiveXObject('MSXML2.DOMDocument')}catch(e){}if(!this.xmlDoc)try{this.xmlDoc=new ActiveXObject('Microsoft.XmlDom')}catch(e){}}else this.xmlDoc=document.implementation.createDocument('','',null);if(!this.xmlDoc)alert("Error XML Parser could not be found.")}if(this.xmlDoc.firstChild)this.xmlDoc.removeChild(this.xmlDoc.firstChild);b=this.xmlDoc.createElement("html");b=this.xmlDoc.appendChild(b);this._convertToXML(n,b);if(this.isIE)return this.xmlDoc.xml;else return new XMLSerializer().serializeToString(this.xmlDoc)},_convertToXML:function(n,xn){var xd,el,i,l,cn,at,no,hc=false;if(tinyMCE.isRealIE&&this._isDuplicate(n))return;xd=this.xmlDoc;switch(n.nodeType){case 1:hc=n.hasChildNodes();el=xd.createElement(n.nodeName.toLowerCase());at=n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified&&no.nodeValue)el.setAttribute(no.nodeName.toLowerCase(),no.nodeValue)}if(!hc&&!this.closeElementsRe.test(n.nodeName))el.appendChild(xd.createTextNode(""));xn=xn.appendChild(el);break;case 3:xn.appendChild(xd.createTextNode(n.nodeValue));return;case 8:xn.appendChild(xd.createComment(n.nodeValue));return}if(hc){cn=n.childNodes;for(i=0,l=cn.length;i<l;i++)this._convertToXML(cn[i],xn)}},serializeNodeAsHTML:function(n,inn){var en,no,h='',i,l,t,st,r,cn,va=false,f=false,at,hc,cr,nn;if(!this.rulesDone)this._setupRules();if(tinyMCE.isRealIE&&this._isDuplicate(n))return'';if(n.parentNode&&this.childRules!=null){cr=this.childRules[n.parentNode.nodeName];if(typeof(cr)!="undefined"&&!cr.test(n.nodeName)){st=true;t=null}}switch(n.nodeType){case 1:hc=n.hasChildNodes();if(st)break;nn=n.nodeName;if(tinyMCE.isRealIE){if(n.nodeName.indexOf('/')!=-1)break;if(n.scopeName&&n.scopeName!='HTML')nn=n.scopeName.toUpperCase()+':'+nn.toUpperCase()}else if(tinyMCE.isOpera&&nn.indexOf(':')>0)nn=nn.toUpperCase();if(this.settings.convert_fonts_to_spans){if(this.settings.on_save&&nn=='FONT')nn='SPAN';if(!this.settings.on_save&&nn=='SPAN')nn='FONT'}if(this.vElementsRe.test(nn)&&(!this.iveRe||!this.iveRe.test(nn))&&!inn){va=true;r=this.rules[nn];if(!r){at=this.rules;for(no in at){if(at[no]&&at[no].validRe.test(nn)){r=at[no];break}}}en=r.isWild?nn.toLowerCase():r.oTagName;f=r.fill;if(r.removeEmpty&&!hc)return"";t='<'+en;if(r.vAttribsReIsWild){at=n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified&&r.vAttribsRe.test(no.nodeName))t+=this._serializeAttribute(n,r,no.nodeName)}}else{for(i=r.vAttribs.length-1;i>-1;i--)t+=this._serializeAttribute(n,r,r.vAttribs[i])}if(!this.settings.on_save){at=this.mceAttribs;for(no in at){if(at[no])t+=this._serializeAttribute(n,r,at[no])}}if(r.reqAttribsRe&&!t.match(r.reqAttribsRe))t=null;if(t!=null&&this.closeElementsRe.test(nn))return t+' />';if(t!=null)h+=t+'>';if(this.isIE&&this.codeElementsRe.test(nn))h+=n.innerHTML}break;case 3:if(st)break;if(n.parentNode&&this.codeElementsRe.test(n.parentNode.nodeName))return this.isIE?'':n.nodeValue;return this.xmlEncode(n.nodeValue);case 8:if(st)break;return"<!--"+this._trimComment(n.nodeValue)+"-->"}if(hc){cn=n.childNodes;for(i=0,l=cn.length;i<l;i++)h+=this.serializeNodeAsHTML(cn[i])}if(f&&!hc)h+=this.fillStr;if(t!=null&&va)h+='</'+en+'>';return h},_serializeAttribute:function(n,r,an){var av='',t,os=this.settings.on_save;if(os&&(an.indexOf('mce_')==0||an.indexOf('_moz')==0))return'';if(os&&this.mceAttribs[an])av=this._getAttrib(n,this.mceAttribs[an]);if(av.length==0)av=this._getAttrib(n,an);if(av.length==0&&r.defaultAttribs&&(t=r.defaultAttribs[an])){av=t;if(av=="mce_empty")return" "+an+'=""'}if(r.forceAttribs&&(t=r.forceAttribs[an]))av=t;if(os&&av.length!=0&&/^(src|href|longdesc)$/.test(an))av=this._urlConverter(this,n,av);if(av.length!=0&&r.validAttribValues&&r.validAttribValues[an]&&!r.validAttribValues[an].test(av))return"";if(av.length!=0&&av=="{$uid}")av="uid_"+(this.idCount++);if(av.length!=0){if(an.indexOf('on')!=0)av=this.xmlEncode(av,1);return" "+an+"="+'"'+av+'"'}return""},formatHTML:function(h){var s=this.settings,p='',i=0,li=0,o='',l;h=h.replace(/<pre([^>]*)>(.*?)<\/pre>/gi,function(a,b,c){c=c.replace(/<br\s*\/>/gi,'\n');return'<pre'+b+'>'+c+'</pre>'});h=h.replace(/\r/g,'');h='\n'+h;h=h.replace(new RegExp('\\n\\s+','gi'),'\n');h=h.replace(this.nlBeforeRe,'\n<$1$2>');h=h.replace(this.nlAfterRe,'<$1$2>\n');h=h.replace(this.nlBeforeAfterRe,'\n<$1$2$3>\n');h+='\n';while((i=h.indexOf('\n',i+1))!=-1){if((l=h.substring(li+1,i)).length!=0){if(this.ouRe.test(l)&&p.length>=s.indent_levels)p=p.substring(s.indent_levels);o+=p+l+'\n';if(this.inRe.test(l))p+=this.inStr}li=i}return o},xmlEncode:function(s){var cl=this,re=this.xmlEncodeRe;if(!this.entitiesDone)this._setupEntities();switch(this.settings.entity_encoding){case"raw":return tinyMCE.xmlEncode(s);case"named":return s.replace(re,function(c){var b=cl.entities[c.charCodeAt(0)];return b?'&'+b+';':c});case"numeric":return s.replace(re,function(c){return'&#'+c.charCodeAt(0)+';'})}return s},split:function(re,s){var i,l,o=[],c=s.split(re);for(i=0,l=c.length;i<l;i++){if(c[i]!=='')o[i]=c[i]}return o},_trimComment:function(s){s=s.replace(new RegExp('\\smce_src=\"[^\"]*\"','gi'),"");s=s.replace(new RegExp('\\smce_href=\"[^\"]*\"','gi'),"");return s},_getAttrib:function(e,n,d){var v,ex,nn;if(typeof(d)=="undefined")d="";if(!e||e.nodeType!=1)return d;try{v=e.getAttribute(n,0)}catch(ex){v=e.getAttribute(n,2)}if(n=="class"&&!v)v=e.className;if(this.isIE){if(n=="http-equiv")v=e.httpEquiv;nn=e.nodeName;if(nn=="FORM"&&n=="enctype"&&v=="application/x-www-form-urlencoded")v="";if(nn=="INPUT"&&n=="size"&&v=="20")v="";if(nn=="INPUT"&&n=="maxlength"&&v=="2147483647")v="";if(n=="width"||n=="height")v=e.getAttribute(n,2)}if(n=='style'&&v){if(!tinyMCE.isOpera)v=e.style.cssText;v=tinyMCE.serializeStyle(tinyMCE.parseStyle(v))}if(this.settings.on_save&&n.indexOf('on')!=-1&&this.settings.on_save&&v&&v!=='')v=tinyMCE.cleanupEventStr(v);return(v&&v!=='')?''+v:d},_urlConverter:function(c,n,v){if(!c.settings.on_save)return tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,v);else if(tinyMCE.getParam('convert_urls')){if(!this.urlConverter)this.urlConverter=eval(tinyMCE.settings.urlconverter_callback);return this.urlConverter(v,n,true)}return v},_arrayToRe:function(a,op,be,af){var i,r;op=typeof(op)=="undefined"?"gi":op;be=typeof(be)=="undefined"?"^(":be;af=typeof(af)=="undefined"?")$":af;r=be;for(i=0;i<a.length;i++)r+=this._wildcardToRe(a[i])+(i!=a.length-1?"|":"");r+=af;return new RegExp(r,op)},_wildcardToRe:function(s){s=s.replace(/\?/g,'(\\S?)');s=s.replace(/\+/g,'(\\S+)');s=s.replace(/\*/g,'(\\S*)');return s},_setupEntities:function(){var n,a,i,s=this.settings;if(s.entity_encoding=="named"){n=tinyMCE.clearArray([]);a=this.split(',',s.entities);for(i=0;i<a.length;i+=2)n[a[i]]=a[i+1];this.entities=n}this.entitiesDone=true},_setupRules:function(){var s=this.settings;this.addRuleStr(s.valid_elements);this.addRuleStr(s.extended_valid_elements);this.addChildRemoveRuleStr(s.valid_child_elements);this.rulesDone=true},_isDuplicate:function(n){var i,l,sn;if(!this.settings.fix_content_duplication)return false;if(tinyMCE.isRealIE&&n.nodeType==1){if(n.mce_serialized==this.serializationId)return true;n.setAttribute('mce_serialized',this.serializationId)}else{sn=this.serializedNodes;for(i=0,l=sn.length;i<l;i++){if(sn[i]==n)return true}sn.push(n)}return false}};tinyMCE.add(TinyMCE_Engine,{createTagHTML:function(tn,a,h){var o='',f=tinyMCE.xmlEncode,n;o='<'+tn;if(a){for(n in a){if(typeof(a[n])!='function'&&a[n]!=null)o+=' '+f(n)+'="'+f(''+a[n])+'"'}}o+=!h?' />':'>'+h+'</'+tn+'>';return o},createTag:function(d,tn,a,h){var o=d.createElement(tn),n;if(a){for(n in a){if(typeof(a[n])!='function'&&a[n]!=null)tinyMCE.setAttrib(o,n,a[n])}}if(h)o.innerHTML=h;return o},getElementByAttributeValue:function(n,e,a,v){return(n=this.getElementsByAttributeValue(n,e,a,v)).length==0?null:n[0]},getElementsByAttributeValue:function(n,e,a,v){var i,nl=n.getElementsByTagName(e),o=[];for(i=0;i<nl.length;i++){if(tinyMCE.getAttrib(nl[i],a).indexOf(v)!=-1)o[o.length]=nl[i]}return o},isBlockElement:function(n){return n!=null&&n.nodeType==1&&this.blockRegExp.test(n.nodeName)},getParentBlockElement:function(n,r){return this.getParentNode(n,function(n){return tinyMCE.isBlockElement(n)},r);return null},insertAfter:function(n,r){if(r.nextSibling)r.parentNode.insertBefore(n,r.nextSibling);else r.parentNode.appendChild(n)},setInnerHTML:function(e,h){var i,nl,n;if(tinyMCE.isGecko){h=h.replace(/<embed([^>]*)>/gi,'<tmpembed$1>');h=h.replace(/<em([^>]*)>/gi,'<i$1>');h=h.replace(/<tmpembed([^>]*)>/gi,'<embed$1>');h=h.replace(/<strong([^>]*)>/gi,'<b$1>');h=h.replace(/<\/strong>/gi,'</b>');h=h.replace(/<\/em>/gi,'</i>')}if(tinyMCE.isRealIE){h=h.replace(/\s\/>/g,'>');h=h.replace(/<p([^>]*)>\u00A0?<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');h=h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');h=h.replace(/<p([^>]*)>\s+<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');e.innerHTML=tinyMCE.uniqueTag+h;e.firstChild.removeNode(true);nl=e.getElementsByTagName("p");for(i=nl.length-1;i>=0;i--){n=nl[i];if(n.nodeName=='P'&&!n.hasChildNodes()&&!n.mce_keep)n.parentNode.removeChild(n)}}else{h=this.fixGeckoBaseHREFBug(1,e,h);e.innerHTML=h;this.fixGeckoBaseHREFBug(2,e,h)}},getOuterHTML:function(e){var d;if(tinyMCE.isIE)return e.outerHTML;d=e.ownerDocument.createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML},setOuterHTML:function(e,h,d){var d=typeof(d)=="undefined"?e.ownerDocument:d,i,nl,t;if(tinyMCE.isIE&&e.nodeType==1)e.outerHTML=h;else{t=d.createElement("body");t.innerHTML=h;for(i=0,nl=t.childNodes;i<nl.length;i++)e.parentNode.insertBefore(nl[i].cloneNode(true),e);e.parentNode.removeChild(e)}},_getElementById:function(id,d){var e,i,j,f;if(typeof(d)=="undefined")d=document;e=d.getElementById(id);if(!e){f=d.forms;for(i=0;i<f.length;i++){for(j=0;j<f[i].elements.length;j++){if(f[i].elements[j].name==id){e=f[i].elements[j];break}}}}return e},getNodeTree:function(n,na,t,nn){return this.selectNodes(n,function(n){return(!t||n.nodeType==t)&&(!nn||n.nodeName==nn)},na?na:[])},getParentElement:function(n,na,f,r){var re=na?new RegExp('^('+na.toUpperCase().replace(/,/g,'|')+')$'):0,v;if(f&&typeof(f)=='string')return this.getParentElement(n,na,function(no){return tinyMCE.getAttrib(no,f)!==''});return this.getParentNode(n,function(n){return((n.nodeType==1&&!re)||(re&&re.test(n.nodeName)))&&(!f||f(n))},r)},getParentNode:function(n,f,r){while(n){if(n==r)return null;if(f(n))return n;n=n.parentNode}return null},getAttrib:function(elm,name,dv){var v;if(typeof(dv)=="undefined")dv="";if(!elm||elm.nodeType!=1)return dv;try{v=elm.getAttribute(name,0)}catch(ex){v=elm.getAttribute(name,2)}if(name=="class"&&!v)v=elm.className;if(tinyMCE.isGecko){if(name=="src"&&elm.src!=null&&elm.src!=='')v=elm.src;if(name=="href"&&elm.href!=null&&elm.href!=='')v=elm.href}else if(tinyMCE.isIE){switch(name){case"http-equiv":v=elm.httpEquiv;break;case"width":case"height":v=elm.getAttribute(name,2);break}}if(name=="style"&&!tinyMCE.isOpera)v=elm.style.cssText;return(v&&v!=='')?v:dv},setAttrib:function(el,name,va,fix){if(typeof(va)=="number"&&va!=null)va=""+va;if(fix){if(va==null)va="";va=va.replace(/[^0-9%]/g,'')}if(name=="style")el.style.cssText=va;if(name=="class")el.className=va;if(va!=null&&va!==''&&va!=-1)el.setAttribute(name,va);else el.removeAttribute(name)},setStyleAttrib:function(e,n,v){e.style[n]=v;if(tinyMCE.isIE&&v==null||v==''){v=tinyMCE.serializeStyle(tinyMCE.parseStyle(e.style.cssText));e.style.cssText=v;e.setAttribute("style",v)}},switchClass:function(ei,c){var e;if(tinyMCE.switchClassCache[ei])e=tinyMCE.switchClassCache[ei];else e=tinyMCE.switchClassCache[ei]=document.getElementById(ei);if(e){if(tinyMCE.settings.button_tile_map&&e.className&&e.className.indexOf('mceTiledButton')==0)c='mceTiledButton '+c;e.className=c}},getAbsPosition:function(n,cn){var l=0,t=0;while(n&&n!=cn){l+=n.offsetLeft;t+=n.offsetTop;n=n.offsetParent}return{absLeft:l,absTop:t}},prevNode:function(e,n){var a=n.split(','),i;while((e=e.previousSibling)!=null){for(i=0;i<a.length;i++){if(e.nodeName==a[i])return e}}return null},nextNode:function(e,n){var a=n.split(','),i;while((e=e.nextSibling)!=null){for(i=0;i<a.length;i++){if(e.nodeName==a[i])return e}}return null},selectElements:function(n,na,f){var i,a=[],nl,x;for(x=0,na=na.split(',');x<na.length;x++)for(i=0,nl=n.getElementsByTagName(na[x]);i<nl.length;i++)(!f||f(nl[i]))&&a.push(nl[i]);return a},selectNodes:function(n,f,a){var i;if(!a)a=[];if(f(n))a[a.length]=n;if(n.hasChildNodes()){for(i=0;i<n.childNodes.length;i++)tinyMCE.selectNodes(n.childNodes[i],f,a)}return a},addCSSClass:function(e,c,b){var o=this.removeCSSClass(e,c);return e.className=b?c+(o!==''?(' '+o):''):(o!==''?(o+' '):'')+c},removeCSSClass:function(e,c){c=e.className.replace(new RegExp("(^|\\s+)"+c+"(\\s+|$)"),' ');return e.className=c!=' '?c:''},hasCSSClass:function(n,c){return new RegExp('\\b'+c+'\\b','g').test(n.className)},renameElement:function(e,n,d){var ne,i,ar;d=typeof(d)=="undefined"?tinyMCE.selectedInstance.getDoc():d;if(e){ne=d.createElement(n);ar=e.attributes;for(i=ar.length-1;i>-1;i--){if(ar[i].specified&&ar[i].nodeValue)ne.setAttribute(ar[i].nodeName.toLowerCase(),ar[i].nodeValue)}ar=e.childNodes;for(i=0;i<ar.length;i++)ne.appendChild(ar[i].cloneNode(true));e.parentNode.replaceChild(ne,e)}},getViewPort:function(w){var d=w.document,m=d.compatMode=='CSS1Compat',b=d.body,de=d.documentElement;return{left:w.pageXOffset||(m?de.scrollLeft:b.scrollLeft),top:w.pageYOffset||(m?de.scrollTop:b.scrollTop),width:w.innerWidth||(m?de.clientWidth:b.clientWidth),height:w.innerHeight||(m?de.clientHeight:b.clientHeight)}},getStyle:function(n,na,d){if(!n)return false;if(tinyMCE.isGecko&&n.ownerDocument.defaultView){try{return n.ownerDocument.defaultView.getComputedStyle(n,null).getPropertyValue(na)}catch(n){return null}}na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase()});if(n.currentStyle)return n.currentStyle[na];return false}});tinyMCE.add(TinyMCE_Engine,{parseURL:function(url_str){var urlParts=[],i,pos,lastPos,chr;if(url_str){pos=url_str.indexOf('://');if(pos!=-1){urlParts.protocol=url_str.substring(0,pos);lastPos=pos+3}for(i=lastPos;i<url_str.length;i++){chr=url_str.charAt(i);if(chr==':')break;if(chr=='/')break}pos=i;urlParts.host=url_str.substring(lastPos,pos);urlParts.port="";lastPos=pos;if(url_str.charAt(pos)==':'){pos=url_str.indexOf('/',lastPos);urlParts.port=url_str.substring(lastPos+1,pos)}lastPos=pos;pos=url_str.indexOf('?',lastPos);if(pos==-1)pos=url_str.indexOf('#',lastPos);if(pos==-1)pos=url_str.length;urlParts.path=url_str.substring(lastPos,pos);lastPos=pos;if(url_str.charAt(pos)=='?'){pos=url_str.indexOf('#');pos=(pos==-1)?url_str.length:pos;urlParts.query=url_str.substring(lastPos+1,pos)}lastPos=pos;if(url_str.charAt(pos)=='#'){pos=url_str.length;urlParts.anchor=url_str.substring(lastPos+1,pos)}}return urlParts},serializeURL:function(up){var o="";if(up.protocol)o+=up.protocol+"://";if(up.host)o+=up.host;if(up.port)o+=":"+up.port;if(up.path)o+=up.path;if(up.query)o+="?"+up.query;if(up.anchor)o+="#"+up.anchor;return o},convertAbsoluteURLToRelativeURL:function(base_url,url_to_relative){var baseURL=this.parseURL(base_url),targetURL=this.parseURL(url_to_relative);var i,strTok1,strTok2,breakPoint=0,outPath="",forceSlash=false;var fileName,pos;if(targetURL.path=='')targetURL.path="/";else forceSlash=true;base_url=baseURL.path.substring(0,baseURL.path.lastIndexOf('/'));strTok1=base_url.split('/');strTok2=targetURL.path.split('/');if(strTok1.length>=strTok2.length){for(i=0;i<strTok1.length;i++){if(i>=strTok2.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(strTok1.length<strTok2.length){for(i=0;i<strTok2.length;i++){if(i>=strTok1.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(breakPoint==1)return targetURL.path;for(i=0;i<(strTok1.length-(breakPoint-1));i++)outPath+="../";for(i=breakPoint-1;i<strTok2.length;i++){if(i!=(breakPoint-1))outPath+="/"+strTok2[i];else outPath+=strTok2[i]}targetURL.protocol=null;targetURL.host=null;targetURL.port=null;targetURL.path=outPath==''&&forceSlash?"/":outPath;fileName=baseURL.path;if((pos=fileName.lastIndexOf('/'))!=-1)fileName=fileName.substring(pos+1);if(fileName==targetURL.path&&targetURL.anchor!=='')targetURL.path="";if(targetURL.path==''&&!targetURL.anchor)targetURL.path=fileName!==''?fileName:"/";return this.serializeURL(targetURL)},convertRelativeToAbsoluteURL:function(base_url,relative_url){var baseURL=this.parseURL(base_url),baseURLParts,relURLParts,newRelURLParts,numBack,relURL=this.parseURL(relative_url),i;var len,absPath,start,end,newBaseURLParts;if(relative_url==''||relative_url.indexOf('://')!=-1||/^(mailto:|javascript:|#|\/)/.test(relative_url))return relative_url;baseURLParts=baseURL.path.split('/');relURLParts=relURL.path.split('/');newBaseURLParts=[];for(i=baseURLParts.length-1;i>=0;i--){if(baseURLParts[i].length==0)continue;newBaseURLParts[newBaseURLParts.length]=baseURLParts[i]}baseURLParts=newBaseURLParts.reverse();newRelURLParts=[];numBack=0;for(i=relURLParts.length-1;i>=0;i--){if(relURLParts[i].length==0||relURLParts[i]==".")continue;if(relURLParts[i]=='..'){numBack++;continue}if(numBack>0){numBack--;continue}newRelURLParts[newRelURLParts.length]=relURLParts[i]}relURLParts=newRelURLParts.reverse();len=baseURLParts.length-numBack;absPath=(len<=0?"":"/")+baseURLParts.slice(0,len).join('/')+"/"+relURLParts.join('/');start="";end="";relURL.protocol=baseURL.protocol;relURL.host=baseURL.host;relURL.port=baseURL.port;if(relURL.path.charAt(relURL.path.length-1)=="/")absPath+="/";relURL.path=absPath;return this.serializeURL(relURL)},convertURL:function(url,node,on_save){var dl=document.location,start,portPart,urlParts,baseUrlParts,tmpUrlParts,curl;var prot=dl.protocol,host=dl.hostname,port=dl.port;if(prot=="file:")return url;url=tinyMCE.regexpReplace(url,'(http|https):///','/');if(url.indexOf('mailto:')!=-1||url.indexOf('javascript:')!=-1||/^[ \t\r\n\+]*[#\?]/.test(url))return url;if(!tinyMCE.isIE&&!on_save&&url.indexOf("://")==-1&&url.charAt(0)!='/')return tinyMCE.settings.base_href+url;if(on_save&&tinyMCE.getParam('relative_urls')){curl=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,url);if(curl.charAt(0)=='/')curl=tinyMCE.settings.document_base_prefix+curl;urlParts=tinyMCE.parseURL(curl);tmpUrlParts=tinyMCE.parseURL(tinyMCE.settings.document_base_url);if(urlParts.host==tmpUrlParts.host&&(urlParts.port==tmpUrlParts.port))return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings.document_base_url,curl)}if(!tinyMCE.getParam('relative_urls')){urlParts=tinyMCE.parseURL(url);baseUrlParts=tinyMCE.parseURL(tinyMCE.settings.base_href);url=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,url);if(urlParts.anchor&&urlParts.path==baseUrlParts.path)return"#"+urlParts.anchor}if(tinyMCE.getParam('remove_script_host')){start="";portPart="";if(port!=='')portPart=":"+port;start=prot+"//"+host+portPart+"/";if(url.indexOf(start)==0)url=url.substring(start.length-1)}return url},convertAllRelativeURLs:function(body){var i,elms,src,href,mhref,msrc;elms=body.getElementsByTagName("img");for(i=0;i<elms.length;i++){src=tinyMCE.getAttrib(elms[i],'src');msrc=tinyMCE.getAttrib(elms[i],'mce_src');if(msrc!=='')src=msrc;if(src!==''){src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,src);elms[i].setAttribute("src",src)}}elms=body.getElementsByTagName("a");for(i=0;i<elms.length;i++){href=tinyMCE.getAttrib(elms[i],'href');mhref=tinyMCE.getAttrib(elms[i],'mce_href');if(mhref!=='')href=mhref;if(href&&href!==''){href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,href);elms[i].setAttribute("href",href)}}}});tinyMCE.add(TinyMCE_Engine,{clearArray:function(a){var n;for(n in a)a[n]=null;return a},explode:function(d,s){var ar=s.split(d),oar=[],i;for(i=0;i<ar.length;i++){if(ar[i]!=='')oar[oar.length]=ar[i]}return oar}});tinyMCE.add(TinyMCE_Engine,{_setEventsEnabled:function(node,state){var evs,x,y,elms,i,event;var events=['onfocus','onblur','onclick','ondblclick','onmousedown','onmouseup','onmouseover','onmousemove','onmouseout','onkeypress','onkeydown','onkeydown','onkeyup'];evs=tinyMCE.settings.event_elements.split(',');for(y=0;y<evs.length;y++){elms=node.getElementsByTagName(evs[y]);for(i=0;i<elms.length;i++){event="";for(x=0;x<events.length;x++){if((event=tinyMCE.getAttrib(elms[i],events[x]))!==''){event=tinyMCE.cleanupEventStr(""+event);if(!state)event="return true;"+event;else event=event.replace(/^return true;/gi,'');elms[i].removeAttribute(events[x]);elms[i].setAttribute(events[x],event)}}}}},_eventPatch:function(editor_id){var n,inst,win,e;if(typeof(tinyMCE)=="undefined")return true;try{if(tinyMCE.selectedInstance){win=tinyMCE.selectedInstance.getWin();if(win&&win.event){e=win.event;if(!e.target)e.target=e.srcElement;TinyMCE_Engine.prototype.handleEvent(e);return}}for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.select();win=inst.getWin();if(win&&win.event){e=win.event;if(!e.target)e.target=e.srcElement;TinyMCE_Engine.prototype.handleEvent(e);return}}}catch(ex){}},findEvent:function(e){var n,inst;if(e)return e;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(tinyMCE.isInstance(inst)&&inst.getWin().event)return inst.getWin().event}return null},unloadHandler:function(){tinyMCE.triggerSave(true,true)},addEventHandlers:function(inst){this.setEventHandlers(inst,1)},setEventHandlers:function(inst,s){var doc=inst.getDoc(),ie,ot,i,f=s?tinyMCE.addEvent:tinyMCE.removeEvent;ie=['keypress','keyup','keydown','click','mouseup','mousedown','controlselect','dblclick'];ot=['keypress','keyup','keydown','click','mouseup','mousedown','focus','blur','dragdrop'];inst.switchSettings();if(tinyMCE.isIE){for(i=0;i<ie.length;i++)f(doc,ie[i],TinyMCE_Engine.prototype._eventPatch)}else{for(i=0;i<ot.length;i++)f(doc,ot[i],tinyMCE.handleEvent);try{doc.designMode="On"}catch(e){}}},onMouseMove:function(){var inst,lh;if(tinyMCE.lastHover){lh=tinyMCE.lastHover;if(lh.className.indexOf('mceMenu')!=-1)tinyMCE._menuButtonEvent('out',lh);else lh.className=lh.className;tinyMCE.lastHover=null}if(!tinyMCE.hasMouseMoved){inst=tinyMCE.selectedInstance;if(inst.isFocused){inst.undoBookmark=inst.selection.getBookmark();tinyMCE.hasMouseMoved=true}}},cancelEvent:function(e){if(!e)return false;if(tinyMCE.isIE){e.returnValue=false;e.cancelBubble=true}else{e.preventDefault();e.stopPropagation&&e.stopPropagation()}return false},addEvent:function(o,n,h){if(n!='unload'){function clean(){var ex;try{tinyMCE.removeEvent(o,n,h);tinyMCE.removeEvent(window,'unload',clean);o=n=h=null}catch(ex){}}tinyMCE.addEvent(window,'unload',clean)}if(o.attachEvent)o.attachEvent("on"+n,h);else o.addEventListener(n,h,false)},removeEvent:function(o,n,h){if(o.detachEvent)o.detachEvent("on"+n,h);else o.removeEventListener(n,h,false)},addSelectAccessibility:function(e,s,w){if(!s._isAccessible){s.onkeydown=tinyMCE.accessibleEventHandler;s.onblur=tinyMCE.accessibleEventHandler;s._isAccessible=true;s._win=w}return false},accessibleEventHandler:function(e){var elm,win=this._win;e=tinyMCE.isIE?win.event:e;elm=tinyMCE.isIE?e.srcElement:e.target;if(e.type=="blur"){if(elm.oldonchange){elm.onchange=elm.oldonchange;elm.oldonchange=null}return true}if(elm.nodeName=="SELECT"&&!elm.oldonchange){elm.oldonchange=elm.onchange;elm.onchange=null}if(e.keyCode==13||e.keyCode==32){elm.onchange=elm.oldonchange;elm.onchange();elm.oldonchange=null;tinyMCE.cancelEvent(e);return false}return true},_resetIframeHeight:function(){var ife;if(tinyMCE.isRealIE){ife=tinyMCE.selectedInstance.iframeElement;if(ife._oldHeight){ife.style.height=ife._oldHeight;ife.height=ife._oldHeight}}}});function TinyMCE_Selection(inst){this.instance=inst};TinyMCE_Selection.prototype={getSelectedHTML:function(){var inst=this.instance,e,r=this.getRng(),h;if(!r)return null;e=document.createElement("body");if(r.cloneContents)e.appendChild(r.cloneContents());else if(typeof(r.item)!='undefined'||typeof(r.htmlText)!='undefined')e.innerHTML=r.item?r.item(0).outerHTML:r.htmlText;else e.innerHTML=r.toString();h=tinyMCE._cleanupHTML(inst,inst.contentDocument,inst.settings,e,e,false,true,false);return h},getSelectedText:function(){var inst=this.instance,d,r,s,t;if(tinyMCE.isIE){d=inst.getDoc();if(d.selection.type=="Text"){r=d.selection.createRange();t=r.text}else t=''}else{s=this.getSel();if(s&&s.toString)t=s.toString();else t=''}return t},getBookmark:function(simple){var inst=this.instance,rng=this.getRng(),doc=inst.getDoc(),b=inst.getBody();var trng,sx,sy,xx=-999999999,vp=inst.getViewPort();var sp,le,s,e,nl,i,si,ei,w;sx=vp.left;sy=vp.top;if(simple)return{rng:rng,scrollX:sx,scrollY:sy};if(tinyMCE.isRealIE){if(rng.item){e=rng.item(0);nl=b.getElementsByTagName(e.nodeName);for(i=0;i<nl.length;i++){if(e==nl[i]){sp=i;break}}return{tag:e.nodeName,index:sp,scrollX:sx,scrollY:sy}}else{trng=doc.body.createTextRange();trng.moveToElementText(inst.getBody());trng.collapse(true);bp=Math.abs(trng.move('character',xx));trng=rng.duplicate();trng.collapse(true);sp=Math.abs(trng.move('character',xx));trng=rng.duplicate();trng.collapse(false);le=Math.abs(trng.move('character',xx))-sp;return{start:sp-bp,length:le,scrollX:sx,scrollY:sy}}}else{s=this.getSel();e=this.getFocusElement();if(!s)return null;if(e&&e.nodeName=='IMG'){return{start:-1,end:-1,index:sp,scrollX:sx,scrollY:sy}}if(s.anchorNode==s.focusNode&&s.anchorOffset==s.focusOffset){e=this._getPosText(b,s.anchorNode,s.focusNode);if(!e)return{scrollX:sx,scrollY:sy};return{start:e.start+s.anchorOffset,end:e.end+s.focusOffset,scrollX:sx,scrollY:sy}}else{e=this._getPosText(b,rng.startContainer,rng.endContainer);if(!e)return{scrollX:sx,scrollY:sy};return{start:e.start+rng.startOffset,end:e.end+rng.endOffset,scrollX:sx,scrollY:sy}}}return null},moveToBookmark:function(bookmark){var inst=this.instance,rng,nl,i,ex,b=inst.getBody(),sd;var doc=inst.getDoc(),win=inst.getWin(),sel=this.getSel();if(!bookmark)return false;if(tinyMCE.isSafari&&bookmark.rng){sel.setBaseAndExtent(bookmark.rng.startContainer,bookmark.rng.startOffset,bookmark.rng.endContainer,bookmark.rng.endOffset);return true}if(tinyMCE.isRealIE){if(bookmark.rng){try{bookmark.rng.select()}catch(ex){}return true}win.focus();if(bookmark.tag){rng=b.createControlRange();nl=b.getElementsByTagName(bookmark.tag);if(nl.length>bookmark.index){try{rng.addElement(nl[bookmark.index])}catch(ex){}}}else{try{if(bookmark.start<0)return true;rng=inst.getSel().createRange();rng.moveToElementText(inst.getBody());rng.collapse(true);rng.moveStart('character',bookmark.start);rng.moveEnd('character',bookmark.length)}catch(ex){return true}}rng.select();win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true}if(tinyMCE.isGecko||tinyMCE.isOpera){if(!sel)return false;if(bookmark.rng){sel.removeAllRanges();sel.addRange(bookmark.rng)}if(bookmark.start!=-1&&bookmark.end!=-1){try{sd=this._getTextPos(b,bookmark.start,bookmark.end);rng=doc.createRange();rng.setStart(sd.startNode,sd.startOffset);rng.setEnd(sd.endNode,sd.endOffset);sel.removeAllRanges();sel.addRange(rng);if(!tinyMCE.isOpera)win.focus()}catch(ex){}}win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true}return false},_getPosText:function(r,sn,en){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){if(n==sn)d.start=p;if(n==en){d.end=p;return d}p+=n.nodeValue?n.nodeValue.length:0}return null},_getTextPos:function(r,sp,ep){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){p+=n.nodeValue?n.nodeValue.length:0;if(p>=sp&&!d.startNode){d.startNode=n;d.startOffset=sp-(p-n.nodeValue.length)}if(p>=ep){d.endNode=n;d.endOffset=ep-(p-n.nodeValue.length);return d}}return null},selectNode:function(node,collapse,select_text_node,to_start){var inst=this.instance,sel,rng,nodes;if(!node)return;if(typeof(collapse)=="undefined")collapse=true;if(typeof(select_text_node)=="undefined")select_text_node=false;if(typeof(to_start)=="undefined")to_start=true;if(inst.settings.auto_resize)inst.resizeToContent();if(tinyMCE.isRealIE){rng=inst.getDoc().body.createTextRange();try{rng.moveToElementText(node);if(collapse)rng.collapse(to_start);rng.select()}catch(e){}}else{sel=this.getSel();if(!sel)return;if(tinyMCE.isSafari){sel.setBaseAndExtent(node,0,node,node.innerText.length);if(collapse){if(to_start)sel.collapseToStart();else sel.collapseToEnd()}this.scrollToNode(node);return}rng=inst.getDoc().createRange();if(select_text_node){nodes=tinyMCE.getNodeTree(node,[],3);if(nodes.length>0)rng.selectNodeContents(nodes[0]);else rng.selectNodeContents(node)}else rng.selectNode(node);if(collapse){if(!to_start&&node.nodeType==3){rng.setStart(node,node.nodeValue.length);rng.setEnd(node,node.nodeValue.length)}else rng.collapse(to_start)}sel.removeAllRanges();sel.addRange(rng)}this.scrollToNode(node);tinyMCE.selectedElement=null;if(node.nodeType==1)tinyMCE.selectedElement=node},scrollToNode:function(node){var inst=this.instance,w=inst.getWin(),vp=inst.getViewPort(),pos=tinyMCE.getAbsPosition(node),cvp,p,cwin;if(pos.absLeft<vp.left||pos.absLeft>vp.left+vp.width||pos.absTop<vp.top||pos.absTop>vp.top+(vp.height-25))w.scrollTo(pos.absLeft,pos.absTop-vp.height+25);if(inst.settings.auto_resize){cwin=inst.getContainerWin();cvp=tinyMCE.getViewPort(cwin);p=this.getAbsPosition(node);if(p.absLeft<cvp.left||p.absLeft>cvp.left+cvp.width||p.absTop<cvp.top||p.absTop>cvp.top+cvp.height)cwin.scrollTo(p.absLeft,p.absTop-cvp.height+25)}},getAbsPosition:function(n){var pos=tinyMCE.getAbsPosition(n),ipos=tinyMCE.getAbsPosition(this.instance.iframeElement);return{absLeft:ipos.absLeft+pos.absLeft,absTop:ipos.absTop+pos.absTop}},getSel:function(){var inst=this.instance;if(tinyMCE.isRealIE)return inst.getDoc().selection;return inst.contentWindow.getSelection()},getRng:function(){var s=this.getSel();if(s==null)return null;if(tinyMCE.isRealIE)return s.createRange();if(tinyMCE.isSafari&&!s.getRangeAt)return''+window.getSelection();if(s.rangeCount>0)return s.getRangeAt(0);return null},isCollapsed:function(){var r=this.getRng();if(r.item)return false;return r.boundingWidth==0||this.getSel().isCollapsed},collapse:function(b){var r=this.getRng(),s=this.getSel();if(r.select){r.collapse(b);r.select()}else{if(b)s.collapseToStart();else s.collapseToEnd()}},getFocusElement:function(){var inst=this.instance,doc,rng,sel,elm;if(tinyMCE.isRealIE){doc=inst.getDoc();rng=doc.selection.createRange();elm=rng.item?rng.item(0):rng.parentElement()}else{if(!tinyMCE.isSafari&&inst.isHidden())return inst.getBody();sel=this.getSel();rng=this.getRng();if(!sel||!rng)return null;elm=rng.commonAncestorContainer;if(!rng.collapsed){if(rng.startContainer==rng.endContainer){if(rng.startOffset-rng.endOffset<2){if(rng.startContainer.hasChildNodes())elm=rng.startContainer.childNodes[rng.startOffset]}}}elm=tinyMCE.getParentElement(elm);}return elm}};function TinyMCE_UndoRedo(inst){this.instance=inst;this.undoLevels=[];this.undoIndex=0;this.typingUndoIndex=-1;this.undoRedo=true};TinyMCE_UndoRedo.prototype={add:function(l){var b,customUndoLevels,newHTML,inst=this.instance,i,ul,ur;if(l){this.undoLevels[this.undoLevels.length]=l;return true}if(this.typingUndoIndex!=-1){this.undoIndex=this.typingUndoIndex;if(tinyMCE.typingUndoIndex!=-1)tinyMCE.undoIndex=tinyMCE.typingUndoIndex}newHTML=tinyMCE.trim(inst.getBody().innerHTML);if(this.undoLevels[this.undoIndex]&&newHTML!=this.undoLevels[this.undoIndex].content){inst.isNotDirty=false;tinyMCE.dispatchCallback(inst,'onchange_callback','onChange',inst);customUndoLevels=tinyMCE.settings.custom_undo_redo_levels;if(customUndoLevels!=-1&&this.undoLevels.length>customUndoLevels){for(i=0;i<this.undoLevels.length-1;i++)this.undoLevels[i]=this.undoLevels[i+1];this.undoLevels.length--;this.undoIndex--;}b=inst.undoBookmark;if(!b)b=inst.selection.getBookmark();this.undoIndex++;this.undoLevels[this.undoIndex]={content:newHTML,bookmark:b};ul=tinyMCE.undoLevels;for(i=tinyMCE.undoIndex+1;i<ul.length;i++){ur=ul[i].undoRedo;if(ur.undoIndex==ur.undoLevels.length-1)ur.undoIndex--;ur.undoLevels.length--}tinyMCE.undoLevels[tinyMCE.undoIndex++]=inst;tinyMCE.undoLevels.length=tinyMCE.undoIndex;this.undoLevels.length=this.undoIndex+1;return true}return false},undo:function(){var inst=this.instance;if(this.undoIndex>0){this.undoIndex--;tinyMCE.setInnerHTML(inst.getBody(),this.undoLevels[this.undoIndex].content);inst.repaint();if(inst.settings.custom_undo_redo_restore_selection)inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark)}},redo:function(){var inst=this.instance;tinyMCE.execCommand("mceEndTyping");if(this.undoIndex<(this.undoLevels.length-1)){this.undoIndex++;tinyMCE.setInnerHTML(inst.getBody(),this.undoLevels[this.undoIndex].content);inst.repaint();if(inst.settings.custom_undo_redo_restore_selection)inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark)}tinyMCE.triggerNodeChange()}};var TinyMCE_ForceParagraphs={_insertPara:function(inst,e){var doc=inst.getDoc(),sel=inst.getSel(),body=inst.getBody(),win=inst.contentWindow,rng=sel.getRangeAt(0);var rootElm=doc.documentElement,blockName="P",startNode,endNode,startBlock,endBlock;var rngBefore,rngAfter,direct,startNode,startOffset,endNode,endOffset,b=tinyMCE.isOpera?inst.selection.getBookmark():null;var paraBefore,paraAfter,startChop,endChop,contents,i;function isEmpty(para){var nodes;function isEmptyHTML(html){return html.replace(new RegExp('[ \t\r\n]+','g'),'').toLowerCase()==''}if(para.getElementsByTagName("img").length>0)return false;if(para.getElementsByTagName("table").length>0)return false;if(para.getElementsByTagName("hr").length>0)return false;nodes=tinyMCE.getNodeTree(para,[],3);for(i=0;i<nodes.length;i++){if(!isEmptyHTML(nodes[i].nodeValue))return false}return true}rngBefore=doc.createRange();rngBefore.setStart(sel.anchorNode,sel.anchorOffset);rngBefore.collapse(true);rngAfter=doc.createRange();rngAfter.setStart(sel.focusNode,sel.focusOffset);rngAfter.collapse(true);direct=rngBefore.compareBoundaryPoints(rngBefore.START_TO_END,rngAfter)<0;startNode=direct?sel.anchorNode:sel.focusNode;startOffset=direct?sel.anchorOffset:sel.focusOffset;endNode=direct?sel.focusNode:sel.anchorNode;endOffset=direct?sel.focusOffset:sel.anchorOffset;startNode=startNode.nodeName=="BODY"?startNode.firstChild:startNode;endNode=endNode.nodeName=="BODY"?endNode.firstChild:endNode;startBlock=inst.getParentBlockElement(startNode);endBlock=inst.getParentBlockElement(endNode);if(startBlock&&(startBlock.nodeName=='CAPTION'||/absolute|relative|static/gi.test(startBlock.style.position)))startBlock=null;if(endBlock&&(endBlock.nodeName=='CAPTION'||/absolute|relative|static/gi.test(endBlock.style.position)))endBlock=null;if(startBlock!=null){blockName=startBlock.nodeName;if(/(TD|TABLE|TH|CAPTION)/.test(blockName)||(blockName=="DIV"&&/left|right/gi.test(startBlock.style.cssFloat)))blockName="P"}if(tinyMCE.getParentElement(startBlock,"OL,UL",null,body)!=null)return false;if((startBlock!=null&&startBlock.nodeName=="TABLE")||(endBlock!=null&&endBlock.nodeName=="TABLE"))startBlock=endBlock=null;paraBefore=(startBlock!=null&&startBlock.nodeName==blockName)?startBlock.cloneNode(false):doc.createElement(blockName);paraAfter=(endBlock!=null&&endBlock.nodeName==blockName)?endBlock.cloneNode(false):doc.createElement(blockName);if(/^(H[1-6])$/.test(blockName))paraAfter=doc.createElement("p");startChop=startNode;endChop=endNode;node=startChop;do{if(node==body||node.nodeType==9||tinyMCE.isBlockElement(node))break;startChop=node}while((node=node.previousSibling?node.previousSibling:node.parentNode));node=endChop;do{if(node==body||node.nodeType==9||tinyMCE.isBlockElement(node))break;endChop=node}while((node=node.nextSibling?node.nextSibling:node.parentNode));if(startChop.nodeName=="TD")startChop=startChop.firstChild;if(endChop.nodeName=="TD")endChop=endChop.lastChild;if(startBlock==null){rng.deleteContents();if(!tinyMCE.isSafari)sel.removeAllRanges();if(startChop!=rootElm&&endChop!=rootElm){rngBefore=rng.cloneRange();if(startChop==body)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);paraBefore.appendChild(rngBefore.cloneContents());if(endChop.parentNode.nodeName==blockName)endChop=endChop.parentNode;rng.setEndAfter(endChop);if(endChop.nodeName!="#text"&&endChop.nodeName!="BODY")rngBefore.setEndAfter(endChop);contents=rng.cloneContents();if(contents.firstChild&&(contents.firstChild.nodeName==blockName||contents.firstChild.nodeName=="BODY"))paraAfter.innerHTML=contents.firstChild.innerHTML;else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML="&nbsp;";if(isEmpty(paraAfter))paraAfter.innerHTML="&nbsp;";rng.deleteContents();rngAfter.deleteContents();rngBefore.deleteContents();if(tinyMCE.isOpera){paraBefore.normalize();rngBefore.insertNode(paraBefore);paraAfter.normalize();rngBefore.insertNode(paraAfter)}else{paraAfter.normalize();rngBefore.insertNode(paraAfter);paraBefore.normalize();rngBefore.insertNode(paraBefore)}}else{body.innerHTML="<"+blockName+">&nbsp;</"+blockName+"><"+blockName+">&nbsp;</"+blockName+">";paraAfter=body.childNodes[1]}inst.selection.moveToBookmark(b);inst.selection.selectNode(paraAfter,true,true);return true}if(startChop.nodeName==blockName)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);rngBefore.setEnd(startNode,startOffset);paraBefore.appendChild(rngBefore.cloneContents());rngAfter.setEndAfter(endChop);rngAfter.setStart(endNode,endOffset);contents=rngAfter.cloneContents();if(contents.firstChild&&contents.firstChild.nodeName==blockName){paraAfter.innerHTML=contents.firstChild.innerHTML}else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML="&nbsp;";if(isEmpty(paraAfter))paraAfter.innerHTML="&nbsp;";rng=doc.createRange();if(!startChop.previousSibling&&startChop.parentNode.nodeName.toUpperCase()==blockName){rng.setStartBefore(startChop.parentNode)}else{if(rngBefore.startContainer.nodeName.toUpperCase()==blockName&&rngBefore.startOffset==0)rng.setStartBefore(rngBefore.startContainer);else rng.setStart(rngBefore.startContainer,rngBefore.startOffset)}if(!endChop.nextSibling&&endChop.parentNode.nodeName.toUpperCase()==blockName)rng.setEndAfter(endChop.parentNode);else rng.setEnd(rngAfter.endContainer,rngAfter.endOffset);rng.deleteContents();if(tinyMCE.isOpera){rng.insertNode(paraBefore);rng.insertNode(paraAfter)}else{rng.insertNode(paraAfter);rng.insertNode(paraBefore)}paraAfter.normalize();paraBefore.normalize();inst.selection.moveToBookmark(b);inst.selection.selectNode(paraAfter,true,true);return true},_handleBackSpace:function(inst){var r=inst.getRng(),sn=r.startContainer,nv,s=false;if(sn&&sn.nextSibling&&sn.nextSibling.nodeName=="BR"&&sn.parentNode.nodeName!="BODY"){nv=sn.nodeValue;if(nv!=null&&r.startOffset==nv.length)sn.nextSibling.parentNode.removeChild(sn.nextSibling)}if(inst.settings.auto_resize)inst.resizeToContent();return s}};function TinyMCE_Layer(id,bm){this.id=id;this.blockerElement=null;this.events=false;this.element=null;this.blockMode=typeof(bm)!='undefined'?bm:true;this.doc=document};TinyMCE_Layer.prototype={moveRelativeTo:function(re,p){var rep=this.getAbsPosition(re),e=this.getElement(),x,y;var w=parseInt(re.offsetWidth),h=parseInt(re.offsetHeight);var ew=parseInt(e.offsetWidth),eh=parseInt(e.offsetHeight);switch(p){case"tl":x=rep.absLeft;y=rep.absTop;break;case"tr":x=rep.absLeft+w;y=rep.absTop;break;case"bl":x=rep.absLeft;y=rep.absTop+h;break;case"br":x=rep.absLeft+w;y=rep.absTop+h;break;case"cc":x=rep.absLeft+(w/ 2) - (ew /2);y=rep.absTop+(h/ 2) - (eh /2);break}this.moveTo(x,y)},moveBy:function(x,y){var e=this.getElement();this.moveTo(parseInt(e.style.left)+x,parseInt(e.style.top)+y)},moveTo:function(x,y){var e=this.getElement();e.style.left=x+"px";e.style.top=y+"px";this.updateBlocker()},resizeBy:function(w,h){var e=this.getElement();this.resizeTo(parseInt(e.style.width)+w,parseInt(e.style.height)+h)},resizeTo:function(w,h){var e=this.getElement();if(w!=null)e.style.width=w+"px";if(h!=null)e.style.height=h+"px";this.updateBlocker()},show:function(){var el=this.getElement();if(el){el.style.display='block';this.updateBlocker()}},hide:function(){var el=this.getElement();if(el){el.style.display='none';this.updateBlocker()}},isVisible:function(){return this.getElement().style.display=='block'},getElement:function(){if(!this.element)this.element=this.doc.getElementById(this.id);return this.element},setBlockMode:function(s){this.blockMode=s},updateBlocker:function(){var e,b,x,y,w,h;b=this.getBlocker();if(b){if(this.blockMode){e=this.getElement();x=this.parseInt(e.style.left);y=this.parseInt(e.style.top);w=this.parseInt(e.offsetWidth);h=this.parseInt(e.offsetHeight);b.style.left=x+'px';b.style.top=y+'px';b.style.width=w+'px';b.style.height=h+'px';b.style.display=e.style.display}else b.style.display='none'}},getBlocker:function(){var d,b;if(!this.blockerElement&&this.blockMode){d=this.doc;b=d.getElementById(this.id+"_blocker");if(!b){b=d.createElement("iframe");b.setAttribute('id',this.id+"_blocker");b.style.cssText='display: none; position: absolute; left: 0; top: 0';b.src='javascript:false;';b.frameBorder='0';b.scrolling='no';d.body.appendChild(b)}this.blockerElement=b}return this.blockerElement},getAbsPosition:function(n){var p={absLeft:0,absTop:0};while(n){p.absLeft+=n.offsetLeft;p.absTop+=n.offsetTop;n=n.offsetParent}return p},create:function(n,c,p,h){var d=this.doc,e=d.createElement(n);e.setAttribute('id',this.id);if(c)e.className=c;if(!p)p=d.body;if(h)e.innerHTML=h;p.appendChild(e);return this.element=e},exists:function(){return this.doc.getElementById(this.id)!=null},parseInt:function(s){if(s==null||s=='')return 0;return parseInt(s)},remove:function(){var e=this.getElement(),b=this.getBlocker();if(e)e.parentNode.removeChild(e);if(b)b.parentNode.removeChild(b)}};function TinyMCE_Menu(){var id;if(typeof(tinyMCE.menuCounter)=="undefined")tinyMCE.menuCounter=0;id="mc_menu_"+tinyMCE.menuCounter++;TinyMCE_Layer.call(this,id,true);this.id=id;this.items=[];this.needsUpdate=true};TinyMCE_Menu.prototype=tinyMCE.extend(TinyMCE_Layer.prototype,{init:function(s){var n;this.settings={separator_class:'mceMenuSeparator',title_class:'mceMenuTitle',disabled_class:'mceMenuDisabled',menu_class:'mceMenu',drop_menu:true};for(n in s)this.settings[n]=s[n];this.create('div',this.settings.menu_class)},clear:function(){this.items=[]},addTitle:function(t){this.add({type:'title',text:t})},addDisabled:function(t){this.add({type:'disabled',text:t})},addSeparator:function(){this.add({type:'separator'})},addItem:function(t,js){this.add({text:t,js:js})},add:function(mi){this.items[this.items.length]=mi;this.needsUpdate=true},update:function(){var e=this.getElement(),h='',i,t,m=this.items,s=this.settings;if(this.settings.drop_menu)h+='<span class="mceMenuLine"></span>';h+='<table border="0" cellpadding="0" cellspacing="0">';for(i=0;i<m.length;i++){t=tinyMCE.xmlEncode(m[i].text);c=m[i].class_name?' class="'+m[i].class_name+'"':'';switch(m[i].type){case'separator':h+='<tr class="'+s.separator_class+'"><td>';break;case'title':h+='<tr class="'+s.title_class+'"><td><span'+c+'>'+t+'</span>';break;case'disabled':h+='<tr class="'+s.disabled_class+'"><td><span'+c+'>'+t+'</span>';break;default:h+='<tr><td><a href="'+tinyMCE.xmlEncode(m[i].js)+'" onmousedown="'+tinyMCE.xmlEncode(m[i].js)+';return tinyMCE.cancelEvent(event);" onclick="return tinyMCE.cancelEvent(event);" onmouseup="return tinyMCE.cancelEvent(event);"><span'+c+'>'+t+'</span></a>'}h+='</td></tr>'}h+='</table>';e.innerHTML=h;this.needsUpdate=false;this.updateBlocker()},show:function(){var nl,i;if(tinyMCE.lastMenu==this)return;if(this.needsUpdate)this.update();if(tinyMCE.lastMenu&&tinyMCE.lastMenu!=this)tinyMCE.lastMenu.hide();TinyMCE_Layer.prototype.show.call(this);if(!tinyMCE.isOpera){}tinyMCE.lastMenu=this}});tinyMCE.add(TinyMCE_Engine,{debug:function(){var m="",a,i,l=tinyMCE.log.length;for(i=0,a=this.debug.arguments;i<a.length;i++){m+=a[i];if(i<a.length-1)m+=', '}if(l<1000)tinyMCE.log[l]="[debug] "+m}});
\ No newline at end of file
+function TinyMCE_Engine(){var ua;this.majorVersion="2";this.minorVersion="1.3";this.releaseDate="2007-11-27";this.instances=[];this.switchClassCache=[];this.windowArgs=[];this.loadedFiles=[];this.pendingFiles=[];this.loadingIndex=0;this.configs=[];this.currentConfig=0;this.eventHandlers=[];this.log=[];this.undoLevels=[];this.undoIndex=0;this.typingUndoIndex=-1;this.settings=[];ua=navigator.userAgent;this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.isMSIE5=this.isMSIE&&(ua.indexOf('MSIE 5')!=-1);this.isMSIE5_0=this.isMSIE&&(ua.indexOf('MSIE 5.0')!=-1);this.isMSIE7=this.isMSIE&&(ua.indexOf('MSIE 7')!=-1);this.isGecko=ua.indexOf('Gecko')!=-1;this.isSafari=ua.indexOf('Safari')!=-1;this.isOpera=window['opera']&&opera.buildNumber?true:false;this.isMac=ua.indexOf('Mac')!=-1;this.isNS7=ua.indexOf('Netscape/7')!=-1;this.isNS71=ua.indexOf('Netscape/7.1')!=-1;this.dialogCounter=0;this.plugins=[];this.themes=[];this.menus=[];this.loadedPlugins=[];this.buttonMap=[];this.isLoaded=false;if(this.isOpera){this.isMSIE=true;this.isGecko=false;this.isSafari=false}this.isIE=this.isMSIE;this.isRealIE=this.isMSIE&&!this.isOpera;this.idCounter=0};TinyMCE_Engine.prototype={init:function(settings){var theme,nl,baseHREF="",i,cssPath,entities,h,p,src,elements=[],head;if(this.isMSIE5_0)return;this.settings=settings;if(typeof(document.execCommand)=='undefined')return;if(!tinyMCE.baseURL){head=document.getElementsByTagName('head')[0];if(head){for(i=0,nl=head.getElementsByTagName('script');i<nl.length;i++)elements.push(nl[i])}for(i=0,nl=document.getElementsByTagName('script');i<nl.length;i++)elements.push(nl[i]);nl=document.getElementsByTagName('base');for(i=0;i<nl.length;i++){if(nl[i].href)baseHREF=nl[i].href}for(i=0;i<elements.length;i++){if(elements[i].src&&(elements[i].src.indexOf("tiny_mce.js")!=-1||elements[i].src.indexOf("tiny_mce_dev.js")!=-1||elements[i].src.indexOf("tiny_mce_src.js")!=-1||elements[i].src.indexOf("tiny_mce_gzip")!=-1)){src=elements[i].src;tinyMCE.srcMode=(src.indexOf('_src')!=-1||src.indexOf('_dev')!=-1)?'_src':'';tinyMCE.gzipMode=src.indexOf('_gzip')!=-1;src=src.substring(0,src.lastIndexOf('/'));if(settings.exec_mode=="src"||settings.exec_mode=="normal")tinyMCE.srcMode=settings.exec_mode=="src"?'_src':'';if(baseHREF!==''&&src.indexOf('://')==-1)tinyMCE.baseURL=baseHREF+src;else tinyMCE.baseURL=src;break}}}this.documentBasePath=document.location.href;if(this.documentBasePath.indexOf('?')!=-1)this.documentBasePath=this.documentBasePath.substring(0,this.documentBasePath.indexOf('?'));this.documentURL=this.documentBasePath;this.documentBasePath=this.documentBasePath.substring(0,this.documentBasePath.lastIndexOf('/'));if(tinyMCE.baseURL.indexOf('://')==-1&&tinyMCE.baseURL.charAt(0)!='/'){tinyMCE.baseURL=this.documentBasePath+"/"+tinyMCE.baseURL}this._def("mode","none");this._def("theme","advanced");this._def("plugins","",true);this._def("language","en");this._def("docs_language",this.settings.language);this._def("elements","");this._def("textarea_trigger","mce_editable");this._def("editor_selector","");this._def("editor_deselector","mceNoEditor");this._def("valid_elements","+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],cite[title|id|class|style|dir|lang],abbr[title|id|class|style|dir|lang],acronym[title|id|class|style|dir|lang],del[title|id|class|style|dir|lang|datetime|cite],ins[title|id|class|style|dir|lang|datetime|cite]");this._def("extended_valid_elements","");this._def("invalid_elements","");this._def("encoding","");this._def("urlconverter_callback",tinyMCE.getParam("urlconvertor_callback","TinyMCE_Engine.prototype.convertURL"));this._def("save_callback","");this._def("force_br_newlines",false);this._def("force_p_newlines",true);this._def("add_form_submit_trigger",true);this._def("relative_urls",true);this._def("remove_script_host",true);this._def("focus_alert",true);this._def("document_base_url",this.documentURL);this._def("visual",true);this._def("visual_table_class","mceVisualAid");this._def("setupcontent_callback","");this._def("fix_content_duplication",true);this._def("custom_undo_redo",true);this._def("custom_undo_redo_levels",-1);this._def("custom_undo_redo_keyboard_shortcuts",true);this._def("custom_undo_redo_restore_selection",true);this._def("custom_undo_redo_global",false);this._def("verify_html",true);this._def("apply_source_formatting",false);this._def("directionality","ltr");this._def("cleanup_on_startup",false);this._def("inline_styles",false);this._def("convert_newlines_to_brs",false);this._def("auto_reset_designmode",true);this._def("entities","39,#39,160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,34,quot,38,amp,60,lt,62,gt,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro",true);this._def("entity_encoding","named");this._def("cleanup_callback","");this._def("add_unload_trigger",true);this._def("ask",false);this._def("nowrap",false);this._def("auto_resize",false);this._def("auto_focus",false);this._def("cleanup",true);this._def("remove_linebreaks",true);this._def("button_tile_map",false);this._def("submit_patch",true);this._def("browsers","msie,safari,gecko,opera",true);this._def("dialog_type","window");this._def("accessibility_warnings",true);this._def("accessibility_focus",true);this._def("merge_styles_invalid_parents","");this._def("force_hex_style_colors",true);this._def("trim_span_elements",true);this._def("convert_fonts_to_spans",false);this._def("doctype",'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');this._def("font_size_classes",'');this._def("font_size_style_values",'xx-small,x-small,small,medium,large,x-large,xx-large',true);this._def("event_elements",'a,img',true);this._def("convert_urls",true);this._def("table_inline_editing",false);this._def("object_resizing",true);this._def("custom_shortcuts",true);this._def("convert_on_click",false);this._def("content_css",'');this._def("fix_list_elements",true);this._def("fix_table_elements",false);this._def("strict_loading_mode",document.contentType=='application/xhtml+xml');this._def("hidden_tab_class",'');this._def("display_tab_class",'');this._def("gecko_spellcheck",false);this._def("hide_selects_on_submit",true);this._def("forced_root_block",false);this._def("remove_trailing_nbsp",false);this._def("save_on_tinymce_forms",false);if(this.isMSIE&&!this.isOpera)this.settings.strict_loading_mode=false;if(this.isMSIE&&this.settings.browsers.indexOf('msie')==-1)return;if(this.isGecko&&this.settings.browsers.indexOf('gecko')==-1)return;if(this.isSafari&&this.settings.browsers.indexOf('safari')==-1)return;if(this.isOpera&&this.settings.browsers.indexOf('opera')==-1)return;baseHREF=tinyMCE.settings.document_base_url;h=document.location.href;p=h.indexOf('://');if(p>0&&document.location.protocol!="file:"){p=h.indexOf('/',p+3);h=h.substring(0,p);if(baseHREF.indexOf('://')==-1)baseHREF=h+baseHREF;tinyMCE.settings.document_base_url=baseHREF;tinyMCE.settings.document_base_prefix=h}if(baseHREF.indexOf('?')!=-1)baseHREF=baseHREF.substring(0,baseHREF.indexOf('?'));this.settings.base_href=baseHREF.substring(0,baseHREF.lastIndexOf('/'))+"/";theme=this.settings.theme;this.inlineStrict='A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';this.inlineTransitional='A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';this.blockElms='H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';this.blockRegExp=new RegExp("^("+this.blockElms+")$","i");this.posKeyCodes=[13,45,36,35,33,34,37,38,39,40];this.uniqueURL='javascript:void(091039730);';this.uniqueTag='<div id="mceTMPElement" style="display: none">TMP</div>';this.callbacks=['onInit','getInfo','getEditorTemplate','setupContent','onChange','onPageLoad','handleNodeChange','initInstance','execCommand','getControlHTML','handleEvent','cleanup','removeInstance'];this.settings.theme_href=tinyMCE.baseURL+"/themes/"+theme;if(!tinyMCE.isIE||tinyMCE.isOpera)this.settings.force_br_newlines=false;if(tinyMCE.getParam("popups_css",false)){cssPath=tinyMCE.getParam("popups_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings.popups_css=this.documentBasePath+"/"+cssPath;else this.settings.popups_css=cssPath}else this.settings.popups_css=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_popup.css";if(tinyMCE.getParam("editor_css",false)){cssPath=tinyMCE.getParam("editor_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings.editor_css=this.documentBasePath+"/"+cssPath;else this.settings.editor_css=cssPath}else{if(this.settings.editor_css!=='')this.settings.editor_css=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_ui.css"}if(this.configs.length==0){if(typeof(TinyMCECompressed)=="undefined"){tinyMCE.addEvent(window,"DOMContentLoaded",TinyMCE_Engine.prototype.onLoad);if(tinyMCE.isRealIE){if(document.body)tinyMCE.addEvent(document.body,"readystatechange",TinyMCE_Engine.prototype.onLoad);else tinyMCE.addEvent(document,"readystatechange",TinyMCE_Engine.prototype.onLoad)}tinyMCE.addEvent(window,"load",TinyMCE_Engine.prototype.onLoad);tinyMCE._addUnloadEvents()}}this.loadScript(tinyMCE.baseURL+'/themes/'+this.settings.theme+'/editor_template'+tinyMCE.srcMode+'.js');this.loadScript(tinyMCE.baseURL+'/langs/'+this.settings.language+'.js');this.loadCSS(this.settings.editor_css);p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(i=0;i<p.length;i++){if(p[i].charAt(0)!='-')this.loadScript(tinyMCE.baseURL+'/plugins/'+p[i]+'/editor_plugin'+tinyMCE.srcMode+'.js')}}if(tinyMCE.getParam('entity_encoding')=='named'){settings.cleanup_entities=[];entities=tinyMCE.getParam('entities','',true,',');for(i=0;i<entities.length;i+=2)settings.cleanup_entities['c'+entities[i]]=entities[i+1]}settings.index=this.configs.length;this.configs[this.configs.length]=settings;this.loadNextScript();if(this.isIE&&!this.isOpera){try{document.execCommand('BackgroundImageCache',false,true)}catch(e){}}this.xmlEncodeRe=new RegExp('[<>&"]','g')},_addUnloadEvents:function(){var st=tinyMCE.settings.add_unload_trigger;if(tinyMCE.isIE){if(st){tinyMCE.addEvent(window,"unload",TinyMCE_Engine.prototype.unloadHandler);tinyMCE.addEvent(window.document,"beforeunload",TinyMCE_Engine.prototype.unloadHandler)}}else{if(st)tinyMCE.addEvent(window,"unload",function(){tinyMCE.triggerSave(true,true)})}},_def:function(key,def_val,t){var v=tinyMCE.getParam(key,def_val);v=t?v.replace(/\s+/g,""):v;this.settings[key]=v},hasPlugin:function(n){return typeof(this.plugins[n])!="undefined"&&this.plugins[n]!=null},addPlugin:function(n,p){var op=this.plugins[n];p.baseURL=op?op.baseURL:tinyMCE.baseURL+"/plugins/"+n;this.plugins[n]=p;this.loadNextScript()},setPluginBaseURL:function(n,u){var op=this.plugins[n];if(op)op.baseURL=u;else this.plugins[n]={baseURL:u}},loadPlugin:function(n,u){u=u.indexOf('.js')!=-1?u.substring(0,u.lastIndexOf('/')):u;u=u.charAt(u.length-1)=='/'?u.substring(0,u.length-1):u;this.plugins[n]={baseURL:u};this.loadScript(u+"/editor_plugin"+(tinyMCE.srcMode?'_src':'')+".js")},hasTheme:function(n){return typeof(this.themes[n])!="undefined"&&this.themes[n]!=null},addTheme:function(n,t){this.themes[n]=t;this.loadNextScript()},addMenu:function(n,m){this.menus[n]=m},hasMenu:function(n){return typeof(this.plugins[n])!="undefined"&&this.plugins[n]!=null},loadScript:function(url){var i;for(i=0;i<this.loadedFiles.length;i++){if(this.loadedFiles[i]==url)return}if(tinyMCE.settings.strict_loading_mode)this.pendingFiles[this.pendingFiles.length]=url;else document.write('<sc'+'ript language="javascript" type="text/javascript" src="'+url+'"></script>');this.loadedFiles[this.loadedFiles.length]=url},loadNextScript:function(){var d=document,se;if(!tinyMCE.settings.strict_loading_mode)return;if(this.loadingIndex<this.pendingFiles.length){se=d.createElementNS('http://www.w3.org/1999/xhtml','script');se.setAttribute('language','javascript');se.setAttribute('type','text/javascript');se.setAttribute('src',this.pendingFiles[this.loadingIndex++]);d.getElementsByTagName("head")[0].appendChild(se)}else this.loadingIndex=-1;},loadCSS:function(url){var ar=url.replace(/\s+/,'').split(',');var lflen=0,csslen=0,skip=false;var x=0,i=0,nl,le;for(x=0,csslen=ar.length;x<csslen;x++){if(ar[x]!=null&&ar[x]!='null'&&ar[x].length>0){for(i=0,lflen=this.loadedFiles.length;i<lflen;i++){if(this.loadedFiles[i]==ar[x]){skip=true;break}}if(!skip){if(tinyMCE.settings.strict_loading_mode){nl=document.getElementsByTagName("head");le=document.createElement('link');le.setAttribute('href',ar[x]);le.setAttribute('rel','stylesheet');le.setAttribute('type','text/css');nl[0].appendChild(le)}else document.write('<link href="'+ar[x]+'" rel="stylesheet" type="text/css" />');this.loadedFiles[this.loadedFiles.length]=ar[x]}}}},importCSS:function(doc,css){var css_ary=css.replace(/\s+/,'').split(',');var csslen,elm,headArr,x,css_file;for(x=0,csslen=css_ary.length;x<csslen;x++){css_file=css_ary[x];if(css_file!=null&&css_file!='null'&&css_file.length>0){if(css_file.indexOf('://')==-1&&css_file.charAt(0)!='/')css_file=this.documentBasePath+"/"+css_file;if(typeof(doc.createStyleSheet)=="undefined"){elm=doc.createElement("link");elm.rel="stylesheet";elm.href=css_file;if((headArr=doc.getElementsByTagName("head"))!=null&&headArr.length>0)headArr[0].appendChild(elm)}else doc.createStyleSheet(css_file)}}},confirmAdd:function(e,settings){var elm=tinyMCE.isIE?event.srcElement:e.target;var elementId=elm.name?elm.name:elm.id;tinyMCE.settings=settings;if(tinyMCE.settings.convert_on_click||(!elm.getAttribute('mce_noask')&&confirm(tinyMCELang.lang_edit_confirm)))tinyMCE.addMCEControl(elm,elementId);elm.setAttribute('mce_noask','true')},updateContent:function(form_element_name){var formElement,n,inst,doc;formElement=document.getElementById(form_element_name);for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();if(inst.formElement==formElement){doc=inst.getDoc();tinyMCE._setHTML(doc,inst.formElement.value);if(!tinyMCE.isIE)doc.body.innerHTML=tinyMCE._cleanupHTML(inst,doc,this.settings,doc.body,inst.visualAid)}}},addMCEControl:function(replace_element,form_element_name,target_document){var id="mce_editor_"+tinyMCE.idCounter++;var inst=new TinyMCE_Control(tinyMCE.settings);inst.editorId=id;this.instances[id]=inst;inst._onAdd(replace_element,form_element_name,target_document)},removeInstance:function(ti){var t=[],n,i;for(n in tinyMCE.instances){i=tinyMCE.instances[n];if(tinyMCE.isInstance(i)&&ti!=i)t[n]=i}tinyMCE.instances=t;n=[];t=tinyMCE.undoLevels;for(i=0;i<t.length;i++){if(t[i]!=ti)n.push(t[i])}tinyMCE.undoLevels=n;tinyMCE.undoIndex=n.length;tinyMCE.dispatchCallback(ti,'remove_instance_callback','removeInstance',ti);return ti},removeMCEControl:function(editor_id){var inst=tinyMCE.getInstanceById(editor_id),h,re,ot,tn,n;if(inst){inst.switchSettings();editor_id=inst.editorId;h=tinyMCE.getContent(editor_id);this.removeInstance(inst);tinyMCE.selectedElement=null;tinyMCE.selectedInstance=null;tinyMCE.selectedElement=null;tinyMCE.selectedInstance=null;for(n in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[n]))continue;tinyMCE.selectedInstance=tinyMCE.instances[n];break}re=document.getElementById(editor_id+"_parent");ot=inst.oldTargetElement;tn=ot.nodeName.toLowerCase();if(tn=="textarea"||tn=="input"){re.parentNode.removeChild(re);ot.style.display="inline";ot.value=h}else{ot.innerHTML=h;ot.style.display='block';re.parentNode.insertBefore(ot,re);re.parentNode.removeChild(re)}}},triggerSave:function(skip_cleanup,skip_callback){var inst,n;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.triggerSave(skip_cleanup,skip_callback)}},resetForm:function(form_index){var i,inst,n,formObj=document.forms[form_index];for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();for(i=0;i<formObj.elements.length;i++){if(inst.formTargetElementId==formObj.elements[i].name)inst.getBody().innerHTML=inst.startContent}}},execInstanceCommand:function(editor_id,command,user_interface,value,focus){var inst=tinyMCE.getInstanceById(editor_id),r;if(inst){r=inst.selection.getRng();if(typeof(focus)=="undefined")focus=true;if(focus&&(!r||!r.item))inst.contentWindow.focus();inst.autoResetDesignMode();this.selectedElement=inst.getFocusElement();inst.select();tinyMCE.execCommand(command,user_interface,value);if(tinyMCE.isIE&&window.event!=null)tinyMCE.cancelEvent(window.event)}},execCommand:function(command,user_interface,value){var inst=tinyMCE.selectedInstance,n,pe,te;user_interface=user_interface?user_interface:false;value=value?value:null;if(inst)inst.switchSettings();switch(command){case"Undo":if(this.getParam('custom_undo_redo_global')){if(this.undoIndex>0){tinyMCE.nextUndoRedoAction='Undo';inst=this.undoLevels[--this.undoIndex];inst.select();if(!tinyMCE.nextUndoRedoInstanceId)inst.execCommand('Undo')}}else inst.execCommand('Undo');return true;case"Redo":if(this.getParam('custom_undo_redo_global')){if(this.undoIndex<=this.undoLevels.length-1){tinyMCE.nextUndoRedoAction='Redo';inst=this.undoLevels[this.undoIndex++];inst.select();if(!tinyMCE.nextUndoRedoInstanceId)inst.execCommand('Redo')}}else inst.execCommand('Redo');return true;case'mceFocus':inst=tinyMCE.getInstanceById(value);if(inst)inst.getWin().focus();return;case"mceAddControl":case"mceAddEditor":tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case"mceAddFrameControl":tinyMCE.addMCEControl(tinyMCE._getElementById(value.element,value.document),value.element,value.document);return;case"mceRemoveControl":case"mceRemoveEditor":tinyMCE.removeMCEControl(value);return;case"mceToggleEditor":inst=tinyMCE.getInstanceById(value);if(inst){pe=document.getElementById(inst.editorId+'_parent');te=inst.oldTargetElement;if(typeof(inst.enabled)=='undefined')inst.enabled=true;inst.enabled=!inst.enabled;if(!inst.enabled){pe.style.display='none';if(te.nodeName=='TEXTAREA'||te.nodeName=='INPUT')te.value=inst.getHTML();else te.innerHTML=inst.getHTML();te.style.display=inst.oldTargetDisplay;tinyMCE.dispatchCallback(inst,'hide_instance_callback','hideInstance',inst)}else{pe.style.display='block';te.style.display='none';if(te.nodeName=='TEXTAREA'||te.nodeName=='INPUT')inst.setHTML(te.value);else inst.setHTML(te.innerHTML);inst.useCSS=false;tinyMCE.dispatchCallback(inst,'show_instance_callback','showInstance',inst)}}else tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case"mceResetDesignMode":if(tinyMCE.isGecko){for(n in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[n]))continue;try{tinyMCE.instances[n].getDoc().designMode="off";tinyMCE.instances[n].getDoc().designMode="on";tinyMCE.instances[n].useCSS=false}catch(e){}}}return}if(inst){inst.execCommand(command,user_interface,value)}else if(tinyMCE.settings.focus_alert)alert(tinyMCELang.lang_focus_alert)},_createIFrame:function(replace_element,doc,win){var iframe,id=replace_element.getAttribute("id");var aw,ah;if(typeof(doc)=="undefined")doc=document;if(typeof(win)=="undefined")win=window;iframe=doc.createElement("iframe");aw=""+tinyMCE.settings.area_width;ah=""+tinyMCE.settings.area_height;if(aw.indexOf('%')==-1){aw=parseInt(aw);aw=(isNaN(aw)||aw<0)?300:aw;aw=aw+"px"}if(ah.indexOf('%')==-1){ah=parseInt(ah);ah=(isNaN(ah)||ah<0)?240:ah;ah=ah+"px"}iframe.setAttribute("id",id);iframe.setAttribute("name",id);iframe.setAttribute("class","mceEditorIframe");iframe.setAttribute("border","0");iframe.setAttribute("frameBorder","0");iframe.setAttribute("marginWidth","0");iframe.setAttribute("marginHeight","0");iframe.setAttribute("leftMargin","0");iframe.setAttribute("topMargin","0");iframe.setAttribute("width",aw);iframe.setAttribute("height",ah);iframe.setAttribute("allowtransparency","true");iframe.className='mceEditorIframe';if(tinyMCE.settings.auto_resize)iframe.setAttribute("scrolling","no");if(tinyMCE.isRealIE)iframe.setAttribute("src",this.settings.default_document);iframe.style.width=aw;iframe.style.height=ah;if(tinyMCE.settings.strict_loading_mode)iframe.style.marginBottom='-5px';if(tinyMCE.isRealIE)replace_element.outerHTML=iframe.outerHTML;else replace_element.parentNode.replaceChild(iframe,replace_element);if(tinyMCE.isRealIE)return win.frames[id];else return iframe},setupContent:function(editor_id){var inst=tinyMCE.instances[editor_id],i,doc=inst.getDoc(),head=doc.getElementsByTagName('head').item(0);var content=inst.startContent,contentElement,body;if(tinyMCE.settings.strict_loading_mode){content=content.replace(/&lt;/g,'<');content=content.replace(/&gt;/g,'>');content=content.replace(/&quot;/g,'"');content=content.replace(/&amp;/g,'&')}tinyMCE.selectedInstance=inst;inst.switchSettings();if(!tinyMCE.isIE&&tinyMCE.getParam("setupcontent_reload",false)&&doc.title!="blank_page"){try{doc.location.href=tinyMCE.baseURL+"/blank.htm"}catch(ex){}window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",1000);return}if(!head||!doc.body){window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",10);return}tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/themes/"+inst.settings.theme+"/css/editor_content.css");tinyMCE.importCSS(inst.getDoc(),inst.settings.content_css);tinyMCE.dispatchCallback(inst,'init_instance_callback','initInstance',inst);if(tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')){inst.addShortcut('ctrl','z','lang_undo_desc','Undo');inst.addShortcut('ctrl','y','lang_redo_desc','Redo')}for(i=1;i<=6;i++)inst.addShortcut('ctrl',''+i,'','FormatBlock',false,'<h'+i+'>');inst.addShortcut('ctrl','7','','FormatBlock',false,'<p>');inst.addShortcut('ctrl','8','','FormatBlock',false,'<div>');inst.addShortcut('ctrl','9','','FormatBlock',false,'<address>');if(tinyMCE.isGecko){inst.addShortcut('ctrl','b','lang_bold_desc','Bold');inst.addShortcut('ctrl','i','lang_italic_desc','Italic');inst.addShortcut('ctrl','u','lang_underline_desc','Underline')}if(tinyMCE.getParam("convert_fonts_to_spans"))inst.getBody().setAttribute('id','mceSpanFonts');if(tinyMCE.settings.nowrap)doc.body.style.whiteSpace="nowrap";doc.body.dir=this.settings.directionality;doc.editorId=editor_id;if(!tinyMCE.isIE)doc.documentElement.editorId=editor_id;inst.setBaseHREF(tinyMCE.settings.base_href);if(tinyMCE.settings.convert_newlines_to_brs){content=tinyMCE.regexpReplace(content,"\r\n","<br />","gi");content=tinyMCE.regexpReplace(content,"\r","<br />","gi");content=tinyMCE.regexpReplace(content,"\n","<br />","gi")}content=tinyMCE.storeAwayURLs(content);content=tinyMCE._customCleanup(inst,"insert_to_editor",content);if(tinyMCE.isIE){window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["'+editor_id+'"].getDoc(), "'+editor_id+'");}catch(e){}',500);if(tinyMCE.settings.force_br_newlines)doc.styleSheets[0].addRule("p","margin: 0;");body=inst.getBody();body.editorId=editor_id}content=tinyMCE.cleanupHTMLCode(content);if(!tinyMCE.isIE){contentElement=inst.getDoc().createElement("body");doc=inst.getDoc();contentElement.innerHTML=content;if(tinyMCE.settings.cleanup_on_startup)tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,doc,this.settings,contentElement));else tinyMCE.setInnerHTML(inst.getBody(),content);tinyMCE.convertAllRelativeURLs(inst.getBody())}else{if(tinyMCE.settings.cleanup_on_startup){tinyMCE._setHTML(inst.getDoc(),content);try{tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,inst.contentDocument,this.settings,inst.getBody()))}catch(e){}}else tinyMCE._setHTML(inst.getDoc(),content)}tinyMCE.handleVisualAid(inst.getBody(),true,tinyMCE.settings.visual,inst);tinyMCE.dispatchCallback(inst,'setupcontent_callback','setupContent',editor_id,inst.getBody(),inst.getDoc());if(!tinyMCE.isIE)tinyMCE.addEventHandlers(inst);if(tinyMCE.isIE){tinyMCE.addEvent(inst.getBody(),"blur",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(inst.getBody(),"beforedeactivate",TinyMCE_Engine.prototype._eventPatch);if(!tinyMCE.isOpera){tinyMCE.addEvent(doc.body,"mousemove",TinyMCE_Engine.prototype.onMouseMove);tinyMCE.addEvent(doc.body,"beforepaste",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(doc.body,"drop",TinyMCE_Engine.prototype._eventPatch)}}inst.select();tinyMCE.selectedElement=inst.contentWindow.document.body;tinyMCE._customCleanup(inst,"insert_to_editor_dom",inst.getBody());tinyMCE._customCleanup(inst,"setup_content_dom",inst.getBody());tinyMCE._setEventsEnabled(inst.getBody(),false);tinyMCE.cleanupAnchors(inst.getDoc());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(inst.getDoc());inst.startContent=tinyMCE.trim(inst.getBody().innerHTML);inst.undoRedo.add({content:inst.startContent});if(tinyMCE.isGecko){tinyMCE.selectNodes(inst.getBody(),function(n){if(n.nodeType==3||n.nodeType==8)n.nodeValue=n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"','gi'),"");return false})}if(tinyMCE.isGecko)inst.getBody().spellcheck=tinyMCE.getParam("gecko_spellcheck");tinyMCE._removeInternal(inst.getBody());inst.select();tinyMCE.triggerNodeChange(false,true)},storeAwayURLs:function(s){if(!s.match(/(mce_src|mce_href)/gi,s)){s=s.replace(new RegExp('src\\s*=\\s*[\"\']([^ >\"]*)[\"\']','gi'),'src="$1" mce_src="$1"');s=s.replace(new RegExp('href\\s*=\\s*[\"\']([^ >\"]*)[\"\']','gi'),'href="$1" mce_href="$1"')}return s},_removeInternal:function(n){if(tinyMCE.isGecko){tinyMCE.selectNodes(n,function(n){if(n.nodeType==3||n.nodeType==8)n.nodeValue=n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"','gi'),"");return false})}},removeTinyMCEFormElements:function(form_obj){var i,elementId;if(!tinyMCE.getParam('hide_selects_on_submit'))return;if(typeof(form_obj)=="undefined"||form_obj==null)return;if(form_obj.nodeName!="FORM"){if(form_obj.form)form_obj=form_obj.form;else form_obj=tinyMCE.getParentElement(form_obj,"form")}if(form_obj==null)return;for(i=0;i<form_obj.elements.length;i++){elementId=form_obj.elements[i].name?form_obj.elements[i].name:form_obj.elements[i].id;if(elementId.indexOf('mce_editor_')==0)form_obj.elements[i].disabled=true}},handleEvent:function(e){var inst=tinyMCE.selectedInstance,i,elm,keys;if(typeof(tinyMCE)=="undefined")return true;if(tinyMCE.executeCallback(tinyMCE.selectedInstance,'handle_event_callback','handleEvent',e))return false;switch(e.type){case"beforedeactivate":case"blur":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.execCommand('mceEndTyping');tinyMCE.hideMenus();return;case"drop":case"beforepaste":return;case"submit":tinyMCE.formSubmit(tinyMCE.isMSIE?window.event.srcElement:e.target);return;case"reset":var formObj=tinyMCE.isIE?window.event.srcElement:e.target;for(i=0;i<document.forms.length;i++){if(document.forms[i]==formObj)window.setTimeout('tinyMCE.resetForm('+i+');',10)}return;case"keypress":if(inst&&inst.handleShortcut(e))return false;if(e.target.editorId){tinyMCE.instances[e.target.editorId].select()}else{if(e.target.ownerDocument.editorId)tinyMCE.instances[e.target.ownerDocument.editorId].select()}if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();if((tinyMCE.isGecko||tinyMCE.isOpera||tinyMCE.isSafari)&&tinyMCE.settings.force_p_newlines&&e.keyCode==13&&!e.shiftKey){if(TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance,e)){tinyMCE.execCommand("mceAddUndoLevel");return tinyMCE.cancelEvent(e)}}if((tinyMCE.isGecko&&!tinyMCE.isSafari)&&tinyMCE.settings.force_p_newlines&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance,e.type)){tinyMCE.execCommand("mceAddUndoLevel");return tinyMCE.cancelEvent(e)}}if(tinyMCE.isIE&&tinyMCE.settings.force_br_newlines&&e.keyCode==13){if(e.target.editorId)tinyMCE.instances[e.target.editorId].select();if(tinyMCE.selectedInstance){var sel=tinyMCE.selectedInstance.getDoc().selection;var rng=sel.createRange();if(tinyMCE.getParentElement(rng.parentElement(),"li")!=null)return false;e.returnValue=false;e.cancelBubble=true;rng.pasteHTML("<br />");rng.collapse(false);rng.select();tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange(false);return false}}if(e.keyCode==8||e.keyCode==46){tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(e.target,"a");tinyMCE.imgElement=tinyMCE.getParentElement(e.target,"img");tinyMCE.triggerNodeChange(false)}return false;case"keyup":case"keydown":tinyMCE.hideMenus();tinyMCE.hasMouseMoved=false;if(inst&&inst.handleShortcut(e))return false;inst._fixRootBlocks();if(inst.settings.remove_trailing_nbsp)inst._fixTrailingNbsp();if(e.target.editorId)tinyMCE.instances[e.target.editorId].select();if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();inst=tinyMCE.selectedInstance;if(tinyMCE.isGecko&&tinyMCE.settings.force_p_newlines&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance,e.type)){tinyMCE.execCommand("mceAddUndoLevel");e.preventDefault();return false}}tinyMCE.selectedElement=null;tinyMCE.selectedNode=null;elm=tinyMCE.selectedInstance.getFocusElement();tinyMCE.linkElement=tinyMCE.getParentElement(elm,"a");tinyMCE.imgElement=tinyMCE.getParentElement(elm,"img");tinyMCE.selectedElement=elm;if(tinyMCE.isGecko&&e.type=="keyup"&&e.keyCode==9)tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(),true,tinyMCE.settings.visual,tinyMCE.selectedInstance);if(tinyMCE.isIE&&e.type=="keydown"&&e.keyCode==13)tinyMCE.enterKeyElement=tinyMCE.selectedInstance.getFocusElement();if(tinyMCE.isIE&&e.type=="keyup"&&e.keyCode==13){elm=tinyMCE.enterKeyElement;if(elm){var re=new RegExp('^HR|IMG|BR$','g');var dre=new RegExp('^H[1-6]$','g');if(!elm.hasChildNodes()&&!re.test(elm.nodeName)){if(dre.test(elm.nodeName))elm.innerHTML="&nbsp;&nbsp;";else elm.innerHTML="&nbsp;"}}}keys=tinyMCE.posKeyCodes;var posKey=false;for(i=0;i<keys.length;i++){if(keys[i]==e.keyCode){posKey=true;break}}if(tinyMCE.isIE&&tinyMCE.settings.custom_undo_redo){keys=[8,46];for(i=0;i<keys.length;i++){if(keys[i]==e.keyCode){if(e.type=="keyup")tinyMCE.triggerNodeChange(false)}}}if(e.keyCode==17)return true;if(tinyMCE.isGecko){if(!posKey&&e.type=="keyup"&&!e.ctrlKey||(e.ctrlKey&&(e.keyCode==86||e.keyCode==88)))tinyMCE.execCommand("mceStartTyping")}else{if(!posKey&&e.type=="keyup")tinyMCE.execCommand("mceStartTyping")}if(e.type=="keydown"&&(posKey||e.ctrlKey)&&inst)inst.undoBookmark=inst.selection.getBookmark();if(e.type=="keyup"&&(posKey||e.ctrlKey))tinyMCE.execCommand("mceEndTyping");if(posKey&&e.type=="keyup")tinyMCE.triggerNodeChange(false);if(tinyMCE.isIE&&e.ctrlKey)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);break;case"mousedown":case"mouseup":case"click":case"dblclick":case"focus":tinyMCE.hideMenus();if(tinyMCE.selectedInstance){tinyMCE.selectedInstance.switchSettings();tinyMCE.selectedInstance.isFocused=true}var targetBody=tinyMCE.getParentElement(e.target,"html");for(var instanceName in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[instanceName]))continue;inst=tinyMCE.instances[instanceName];inst.autoResetDesignMode();if(inst.getBody().parentNode==targetBody){inst.select();tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");tinyMCE.imgElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"img");break}}if(!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark&&(e.type=="mouseup"||e.type=="dblclick"))tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark=tinyMCE.selectedInstance.selection.getBookmark();if(e.type!="focus")tinyMCE.selectedNode=null;tinyMCE.triggerNodeChange(false);tinyMCE.execCommand("mceEndTyping");if(e.type=="mouseup")tinyMCE.execCommand("mceAddUndoLevel");if(!tinyMCE.selectedInstance&&e.target.editorId)tinyMCE.instances[e.target.editorId].select();return false}},getButtonHTML:function(id,lang,img,cmd,ui,val){var h='',m,x,io='';cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+cmd+'\'';if(typeof(ui)!="undefined"&&ui!=null)cmd+=','+ui;if(typeof(val)!="undefined"&&val!=null)cmd+=",'"+val+"'";cmd+=');';if(tinyMCE.isRealIE)io='onmouseover="tinyMCE.lastHover = this;"';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isIE||tinyMCE.isOpera)&&(m=this.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" '+io+' class="mceTiledButton mceButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="background-position: '+x+'px 0" alt="{$'+lang+'}" title="{$'+lang+'}" />';h+='</a>'}else{h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" '+io+' class="mceButtonNormal" target="_self">';h+='<img src="'+img+'" alt="{$'+lang+'}" title="{$'+lang+'}" />';h+='</a>'}return h},getMenuButtonHTML:function(id,lang,img,mcmd,cmd,ui,val){var h='',m,x;mcmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+mcmd+'\');';cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+cmd+'\'';if(typeof(ui)!="undefined"&&ui!=null)cmd+=','+ui;if(typeof(val)!="undefined"&&val!=null)cmd+=",'"+val+"'";cmd+=');';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isIE||tinyMCE.isOpera)&&(m=tinyMCE.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);if(tinyMCE.isRealIE)h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';else h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton">';h+='<a href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceTiledButton mceMenuButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="width: 20px; height: 20px; background-position: '+x+'px 0" title="{$'+lang+'}" /></a>';h+='<a href="javascript:'+mcmd+'" onclick="'+mcmd+'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" />';h+='</a></span>'}else{if(tinyMCE.isRealIE)h+='<span id="{$editor_id}_'+id+'" dir="ltr" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';else h+='<span id="{$editor_id}_'+id+'" dir="ltr" class="mceMenuButton">';h+='<a href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';h+='<img src="'+img+'" title="{$'+lang+'}" /></a>';h+='<a href="javascript:'+mcmd+'" onclick="'+mcmd+'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" />';h+='</a></span>'}return h},_menuButtonEvent:function(e,o){if(o.className=='mceMenuButtonFocus')return;if(e=='over')o.className=o.className+' mceMenuHover';else o.className=o.className.replace(/\s.*$/,'')},addButtonMap:function(m){var i,a=m.replace(/\s+/,'').split(',');for(i=0;i<a.length;i++)this.buttonMap[a[i]]=i},formSubmit:function(f,p){var n,inst,found=false;if(f.form)f=f.form;if(tinyMCE.getParam('save_on_tinymce_forms')){for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.formElement){if(f==inst.formElement.form){found=true;inst.isNotDirty=true}}}}else found=true;if(found){tinyMCE.removeTinyMCEFormElements(f);tinyMCE.triggerSave()}if(f.mceOldSubmit&&p)f.mceOldSubmit()},submitPatch:function(){tinyMCE.formSubmit(this,true)},onLoad:function(){var r,i,c,mode,trigger,elements,element,settings,elementId,elm;var selector,deselector,elementRefAr,form;if(tinyMCE.settings.strict_loading_mode&&this.loadingIndex!=-1){window.setTimeout('tinyMCE.onLoad();',1);return}if(tinyMCE.isRealIE&&window.event.type=="readystatechange"&&document.readyState!="complete")return true;if(tinyMCE.isLoaded)return true;tinyMCE.isLoaded=true;if(tinyMCE.isRealIE&&document.body&&window.location.href!=window.top.location.href){r=document.body.createTextRange();r.collapse(true);r.select()}tinyMCE.dispatchCallback(null,'onpageload','onPageLoad');for(c=0;c<tinyMCE.configs.length;c++){tinyMCE.settings=tinyMCE.configs[c];selector=tinyMCE.getParam("editor_selector");deselector=tinyMCE.getParam("editor_deselector");elementRefAr=[];if(document.forms&&tinyMCE.settings.add_form_submit_trigger&&!tinyMCE.submitTriggers){for(i=0;i<document.forms.length;i++){form=document.forms[i];tinyMCE.addEvent(form,"submit",TinyMCE_Engine.prototype.handleEvent);tinyMCE.addEvent(form,"reset",TinyMCE_Engine.prototype.handleEvent);tinyMCE.submitTriggers=true;if(tinyMCE.settings.submit_patch){try{form.mceOldSubmit=form.submit;form.submit=TinyMCE_Engine.prototype.submitPatch}catch(e){}}}}mode=tinyMCE.settings.mode;switch(mode){case"exact":elements=tinyMCE.getParam('elements','',true,',');for(i=0;i<elements.length;i++){element=tinyMCE._getElementById(elements[i]);trigger=element?element.getAttribute(tinyMCE.settings.textarea_trigger):"";if(new RegExp('\\b'+deselector+'\\b').test(tinyMCE.getAttrib(element,"class")))continue;if(trigger=="false")continue;if((tinyMCE.settings.ask||tinyMCE.settings.convert_on_click)&&element){elementRefAr[elementRefAr.length]=element;continue}if(element)tinyMCE.addMCEControl(element,elements[i])}break;case"specific_textareas":case"textareas":elements=document.getElementsByTagName("textarea");for(i=0;i<elements.length;i++){elm=elements.item(i);trigger=elm.getAttribute(tinyMCE.settings.textarea_trigger);if(selector!==''&&!new RegExp('\\b'+selector+'\\b').test(tinyMCE.getAttrib(elm,"class")))continue;if(selector!=='')trigger=selector!==''?"true":"";if(new RegExp('\\b'+deselector+'\\b').test(tinyMCE.getAttrib(elm,"class")))continue;if((mode=="specific_textareas"&&trigger=="true")||(mode=="textareas"&&trigger!="false"))elementRefAr[elementRefAr.length]=elm}break}for(i=0;i<elementRefAr.length;i++){element=elementRefAr[i];elementId=element.name?element.name:element.id;if(tinyMCE.settings.ask||tinyMCE.settings.convert_on_click){if(tinyMCE.isGecko){settings=tinyMCE.settings;tinyMCE.addEvent(element,"focus",function(e){window.setTimeout(function(){TinyMCE_Engine.prototype.confirmAdd(e,settings)},10)});if(element.nodeName!="TEXTAREA"&&element.nodeName!="INPUT")tinyMCE.addEvent(element,"click",function(e){window.setTimeout(function(){TinyMCE_Engine.prototype.confirmAdd(e,settings)},10)});}else{settings=tinyMCE.settings;tinyMCE.addEvent(element,"focus",function(){TinyMCE_Engine.prototype.confirmAdd(null,settings)});tinyMCE.addEvent(element,"click",function(){TinyMCE_Engine.prototype.confirmAdd(null,settings)});}}else tinyMCE.addMCEControl(element,elementId)}if(tinyMCE.settings.auto_focus){window.setTimeout(function(){var inst=tinyMCE.getInstanceById(tinyMCE.settings.auto_focus);inst.selection.selectNode(inst.getBody(),true,true);inst.contentWindow.focus()},100)}tinyMCE.dispatchCallback(null,'oninit','onInit')}},isInstance:function(o){return o!=null&&typeof(o)=="object"&&o.isTinyMCE_Control},getParam:function(name,default_value,strip_whitespace,split_chr){var i,outArray,value=(typeof(this.settings[name])=="undefined")?default_value:this.settings[name];if(value=="true"||value=="false")return(value=="true");if(strip_whitespace)value=tinyMCE.regexpReplace(value,"[ \t\r\n]","");if(typeof(split_chr)!="undefined"&&split_chr!=null){value=value.split(split_chr);outArray=[];for(i=0;i<value.length;i++){if(value[i]&&value[i]!=='')outArray[outArray.length]=value[i]}value=outArray}return value},getLang:function(name,default_value,parse_entities,va){var v=(typeof(tinyMCELang[name])=="undefined")?default_value:tinyMCELang[name],n;if(parse_entities)v=tinyMCE.entityDecode(v);if(va){for(n in va)v=this.replaceVar(v,n,va[n])}return v},entityDecode:function(s){var e=document.createElement("div");e.innerHTML=s;return!e.firstChild?s:e.firstChild.nodeValue},addToLang:function(prefix,ar){var k;for(k in ar){if(typeof(ar[k])=='function')continue;tinyMCELang[(k.indexOf('lang_')==-1?'lang_':'')+(prefix!==''?(prefix+"_"):'')+k]=ar[k]}this.loadNextScript()},triggerNodeChange:function(focus,setup_content){var elm,inst,editorId,undoIndex=-1,undoLevels=-1,doc,anySelection,st;if(tinyMCE.selectedInstance){inst=tinyMCE.selectedInstance;elm=(typeof(setup_content)!="undefined"&&setup_content)?tinyMCE.selectedElement:inst.getFocusElement();editorId=inst.editorId;st=inst.selection.getSelectedText();if(tinyMCE.settings.auto_resize)inst.resizeToContent();if(setup_content&&tinyMCE.isGecko&&inst.isHidden())elm=inst.getBody();inst.switchSettings();anySelection=!inst.selection.isCollapsed();if(tinyMCE.settings.custom_undo_redo){undoIndex=inst.undoRedo.undoIndex;undoLevels=inst.undoRedo.undoLevels.length}tinyMCE.dispatchCallback(inst,'handle_node_change_callback','handleNodeChange',editorId,elm,undoIndex,undoLevels,inst.visualAid,anySelection,setup_content)}if(this.selectedInstance&&(typeof(focus)=="undefined"||focus))this.selectedInstance.contentWindow.focus()},_customCleanup:function(inst,type,content){var pl,po,i,customCleanup;customCleanup=tinyMCE.settings.cleanup_callback;if(customCleanup!='')content=tinyMCE.resolveDots(tinyMCE.settings.cleanup_callback,window)(type,content,inst);po=tinyMCE.themes[tinyMCE.settings.theme];if(po&&po.cleanup)content=po.cleanup(type,content,inst);pl=inst.plugins;for(i=0;i<pl.length;i++){po=tinyMCE.plugins[pl[i]];if(po&&po.cleanup)content=po.cleanup(type,content,inst)}return content},setContent:function(h){if(tinyMCE.selectedInstance){tinyMCE.selectedInstance.execCommand('mceSetContent',false,h);tinyMCE.selectedInstance.repaint()}},importThemeLanguagePack:function(name){if(typeof(name)=="undefined")name=tinyMCE.settings.theme;tinyMCE.loadScript(tinyMCE.baseURL+'/themes/'+name+'/langs/'+tinyMCE.settings.language+'.js')},importPluginLanguagePack:function(name){var b=tinyMCE.baseURL+'/plugins/'+name;if(this.plugins[name])b=this.plugins[name].baseURL;tinyMCE.loadScript(b+'/langs/'+tinyMCE.settings.language+'.js')},applyTemplate:function(h,ag){return h.replace(new RegExp('\\{\\$([a-z0-9_]+)\\}','gi'),function(m,s){if(s.indexOf('lang_')==0&&tinyMCELang[s])return tinyMCELang[s];if(ag&&ag[s])return ag[s];if(tinyMCE.settings[s])return tinyMCE.settings[s];if(m=='themeurl')return tinyMCE.themeURL;return m})},replaceVar:function(h,r,v){return h.replace(new RegExp('{\\\$'+r+'}','g'),v)},openWindow:function(template,args){var html,width,height,x,y,resizable,scrollbars,url,name,win,modal,features;args=!args?{}:args;args.mce_template_file=template.file;args.mce_width=template.width;args.mce_height=template.height;tinyMCE.windowArgs=args;html=template.html;if(!(width=parseInt(template.width)))width=320;if(!(height=parseInt(template.height)))height=200;if(tinyMCE.isIE)height+=40;else height+=20;x=parseInt(screen.width/ 2.0) - (width /2.0);y=parseInt(screen.height/ 2.0) - (height /2.0);resizable=(args&&args.resizable)?args.resizable:"no";scrollbars=(args&&args.scrollbars)?args.scrollbars:"no";if(template.file.charAt(0)!='/'&&template.file.indexOf('://')==-1)url=tinyMCE.baseURL+"/themes/"+tinyMCE.getParam("theme")+"/"+template.file;else url=template.file;for(name in args){if(typeof(args[name])=='function')continue;url=tinyMCE.replaceVar(url,name,escape(args[name]))}if(html){html=tinyMCE.replaceVar(html,"css",this.settings.popups_css);html=tinyMCE.applyTemplate(html,args);win=window.open("","mcePopup"+new Date().getTime(),"top="+y+",left="+x+",scrollbars="+scrollbars+",dialog=yes,minimizable="+resizable+",modal=yes,width="+width+",height="+height+",resizable="+resizable);if(win==null){alert(tinyMCELang.lang_popup_blocked);return}win.document.write(html);win.document.close();win.resizeTo(width,height);win.focus()}else{if((tinyMCE.isRealIE)&&resizable!='yes'&&tinyMCE.settings.dialog_type=="modal"){height+=10;features="resizable:"+resizable+";scroll:"+scrollbars+";status:yes;center:yes;help:no;dialogWidth:"+width+"px;dialogHeight:"+height+"px;";window.showModalDialog(url,window,features)}else{modal=(resizable=="yes")?"no":"yes";if(tinyMCE.isGecko&&tinyMCE.isMac)modal="no";if(template.close_previous!="no")try{tinyMCE.lastWindow.close()}catch(ex){}win=window.open(url,"mcePopup"+new Date().getTime(),"top="+y+",left="+x+",scrollbars="+scrollbars+",dialog="+modal+",minimizable="+resizable+",modal="+modal+",width="+width+",height="+height+",resizable="+resizable);if(win==null){alert(tinyMCELang.lang_popup_blocked);return}if(template.close_previous!="no")tinyMCE.lastWindow=win;try{win.resizeTo(width,height)}catch(e){}if(tinyMCE.isGecko&&win.document){if(win.document.defaultView.statusbar.visible)win.resizeBy(0,tinyMCE.isMac?10:24)}win.focus()}}},closeWindow:function(win){win.close()},getVisualAidClass:function(class_name,state){var i,classNames,ar,className,aidClass=tinyMCE.settings.visual_table_class;if(typeof(state)=="undefined")state=tinyMCE.settings.visual;classNames=[];ar=class_name.split(' ');for(i=0;i<ar.length;i++){if(ar[i]==aidClass)ar[i]="";if(ar[i]!=='')classNames[classNames.length]=ar[i]}if(state)classNames[classNames.length]=aidClass;className="";for(i=0;i<classNames.length;i++){if(i>0)className+=" ";className+=classNames[i]}return className},handleVisualAid:function(el,deep,state,inst,skip_dispatch){var i,x,y,tableElement,anchorName,oldW,oldH,bo,cn;if(!el)return;if(!skip_dispatch)tinyMCE.dispatchCallback(inst,'handle_visual_aid_callback','handleVisualAid',el,deep,state,inst);tableElement=null;switch(el.nodeName){case"TABLE":oldW=el.style.width;oldH=el.style.height;bo=tinyMCE.getAttrib(el,"border");bo=bo==''||bo=="0"?true:false;tinyMCE.setAttrib(el,"class",tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el,"class"),state&&bo));el.style.width=oldW;el.style.height=oldH;for(y=0;y<el.rows.length;y++){for(x=0;x<el.rows[y].cells.length;x++){cn=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x],"class"),state&&bo);tinyMCE.setAttrib(el.rows[y].cells[x],"class",cn)}}break;case"A":anchorName=tinyMCE.getAttrib(el,"name");if(anchorName!==''&&state){el.title=anchorName;tinyMCE.addCSSClass(el,'mceItemAnchor')}else if(anchorName!==''&&!state)el.className='';break}if(deep&&el.hasChildNodes()){for(i=0;i<el.childNodes.length;i++)tinyMCE.handleVisualAid(el.childNodes[i],deep,state,inst,true)}},fixGeckoBaseHREFBug:function(m,e,h){var xsrc,xhref;if(tinyMCE.isGecko){if(m==1){h=h.replace(/\ssrc=/gi," mce_tsrc=");h=h.replace(/\shref=/gi," mce_thref=");return h}else{if(!new RegExp('(src|href)=','g').test(h))return h;tinyMCE.selectElements(e,'A,IMG,SELECT,AREA,IFRAME,BASE,INPUT,SCRIPT,EMBED,OBJECT,LINK',function(n){xsrc=tinyMCE.getAttrib(n,"mce_tsrc");xhref=tinyMCE.getAttrib(n,"mce_thref");if(xsrc!==''){try{n.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,xsrc)}catch(e){}n.removeAttribute("mce_tsrc")}if(xhref!==''){try{n.href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,xhref)}catch(e){}n.removeAttribute("mce_thref")}return false});tinyMCE.selectNodes(e,function(n){if(n.nodeType==3||n.nodeType==8){n.nodeValue=n.nodeValue.replace(/\smce_tsrc=/gi," src=");n.nodeValue=n.nodeValue.replace(/\smce_thref=/gi," href=")}return false})}}return h},_setHTML:function(doc,html_content){var i,html,paras,node;html_content=tinyMCE.cleanupHTMLCode(html_content);try{tinyMCE.setInnerHTML(doc.body,html_content)}catch(e){if(this.isMSIE)doc.body.createTextRange().pasteHTML(html_content)}if(tinyMCE.isIE&&tinyMCE.settings.fix_content_duplication){paras=doc.getElementsByTagName("P");for(i=0;i<paras.length;i++){node=paras[i];while((node=node.parentNode)!=null){if(node.nodeName=="P")node.outerHTML=node.innerHTML}}html=doc.body.innerHTML;tinyMCE.setInnerHTML(doc.body,html)}tinyMCE.cleanupAnchors(doc);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc)},getEditorId:function(form_element){var inst=this.getInstanceById(form_element);if(!inst)return null;return inst.editorId},getInstanceById:function(editor_id){var inst=this.instances[editor_id],n;if(!inst){for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.formTargetElementId==editor_id)return inst}}else return inst;return null},queryInstanceCommandValue:function(editor_id,command){var inst=tinyMCE.getInstanceById(editor_id);if(inst)return inst.queryCommandValue(command);return false},queryInstanceCommandState:function(editor_id,command){var inst=tinyMCE.getInstanceById(editor_id);if(inst)return inst.queryCommandState(command);return null},setWindowArg:function(n,v){this.windowArgs[n]=v},getWindowArg:function(n,d){return(typeof(this.windowArgs[n])=="undefined")?d:this.windowArgs[n]},getCSSClasses:function(editor_id,doc){var i,c,x,rule,styles,rules,csses,selectorText,inst=tinyMCE.getInstanceById(editor_id);var cssClass,addClass,p;if(!inst)inst=tinyMCE.selectedInstance;if(!inst)return[];if(!doc)doc=inst.getDoc();if(inst&&inst.cssClasses.length>0)return inst.cssClasses;if(!doc)return;styles=doc.styleSheets;if(styles&&styles.length>0){for(x=0;x<styles.length;x++){csses=null;try{csses=tinyMCE.isIE?doc.styleSheets(x).rules:styles[x].cssRules}catch(e){}if(!csses)return[];for(i=0;i<csses.length;i++){selectorText=csses[i].selectorText;if(selectorText){rules=selectorText.split(',');for(c=0;c<rules.length;c++){rule=rules[c];while(rule.indexOf(' ')==0)rule=rule.substring(1);if(rule.indexOf(' ')!=-1||rule.indexOf(':')!=-1||rule.indexOf('mceItem')!=-1)continue;if(rule.indexOf(tinyMCE.settings.visual_table_class)!=-1||rule.indexOf('mceEditable')!=-1||rule.indexOf('mceNonEditable')!=-1)continue;if(rule.indexOf('.')!=-1){cssClass=rule.substring(rule.indexOf('.')+1);addClass=true;for(p=0;p<inst.cssClasses.length&&addClass;p++){if(inst.cssClasses[p]==cssClass)addClass=false}if(addClass)inst.cssClasses[inst.cssClasses.length]=cssClass}}}}}}return inst.cssClasses},regexpReplace:function(in_str,reg_exp,replace_str,opts){var re;if(in_str==null)return in_str;if(typeof(opts)=="undefined")opts='g';re=new RegExp(reg_exp,opts);return in_str.replace(re,replace_str)},trim:function(s){return s.replace(/^\s*|\s*$/g,"")},cleanupEventStr:function(s){s=""+s;s=s.replace('function anonymous()\n{\n','');s=s.replace('\n}','');s=s.replace(/^return true;/gi,'');return s},getControlHTML:function(c){var i,l,n,o,v,rtl=tinyMCE.getLang('lang_dir')=='rtl';l=tinyMCE.plugins;for(n in l){o=l[n];if(o.getControlHTML&&(v=o.getControlHTML(c))!==''){if(rtl)return'<span dir="rtl">'+tinyMCE.replaceVar(v,"pluginurl",o.baseURL)+'</span>';return tinyMCE.replaceVar(v,"pluginurl",o.baseURL)}}o=tinyMCE.themes[tinyMCE.settings.theme];if(o.getControlHTML&&(v=o.getControlHTML(c))!==''){if(rtl)return'<span dir="rtl">'+v+'</span>';return v}return''},evalFunc:function(f,idx,a,o){o=!o?window:o;f=typeof(f)=='function'?f:o[f];return f.apply(o,Array.prototype.slice.call(a,idx))},dispatchCallback:function(i,p,n){return this.callFunc(i,p,n,0,this.dispatchCallback.arguments)},executeCallback:function(i,p,n){return this.callFunc(i,p,n,1,this.executeCallback.arguments)},execCommandCallback:function(i,p,n){return this.callFunc(i,p,n,2,this.execCommandCallback.arguments)},callFunc:function(ins,p,n,m,a){var l,i,on,o,s,v;s=m==2;l=tinyMCE.getParam(p,'');if(l!==''&&(v=tinyMCE.evalFunc(l,3,a))==s&&m>0)return true;if(ins!=null){for(i=0,l=ins.plugins;i<l.length;i++){o=tinyMCE.plugins[l[i]];if(o[n]&&(v=tinyMCE.evalFunc(n,3,a,o))==s&&m>0)return true}}l=tinyMCE.themes;for(on in l){o=l[on];if(o[n]&&(v=tinyMCE.evalFunc(n,3,a,o))==s&&m>0)return true}return false},resolveDots:function(s,o){var i;if(typeof(s)=='string'){for(i=0,s=s.split('.');i<s.length;i++)o=o[s[i]]}else o=s;return o},xmlEncode:function(s){return s?(''+s).replace(this.xmlEncodeRe,function(c,b){switch(c){case'&':return'&amp;';case'"':return'&quot;';case'<':return'&lt;';case'>':return'&gt;'}return c}):s},add:function(c,m){var n;for(n in m){if(m.hasOwnProperty(n))c.prototype[n]=m[n]}},extend:function(p,np){var o={},n;o.parent=p;for(n in p){if(p.hasOwnProperty(n))o[n]=p[n]}for(n in np){if(np.hasOwnProperty(n))o[n]=np[n]}return o},hideMenus:function(){var e=tinyMCE.lastSelectedMenuBtn;if(tinyMCE.lastMenu){tinyMCE.lastMenu.hide();tinyMCE.lastMenu=null}if(e){tinyMCE.switchClass(e,tinyMCE.lastMenuBtnClass);tinyMCE.lastSelectedMenuBtn=null}}};var TinyMCE=TinyMCE_Engine;var tinyMCE=new TinyMCE_Engine();var tinyMCELang={};function TinyMCE_Control(settings){var t,i,tos,fu,p,x,fn,fu,pn,s=settings;this.undoRedoLevel=true;this.isTinyMCE_Control=true;this.enabled=true;this.settings=s;this.settings.theme=tinyMCE.getParam("theme","default");this.settings.width=tinyMCE.getParam("width",-1);this.settings.height=tinyMCE.getParam("height",-1);this.selection=new TinyMCE_Selection(this);this.undoRedo=new TinyMCE_UndoRedo(this);this.cleanup=new TinyMCE_Cleanup();this.shortcuts=[];this.hasMouseMoved=false;this.foreColor=this.backColor="#999999";this.data={};this.cssClasses=[];this.cleanup.init({valid_elements:s.valid_elements,extended_valid_elements:s.extended_valid_elements,valid_child_elements:s.valid_child_elements,entities:s.entities,entity_encoding:s.entity_encoding,debug:s.cleanup_debug,indent:s.apply_source_formatting,invalid_elements:s.invalid_elements,verify_html:s.verify_html,fix_content_duplication:s.fix_content_duplication,convert_fonts_to_spans:s.convert_fonts_to_spans});t=this.settings.theme;if(!tinyMCE.hasTheme(t)){fn=tinyMCE.callbacks;tos={};for(i=0;i<fn.length;i++){if((fu=window['TinyMCE_'+t+"_"+fn[i]]))tos[fn[i]]=fu}tinyMCE.addTheme(t,tos)}this.plugins=[];p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(i=0;i<p.length;i++){pn=p[i];if(pn.charAt(0)=='-')pn=pn.substring(1);if(!tinyMCE.hasPlugin(pn)){fn=tinyMCE.callbacks;tos={};for(x=0;x<fn.length;x++){if((fu=window['TinyMCE_'+pn+"_"+fn[x]]))tos[fn[x]]=fu}tinyMCE.addPlugin(pn,tos)}this.plugins[this.plugins.length]=pn}}};TinyMCE_Control.prototype={selection:null,settings:null,cleanup:null,getData:function(na){var o=this.data[na];if(!o)o=this.data[na]={};return o},hasPlugin:function(n){var i;for(i=0;i<this.plugins.length;i++){if(this.plugins[i]==n)return true}return false},addPlugin:function(n,p){if(!this.hasPlugin(n)){tinyMCE.addPlugin(n,p);this.plugins[this.plugins.length]=n}},repaint:function(){var s,b,ex;if(tinyMCE.isRealIE)return;try{s=this.selection;b=s.getBookmark(true);this.getBody().style.display='none';this.getDoc().execCommand('selectall',false,null);this.getSel().collapseToStart();this.getBody().style.display='block';s.moveToBookmark(b)}catch(ex){}},switchSettings:function(){if(tinyMCE.configs.length>1&&tinyMCE.currentConfig!=this.settings.index){tinyMCE.settings=this.settings;tinyMCE.currentConfig=this.settings.index}},select:function(){var oldInst=tinyMCE.selectedInstance;if(oldInst!=this){if(oldInst)oldInst.execCommand('mceEndTyping');tinyMCE.dispatchCallback(this,'select_instance_callback','selectInstance',this,oldInst);tinyMCE.selectedInstance=this}},getBody:function(){return this.contentBody?this.contentBody:this.getDoc().body},getDoc:function(){return this.contentWindow.document},getWin:function(){return this.contentWindow},getContainerWin:function(){return this.containerWindow?this.containerWindow:window},getViewPort:function(){return tinyMCE.getViewPort(this.getWin())},getParentNode:function(n,f){return tinyMCE.getParentNode(n,f,this.getBody())},getParentElement:function(n,na,f){return tinyMCE.getParentElement(n,na,f,this.getBody())},getParentBlockElement:function(n){return tinyMCE.getParentBlockElement(n,this.getBody())},resizeToContent:function(){var d=this.getDoc(),b=d.body,de=d.documentElement;this.iframeElement.style.height=(tinyMCE.isRealIE)?b.scrollHeight:de.offsetHeight+'px'},addShortcut:function(m,k,d,cmd,ui,va){var n=typeof(k)=="number",ie=tinyMCE.isIE,c,sc,i,scl=this.shortcuts;if(!tinyMCE.getParam('custom_shortcuts'))return false;m=m.toLowerCase();k=ie&&!n?k.toUpperCase():k;c=n?null:k.charCodeAt(0);d=d&&d.indexOf('lang_')==0?tinyMCE.getLang(d):d;sc={alt:m.indexOf('alt')!=-1,ctrl:m.indexOf('ctrl')!=-1,shift:m.indexOf('shift')!=-1,charCode:c,keyCode:n?k:(ie?c:null),desc:d,cmd:cmd,ui:ui,val:va};for(i=0;i<scl.length;i++){if(sc.alt==scl[i].alt&&sc.ctrl==scl[i].ctrl&&sc.shift==scl[i].shift&&sc.charCode==scl[i].charCode&&sc.keyCode==scl[i].keyCode){return false}}scl[scl.length]=sc;return true},handleShortcut:function(e){var i,s,o;if(!e.altKey&&!e.ctrlKey)return false;s=this.shortcuts;for(i=0;i<s.length;i++){o=s[i];if(o.alt==e.altKey&&o.ctrl==e.ctrlKey&&(o.keyCode==e.keyCode||o.charCode==e.charCode)){if(o.cmd&&(e.type=="keydown"||(e.type=="keypress"&&!tinyMCE.isOpera)))tinyMCE.execCommand(o.cmd,o.ui,o.val);tinyMCE.cancelEvent(e);return true}}return false},autoResetDesignMode:function(){if(!tinyMCE.isIE&&this.isHidden()&&tinyMCE.getParam('auto_reset_designmode'))eval('try { this.getDoc().designMode = "On"; this.useCSS = false; } catch(e) {}')},isHidden:function(){var s;if(tinyMCE.isIE)return false;s=this.getSel();return(!s||!s.rangeCount||s.rangeCount==0)},isDirty:function(){return tinyMCE.trim(this.startContent)!=tinyMCE.trim(this.getBody().innerHTML)&&!this.isNotDirty},_mergeElements:function(scmd,pa,ch,override){var st,stc,className,n;if(scmd=="removeformat"){pa.className="";pa.style.cssText="";ch.className="";ch.style.cssText="";return}st=tinyMCE.parseStyle(tinyMCE.getAttrib(pa,"style"));stc=tinyMCE.parseStyle(tinyMCE.getAttrib(ch,"style"));className=tinyMCE.getAttrib(pa,"class");className=tinyMCE.getAttrib(ch,"class");if(override){for(n in st){if(typeof(st[n])=='function')continue;stc[n]=st[n]}}else{for(n in stc){if(typeof(stc[n])=='function')continue;st[n]=stc[n]}}tinyMCE.setAttrib(pa,"style",tinyMCE.serializeStyle(st));tinyMCE.setAttrib(pa,"class",tinyMCE.trim(className));ch.className="";ch.style.cssText="";ch.removeAttribute("class");ch.removeAttribute("style")},_fixRootBlocks:function(){var rb,b,ne,be,nx,bm;rb=tinyMCE.getParam('forced_root_block');if(!rb)return;b=this.getBody();ne=b.firstChild;while(ne){nx=ne.nextSibling;if((ne.nodeType==3&&ne.nodeValue.replace(/\s+/g,'')!='')||(ne.nodeType==1&&!tinyMCE.blockRegExp.test(ne.nodeName))){if(!bm)bm=this.selection.getBookmark();if(!be){be=this.getDoc().createElement(rb);be.appendChild(ne.cloneNode(true));b.replaceChild(be,ne)}else{be.appendChild(ne.cloneNode(true));b.removeChild(ne)}}else be=null;ne=nx}if(bm)this.selection.moveToBookmark(bm)},_fixTrailingNbsp:function(){var s=this.selection,e=s.getFocusElement(),bm,v;if(e&&tinyMCE.blockRegExp.test(e.nodeName)&&e.firstChild){v=e.firstChild.nodeValue;if(v&&v.length>1&&/(^\u00a0|\u00a0$)/.test(v)){e.firstChild.nodeValue=v.replace(/(^\u00a0|\u00a0$)/,'');s.selectNode(e.firstChild,true,false,false);}}},_setUseCSS:function(b){var d=this.getDoc();try{d.execCommand("useCSS",false,!b)}catch(ex){}try{d.execCommand("styleWithCSS",false,b)}catch(ex){}if(!tinyMCE.getParam("table_inline_editing"))try{d.execCommand('enableInlineTableEditing',false,"false")}catch(ex){}if(!tinyMCE.getParam("object_resizing"))try{d.execCommand('enableObjectResizing',false,"false")}catch(ex){}},execCommand:function(command,user_interface,value){var i,x,z,align,img,div,doc=this.getDoc(),win=this.getWin(),focusElm=this.getFocusElement();if(!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel','gi').test(command))this.undoBookmark=null;if(!tinyMCE.isIE&&!this.useCSS){this._setUseCSS(false);this.useCSS=true}this.contentDocument=doc;if(!/mceStartTyping|mceEndTyping/.test(command)){if(tinyMCE.execCommandCallback(this,'execcommand_callback','execCommand',this.editorId,this.getBody(),command,user_interface,value))return}if(focusElm&&focusElm.nodeName=="IMG"){align=focusElm.getAttribute('align');img=command=="JustifyCenter"?focusElm.cloneNode(false):focusElm;switch(command){case"JustifyLeft":if(align=='left'){img.setAttribute('align','');img.removeAttribute('align')}else img.setAttribute('align','left');div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case"JustifyCenter":img.setAttribute('align','');img.removeAttribute('align');div=tinyMCE.getParentElement(focusElm,"div");if(div&&div.style.textAlign=="center"){if(div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div)}else{div=this.getDoc().createElement("div");div.style.textAlign='center';div.appendChild(img);focusElm.parentNode.replaceChild(div,focusElm)}this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case"JustifyRight":if(align=='right'){img.setAttribute('align','');img.removeAttribute('align')}else img.setAttribute('align','right');div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return}}if(tinyMCE.settings.force_br_newlines){var alignValue="";if(doc.selection.type!="Control"){switch(command){case"JustifyLeft":alignValue="left";break;case"JustifyCenter":alignValue="center";break;case"JustifyFull":alignValue="justify";break;case"JustifyRight":alignValue="right";break}if(alignValue!==''){var rng=doc.selection.createRange();if((divElm=tinyMCE.getParentElement(rng.parentElement(),"div"))!=null)divElm.setAttribute("align",alignValue);else if(rng.pasteHTML&&rng.htmlText.length>0)rng.pasteHTML('<div align="'+alignValue+'">'+rng.htmlText+"</div>");tinyMCE.triggerNodeChange();return}}}switch(command){case"mceRepaint":this.repaint();return true;case"JustifyLeft":case"JustifyCenter":case"JustifyFull":case"JustifyRight":var el=tinyMCE.getParentNode(focusElm,function(n){return tinyMCE.getAttrib(n,'align')});if(el){el.setAttribute('align','');el.removeAttribute('align')}else this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();return true;case"unlink":if(tinyMCE.isGecko&&this.getSel().isCollapsed){focusElm=tinyMCE.getParentElement(focusElm,'A');if(focusElm)this.selection.selectNode(focusElm,false)}this.getDoc().execCommand(command,user_interface,value);tinyMCE.isGecko&&this.getSel().collapseToEnd();tinyMCE.triggerNodeChange();return true;case"InsertUnorderedList":case"InsertOrderedList":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"Strikethrough":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"mceSelectNode":this.selection.selectNode(value);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=value;break;case"FormatBlock":if(value==null||value==''){var elm=tinyMCE.getParentElement(this.getFocusElement(),"p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");if(elm)this.execCommand("mceRemoveNode",false,elm)}else{if(!this.cleanup.isValid(value))return true;if(tinyMCE.isGecko&&new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>','gi').test(value))value=value.replace(/[^a-z]/gi,'');if(tinyMCE.isIE&&new RegExp('blockquote|code|samp','gi').test(value)){var b=this.selection.getBookmark();this.getDoc().execCommand("FormatBlock",false,'<p>');tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()),value);this.selection.moveToBookmark(b)}else this.getDoc().execCommand("FormatBlock",false,value)}tinyMCE.triggerNodeChange();break;case"mceRemoveNode":if(!value)value=tinyMCE.getParentElement(this.getFocusElement());if(tinyMCE.isIE){value.outerHTML=value.innerHTML}else{var rng=value.ownerDocument.createRange();rng.setStartBefore(value);rng.setEndAfter(value);rng.deleteContents();rng.insertNode(rng.createContextualFragment(value.innerHTML))}tinyMCE.triggerNodeChange();break;case"mceSelectNodeDepth":var parentNode=this.getFocusElement();for(i=0;parentNode;i++){if(parentNode.nodeName.toLowerCase()=="body")break;if(parentNode.nodeName.toLowerCase()=="#text"){i--;parentNode=parentNode.parentNode;continue}if(i==value){this.selection.selectNode(parentNode,false);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=parentNode;return}parentNode=parentNode.parentNode}break;case"mceSetStyleInfo":case"SetStyleInfo":var rng=this.getRng();var sel=this.getSel();var scmd=value.command;var sname=value.name;var svalue=value.value==null?'':value.value;var wrapper=value.wrapper?value.wrapper:"span";var parentElm=null;var invalidRe=new RegExp("^BODY|HTML$","g");var invalidParentsRe=tinyMCE.settings.merge_styles_invalid_parents!==''?new RegExp(tinyMCE.settings.merge_styles_invalid_parents,"gi"):null;if(tinyMCE.isIE){if(rng.item)parentElm=rng.item(0);else{var pelm=rng.parentElement();var prng=doc.selection.createRange();prng.moveToElementText(pelm);if(rng.htmlText==prng.htmlText||rng.boundingWidth==0){if(invalidParentsRe==null||!invalidParentsRe.test(pelm.nodeName))parentElm=pelm}}}else{var felm=this.getFocusElement();if(sel.isCollapsed||(new RegExp('td|tr|tbody|table|img','gi').test(felm.nodeName)&&sel.anchorNode==felm.parentNode))parentElm=felm}if(parentElm&&!invalidRe.test(parentElm.nodeName)){if(scmd=="setstyle")tinyMCE.setStyleAttrib(parentElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(parentElm,sname,svalue);if(scmd=="removeformat"){parentElm.style.cssText='';tinyMCE.setAttrib(parentElm,'class','')}var ch=tinyMCE.getNodeTree(parentElm,[],1);for(z=0;z<ch.length;z++){if(ch[z]==parentElm)continue;if(scmd=="setstyle")tinyMCE.setStyleAttrib(ch[z],sname,'');if(scmd=="setattrib")tinyMCE.setAttrib(ch[z],sname,'');if(scmd=="removeformat"){ch[z].style.cssText='';tinyMCE.setAttrib(ch[z],'class','')}}}else{this._setUseCSS(false);doc.execCommand("FontName",false,"#mce_temp_font#");var elementArray=tinyMCE.getElementsByAttributeValue(this.getBody(),"font","face","#mce_temp_font#");for(x=0;x<elementArray.length;x++){elm=elementArray[x];if(elm){var spanElm=doc.createElement(wrapper);if(scmd=="setstyle")tinyMCE.setStyleAttrib(spanElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(spanElm,sname,svalue);if(scmd=="removeformat"){spanElm.style.cssText='';tinyMCE.setAttrib(spanElm,'class','')}if(elm.hasChildNodes()){for(i=0;i<elm.childNodes.length;i++)spanElm.appendChild(elm.childNodes[i].cloneNode(true))}spanElm.setAttribute("mce_new","true");elm.parentNode.replaceChild(spanElm,elm);var ch=tinyMCE.getNodeTree(spanElm,[],1);for(z=0;z<ch.length;z++){if(ch[z]==spanElm)continue;if(scmd=="setstyle")tinyMCE.setStyleAttrib(ch[z],sname,'');if(scmd=="setattrib")tinyMCE.setAttrib(ch[z],sname,'');if(scmd=="removeformat"){ch[z].style.cssText='';tinyMCE.setAttrib(ch[z],'class','')}}}}}var nodes=doc.getElementsByTagName(wrapper);for(i=nodes.length-1;i>=0;i--){var elm=nodes[i];var isNew=tinyMCE.getAttrib(elm,"mce_new")=="true";elm.removeAttribute("mce_new");if(elm.childNodes&&elm.childNodes.length==1&&elm.childNodes[0].nodeType==1){this._mergeElements(scmd,elm,elm.childNodes[0],isNew);continue}if(elm.parentNode.childNodes.length==1&&!invalidRe.test(elm.nodeName)&&!invalidRe.test(elm.parentNode.nodeName)){if(invalidParentsRe==null||!invalidParentsRe.test(elm.parentNode.nodeName))this._mergeElements(scmd,elm.parentNode,elm,false)}}var nodes=doc.getElementsByTagName(wrapper);for(i=nodes.length-1;i>=0;i--){var elm=nodes[i],isEmpty=true;var tmp=doc.createElement("body");tmp.appendChild(elm.cloneNode(false));tmp.innerHTML=tmp.innerHTML.replace(new RegExp('style=""|class=""','gi'),'');if(new RegExp('<span>','gi').test(tmp.innerHTML)){for(x=0;x<elm.childNodes.length;x++){if(elm.parentNode!=null)elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true),elm)}elm.parentNode.removeChild(elm)}}if(scmd=="removeformat")tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE.triggerNodeChange();break;case"FontName":if(value==null){var s=this.getSel();if(tinyMCE.isGecko&&s.isCollapsed){var f=tinyMCE.getParentElement(this.getFocusElement(),"font");if(f!=null)this.selection.selectNode(f,false)}this.getDoc().execCommand("RemoveFormat",false,null);if(f!=null&&tinyMCE.isGecko){var r=this.getRng().cloneRange();r.collapse(true);s.removeAllRanges();s.addRange(r)}}else this.getDoc().execCommand('FontName',false,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);return;case"FontSize":this.getDoc().execCommand('FontSize',false,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);return;case"forecolor":value=value==null?this.foreColor:value;value=tinyMCE.trim(value);value=value.charAt(0)!='#'?(isNaN('0x'+value)?value:'#'+value):value;this.foreColor=value;this.getDoc().execCommand('forecolor',false,value);break;case"HiliteColor":value=value==null?this.backColor:value;value=tinyMCE.trim(value);value=value.charAt(0)!='#'?(isNaN('0x'+value)?value:'#'+value):value;this.backColor=value;if(tinyMCE.isGecko||tinyMCE.isOpera){this._setUseCSS(true);this.getDoc().execCommand('hilitecolor',false,value);this._setUseCSS(false)}else this.getDoc().execCommand('BackColor',false,value);break;case"Cut":case"Copy":case"Paste":var cmdFailed=false;eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');if(tinyMCE.isOpera&&cmdFailed)alert('Currently not supported by your browser, use keyboard shortcuts instead.');if(tinyMCE.isGecko&&cmdFailed){if(confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_clipboard_msg'))))window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');return}else tinyMCE.triggerNodeChange();break;case"mceSetContent":if(!value)value="";value=tinyMCE.storeAwayURLs(value);value=tinyMCE._customCleanup(this,"insert_to_editor",value);if(this.getBody().nodeName=='BODY')tinyMCE._setHTML(doc,value);else this.getBody().innerHTML=value;tinyMCE.setInnerHTML(this.getBody(),tinyMCE._cleanupHTML(this,doc,this.settings,this.getBody(),false,false,false,true));tinyMCE.convertAllRelativeURLs(this.getBody());tinyMCE._removeInternal(this.getBody());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE._setEventsEnabled(this.getBody(),false);this._addBogusBR();return true;case"mceCleanup":var b=this.selection.getBookmark();tinyMCE._setHTML(this.contentDocument,this.getBody().innerHTML);tinyMCE.setInnerHTML(this.getBody(),tinyMCE._cleanupHTML(this,this.contentDocument,this.settings,this.getBody(),this.visualAid));tinyMCE.convertAllRelativeURLs(doc.body);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE._setEventsEnabled(this.getBody(),false);this._addBogusBR();this.repaint();this.selection.moveToBookmark(b);tinyMCE.triggerNodeChange();break;case"mceReplaceContent":if(!value)value='';this.getWin().focus();var selectedText="";if(tinyMCE.isIE){var rng=doc.selection.createRange();selectedText=rng.text}else selectedText=this.getSel().toString();if(selectedText.length>0){value=tinyMCE.replaceVar(value,"selection",selectedText);tinyMCE.execCommand('mceInsertContent',false,value)}this._addBogusBR();tinyMCE.triggerNodeChange();break;case"mceSetAttribute":if(typeof(value)=='object'){var targetElms=(typeof(value.targets)=="undefined")?"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address":value.targets;var targetNode=tinyMCE.getParentElement(this.getFocusElement(),targetElms);if(targetNode){targetNode.setAttribute(value.name,value.value);tinyMCE.triggerNodeChange()}}break;case"mceSetCSSClass":this.execCommand("mceSetStyleInfo",false,{command:"setattrib",name:"class",value:value});break;case"mceInsertRawHTML":var key='tiny_mce_marker';this.execCommand('mceBeginUndoLevel');this.execCommand('mceInsertContent',false,key);var scrollX=this.getBody().scrollLeft+this.getDoc().documentElement.scrollLeft;var scrollY=this.getBody().scrollTop+this.getDoc().documentElement.scrollTop;var html=this.getBody().innerHTML;if((pos=html.indexOf(key))!=-1)tinyMCE.setInnerHTML(this.getBody(),html.substring(0,pos)+value+html.substring(pos+key.length));this.contentWindow.scrollTo(scrollX,scrollY);this.execCommand('mceEndUndoLevel');break;case"mceInsertContent":if(!value)value='';var insertHTMLFailed=false;if(tinyMCE.isGecko||tinyMCE.isOpera){try{if(value.indexOf('<')==-1&&!value.match(/(&#38;|&#160;|&#60;|&#62;)/g)){var r=this.getRng();var n=this.getDoc().createTextNode(tinyMCE.entityDecode(value));var s=this.getSel();var r2=r.cloneRange();s.removeAllRanges();r.deleteContents();r.insertNode(n);r2.selectNode(n);r2.collapse(false);s.removeAllRanges();s.addRange(r2)}else{value=tinyMCE.fixGeckoBaseHREFBug(1,this.getDoc(),value);this.getDoc().execCommand('inserthtml',false,value);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value)}}catch(ex){insertHTMLFailed=true}if(!insertHTMLFailed){tinyMCE.triggerNodeChange();return}}if(!tinyMCE.isIE){var isHTML=value.indexOf('<')!=-1;var sel=this.getSel();var rng=this.getRng();if(isHTML){if(tinyMCE.isSafari){var tmpRng=this.getDoc().createRange();tmpRng.setStart(this.getBody(),0);tmpRng.setEnd(this.getBody(),0);value=tmpRng.createContextualFragment(value)}else value=rng.createContextualFragment(value)}else{value=doc.createTextNode(tinyMCE.entityDecode(value))}if(tinyMCE.isSafari&&!isHTML){this.execCommand('InsertText',false,value.nodeValue);tinyMCE.triggerNodeChange();return true}else if(tinyMCE.isSafari&&isHTML){rng.deleteContents();rng.insertNode(value);tinyMCE.triggerNodeChange();return true}rng.deleteContents();if(rng.startContainer.nodeType==3){var node=rng.startContainer.splitText(rng.startOffset);node.parentNode.insertBefore(value,node)}else rng.insertNode(value);if(!isHTML){sel.selectAllChildren(doc.body);sel.removeAllRanges();var rng=doc.createRange();rng.selectNode(value);rng.collapse(false);sel.addRange(rng)}else rng.collapse(false);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value)}else{var rng=doc.selection.createRange(),tmpRng=null;var c=value.indexOf('<!--')!=-1;if(c)value=tinyMCE.uniqueTag+value;if(rng.item)rng.item(0).outerHTML=value;else rng.pasteHTML(value);if(c){var e=this.getDoc().getElementById('mceTMPElement');e.parentNode.removeChild(e)}}tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange();break;case"mceStartTyping":if(tinyMCE.settings.custom_undo_redo&&this.undoRedo.typingUndoIndex==-1){this.undoRedo.typingUndoIndex=this.undoRedo.undoIndex;tinyMCE.typingUndoIndex=tinyMCE.undoIndex;this.execCommand('mceAddUndoLevel')}break;case"mceEndTyping":if(tinyMCE.settings.custom_undo_redo&&this.undoRedo.typingUndoIndex!=-1){this.execCommand('mceAddUndoLevel');this.undoRedo.typingUndoIndex=-1}tinyMCE.typingUndoIndex=-1;break;case"mceBeginUndoLevel":this.undoRedoLevel=false;break;case"mceEndUndoLevel":this.undoRedoLevel=true;this.execCommand('mceAddUndoLevel');break;case"mceAddUndoLevel":if(tinyMCE.settings.custom_undo_redo&&this.undoRedoLevel){if(this.undoRedo.add())tinyMCE.triggerNodeChange(false)}break;case"Undo":if(tinyMCE.settings.custom_undo_redo){tinyMCE.execCommand("mceEndTyping");this.undoRedo.undo();tinyMCE.triggerNodeChange()}else this.getDoc().execCommand(command,user_interface,value);break;case"Redo":if(tinyMCE.settings.custom_undo_redo){tinyMCE.execCommand("mceEndTyping");this.undoRedo.redo();tinyMCE.triggerNodeChange()}else this.getDoc().execCommand(command,user_interface,value);break;case"mceToggleVisualAid":this.visualAid=!this.visualAid;tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE.triggerNodeChange();break;case"Indent":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();if(tinyMCE.isIE){var n=tinyMCE.getParentElement(this.getFocusElement(),"blockquote");do{if(n&&n.nodeName=="BLOCKQUOTE"){n.removeAttribute("dir");n.removeAttribute("style")}}while(n!=null&&(n=n.parentNode)!=null)}break;case"RemoveFormat":case"removeformat":var text=this.selection.getSelectedText();if(tinyMCE.isOpera){this.getDoc().execCommand("RemoveFormat",false,null);return}if(tinyMCE.isIE){try{var rng=doc.selection.createRange();rng.execCommand("RemoveFormat",false,null)}catch(e){}this.execCommand("mceSetStyleInfo",false,{command:"removeformat"})}else{this.getDoc().execCommand(command,user_interface,value);this.execCommand("mceSetStyleInfo",false,{command:"removeformat"})}if(text.length==0)this.execCommand("mceSetCSSClass",false,"");tinyMCE.triggerNodeChange();break;default:this.getDoc().execCommand(command,user_interface,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);else tinyMCE.triggerNodeChange()}if(command!="mceAddUndoLevel"&&command!="Undo"&&command!="Redo"&&command!="mceStartTyping"&&command!="mceEndTyping")tinyMCE.execCommand("mceAddUndoLevel")},queryCommandValue:function(c){try{return this.getDoc().queryCommandValue(c)}catch(e){return null}},queryCommandState:function(c){return this.getDoc().queryCommandState(c)},_addBogusBR:function(){var b=this.getBody();if(tinyMCE.isGecko&&!b.hasChildNodes())b.innerHTML='<br _moz_editor_bogus_node="TRUE" />'},_onAdd:function(replace_element,form_element_name,target_document){var hc,th,tos,editorTemplate,targetDoc,deltaWidth,deltaHeight,html,rng,fragment;var dynamicIFrame,tElm,doc,parentElm;th=this.settings.theme;tos=tinyMCE.themes[th];targetDoc=target_document?target_document:document;this.targetDoc=targetDoc;tinyMCE.themeURL=tinyMCE.baseURL+"/themes/"+this.settings.theme;this.settings.themeurl=tinyMCE.themeURL;if(!replace_element){alert("Error: Could not find the target element.");return false}if(tos.getEditorTemplate)editorTemplate=tos.getEditorTemplate(this.settings,this.editorId);deltaWidth=editorTemplate.delta_width?editorTemplate.delta_width:0;deltaHeight=editorTemplate.delta_height?editorTemplate.delta_height:0;html='<span id="'+this.editorId+'_parent" class="mceEditorContainer">'+editorTemplate.html;html=tinyMCE.replaceVar(html,"editor_id",this.editorId);if(!this.settings.default_document)this.settings.default_document=tinyMCE.baseURL+"/blank.htm";this.settings.old_width=this.settings.width;this.settings.old_height=this.settings.height;if(this.settings.width==-1)this.settings.width=replace_element.offsetWidth;if(this.settings.height==-1)this.settings.height=replace_element.offsetHeight;if(this.settings.width==0)this.settings.width=replace_element.style.width;if(this.settings.height==0)this.settings.height=replace_element.style.height;if(this.settings.width==0)this.settings.width=320;if(this.settings.height==0)this.settings.height=240;this.settings.area_width=parseInt(this.settings.width);this.settings.area_height=parseInt(this.settings.height);this.settings.area_width+=deltaWidth;this.settings.area_height+=deltaHeight;this.settings.width_style=""+this.settings.width;this.settings.height_style=""+this.settings.height;if((""+this.settings.width).indexOf('%')!=-1)this.settings.area_width="100%";else this.settings.width_style+='px';if((""+this.settings.height).indexOf('%')!=-1)this.settings.area_height="100%";else this.settings.height_style+='px';if((""+replace_element.style.width).indexOf('%')!=-1){this.settings.width=replace_element.style.width;this.settings.area_width="100%";this.settings.width_style="100%"}if((""+replace_element.style.height).indexOf('%')!=-1){this.settings.height=replace_element.style.height;this.settings.area_height="100%";this.settings.height_style="100%"}html=tinyMCE.applyTemplate(html);this.settings.width=this.settings.old_width;this.settings.height=this.settings.old_height;this.visualAid=this.settings.visual;this.formTargetElementId=form_element_name;if(replace_element.nodeName=="TEXTAREA"||replace_element.nodeName=="INPUT")this.startContent=replace_element.value;else this.startContent=replace_element.innerHTML;if(replace_element.nodeName!="TEXTAREA"&&replace_element.nodeName!="INPUT"){this.oldTargetElement=replace_element;hc='<input type="hidden" id="'+form_element_name+'" name="'+form_element_name+'" />';this.oldTargetDisplay=tinyMCE.getStyle(this.oldTargetElement,'display','inline');this.oldTargetElement.style.display="none";html+='</span>';if(tinyMCE.isGecko)html=hc+html;else html+=hc;if(tinyMCE.isGecko){rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);fragment=rng.createContextualFragment(html);tinyMCE.insertAfter(fragment,replace_element)}else replace_element.insertAdjacentHTML("beforeBegin",html)}else{html+='</span>';this.oldTargetElement=replace_element;this.oldTargetDisplay=tinyMCE.getStyle(this.oldTargetElement,'display','inline');this.oldTargetElement.style.display="none";if(tinyMCE.isGecko){rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);fragment=rng.createContextualFragment(html);tinyMCE.insertAfter(fragment,replace_element)}else replace_element.insertAdjacentHTML("beforeBegin",html)}dynamicIFrame=false;tElm=targetDoc.getElementById(this.editorId);if(!tinyMCE.isIE){if(tElm&&(tElm.nodeName=="SPAN"||tElm.nodeName=="span")){tElm=tinyMCE._createIFrame(tElm,targetDoc);dynamicIFrame=true}this.targetElement=tElm;this.iframeElement=tElm;this.contentDocument=tElm.contentDocument;this.contentWindow=tElm.contentWindow;}else{if(tElm&&tElm.nodeName=="SPAN")tElm=tinyMCE._createIFrame(tElm,targetDoc,targetDoc.parentWindow);else tElm=targetDoc.frames[this.editorId];this.targetElement=tElm;this.iframeElement=targetDoc.getElementById(this.editorId);if(tinyMCE.isOpera){this.contentDocument=this.iframeElement.contentDocument;this.contentWindow=this.iframeElement.contentWindow;dynamicIFrame=true}else{this.contentDocument=tElm.window.document;this.contentWindow=tElm.window}this.getDoc().designMode="on"}doc=this.contentDocument;if(dynamicIFrame){html=tinyMCE.getParam('doctype')+'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'+tinyMCE.settings.base_href+'" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';try{if(!this.isHidden())this.getDoc().designMode="on";doc.open();doc.write(html);doc.close()}catch(e){this.getDoc().location.href=tinyMCE.baseURL+"/blank.htm"}}if(tinyMCE.isIE)window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\""+this.editorId+"\"]);",1);parentElm=this.targetDoc.getElementById(this.editorId+'_parent');this.formElement=tinyMCE.isGecko?parentElm.previousSibling:parentElm.nextSibling;tinyMCE.setupContent(this.editorId,true);return true},setBaseHREF:function(u){var h,b,d,nl;d=this.getDoc();nl=d.getElementsByTagName("base");b=nl.length>0?nl[0]:null;if(!b){nl=d.getElementsByTagName("head");h=nl.length>0?nl[0]:null;b=d.createElement("base");b.setAttribute('href',u);h.appendChild(b)}else{if(u==''||u==null)b.parentNode.removeChild(b);else b.setAttribute('href',u)}},getHTML:function(r){var h,d=this.getDoc(),b=this.getBody();if(r)return b.innerHTML;h=tinyMCE._cleanupHTML(this,d,this.settings,b,false,true,false,true);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(d);return h},setHTML:function(h){this.execCommand('mceSetContent',false,h);this.repaint()},getFocusElement:function(){return this.selection.getFocusElement()},getSel:function(){return this.selection.getSel()},getRng:function(){return this.selection.getRng()},triggerSave:function(skip_cleanup,skip_callback){var e,nl=[],i,s,content,htm;if(!this.enabled)return;this.switchSettings();s=tinyMCE.settings;if(tinyMCE.isRealIE){e=this.iframeElement;do{if(e.style&&e.style.display=='none'){e.style.display='block';nl[nl.length]={elm:e,type:'style'}}if(e.style&&s.hidden_tab_class.length>0&&e.className.indexOf(s.hidden_tab_class)!=-1){e.className=s.display_tab_class;nl[nl.length]={elm:e,type:'class'}}}while((e=e.parentNode)!=null)}tinyMCE.settings.preformatted=false;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;tinyMCE._setHTML(this.getDoc(),this.getBody().innerHTML);if(this.settings.cleanup==false){tinyMCE.handleVisualAid(this.getBody(),true,false,this);tinyMCE._setEventsEnabled(this.getBody(),true)}tinyMCE._customCleanup(this,"submit_content_dom",this.contentWindow.document.body);htm=skip_cleanup?this.getBody().innerHTML:tinyMCE._cleanupHTML(this,this.getDoc(),this.settings,this.getBody(),tinyMCE.visualAid,true,true);htm=tinyMCE._customCleanup(this,"submit_content",htm);if(!skip_callback&&tinyMCE.settings.save_callback!=='')content=tinyMCE.resolveDots(tinyMCE.settings.save_callback,window)(this.formTargetElementId,htm,this.getBody());if((typeof(content)!="undefined")&&content!=null)htm=content;htm=tinyMCE.regexpReplace(htm,"&#40;","(","gi");htm=tinyMCE.regexpReplace(htm,"&#41;",")","gi");htm=tinyMCE.regexpReplace(htm,"&#59;",";","gi");htm=tinyMCE.regexpReplace(htm,"&#34;","&quot;","gi");htm=tinyMCE.regexpReplace(htm,"&#94;","^","gi");if(this.formElement)this.formElement.value=htm;if(tinyMCE.isSafari&&this.formElement)this.formElement.innerText=htm;for(i=0;i<nl.length;i++){if(nl[i].type=='style')nl[i].elm.style.display='none';else nl[i].elm.className=s.hidden_tab_class}}};tinyMCE.add(TinyMCE_Engine,{cleanupHTMLCode:function(s){s=s.replace(new RegExp('<p \\/>','gi'),'<p>&nbsp;</p>');s=s.replace(new RegExp('<p>\\s*<\\/p>','gi'),'<p>&nbsp;</p>');s=s.replace(new RegExp('<br>\\s*<\\/br>','gi'),'<br />');s=s.replace(new RegExp('<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>','gi'),'<$1$2$3></$1$2>');s=s.replace(new RegExp('\\s+></','gi'),'></');s=s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>','gi'),'<$1$2 />');if(tinyMCE.isIE)s=s.replace(new RegExp('<p><hr \\/><\\/p>','gi'),"<hr>");if(tinyMCE.isIE)s=s.replace(/<!(\s*)\/>/g,'');return s},parseStyle:function(str){var ar=[],st,i,re,pa;if(str==null)return ar;st=str.split(';');tinyMCE.clearArray(ar);for(i=0;i<st.length;i++){if(st[i]=='')continue;re=new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');pa=st[i].replace(re,'$1||$2').split('||');if(pa.length==2)ar[pa[0].toLowerCase()]=pa[1]}return ar},compressStyle:function(ar,pr,sf,res){var box=[],i,a;box[0]=ar[pr+'-top'+sf];box[1]=ar[pr+'-left'+sf];box[2]=ar[pr+'-right'+sf];box[3]=ar[pr+'-bottom'+sf];for(i=0;i<box.length;i++){if(box[i]==null)return;if(i&&box[i]!=box[i-1])return}ar[res]=box[0];ar[pr+'-top'+sf]=null;ar[pr+'-left'+sf]=null;ar[pr+'-right'+sf]=null;ar[pr+'-bottom'+sf]=null},serializeStyle:function(ar){var str="",key,val,m;tinyMCE.compressStyle(ar,"border","","border");tinyMCE.compressStyle(ar,"border","-width","border-width");tinyMCE.compressStyle(ar,"border","-color","border-color");tinyMCE.compressStyle(ar,"border","-style","border-style");tinyMCE.compressStyle(ar,"padding","","padding");tinyMCE.compressStyle(ar,"margin","","margin");for(key in ar){val=ar[key];if(typeof(val)=='function')continue;if(key.indexOf('mso-')==0)continue;if(val!=null&&val!==''){val=''+val;val=val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)",'gi'),"url('$1')");if(val.indexOf('url(')!=-1&&tinyMCE.getParam('convert_urls')){m=new RegExp("url\\('(.*?)'\\)").exec(val);if(m.length>1)val="url('"+eval(tinyMCE.getParam('urlconverter_callback')+"(m[1], null, true);")+"')"}if(tinyMCE.getParam("force_hex_style_colors"))val=tinyMCE.convertRGBToHex(val,true);val=val.replace(/\"/g,'\'');if(val!="url('')")str+=key.toLowerCase()+": "+val+"; "}}if(new RegExp('; $').test(str))str=str.substring(0,str.length-2);return str},convertRGBToHex:function(s,k){var re,rgb;if(s.toLowerCase().indexOf('rgb')!=-1){re=new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)","gi");rgb=s.replace(re,"$1,$2,$3,$4,$5").split(',');if(rgb.length==5){r=parseInt(rgb[1]).toString(16);g=parseInt(rgb[2]).toString(16);b=parseInt(rgb[3]).toString(16);r=r.length==1?'0'+r:r;g=g.length==1?'0'+g:g;b=b.length==1?'0'+b:b;s="#"+r+g+b;if(k)s=rgb[0]+s+rgb[4]}}return s},convertHexToRGB:function(s){if(s.indexOf('#')!=-1){s=s.replace(new RegExp('[^0-9A-F]','gi'),'');return"rgb("+parseInt(s.substring(0,2),16)+","+parseInt(s.substring(2,4),16)+","+parseInt(s.substring(4,6),16)+")"}return s},convertSpansToFonts:function(doc){var s,i,size,fSize,x,fFace,fColor,sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');s=tinyMCE.selectElements(doc,'span,font');for(i=0;i<s.length;i++){size=tinyMCE.trim(s[i].style.fontSize).toLowerCase();fSize=0;for(x=0;x<sizes.length;x++){if(sizes[x]==size){fSize=x+1;break}}if(fSize>0){tinyMCE.setAttrib(s[i],'size',fSize);s[i].style.fontSize=''}fFace=s[i].style.fontFamily;if(fFace!=null&&fFace!==''){tinyMCE.setAttrib(s[i],'face',fFace);s[i].style.fontFamily=''}fColor=s[i].style.color;if(fColor!=null&&fColor!==''){tinyMCE.setAttrib(s[i],'color',tinyMCE.convertRGBToHex(fColor));s[i].style.color=''}}},convertFontsToSpans:function(doc){var fsClasses,s,i,fSize,fFace,fColor,sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');fsClasses=tinyMCE.getParam('font_size_classes');if(fsClasses!=='')fsClasses=fsClasses.replace(/\s+/,'').split(',');else fsClasses=null;s=tinyMCE.selectElements(doc,'span,font');for(i=0;i<s.length;i++){fSize=tinyMCE.getAttrib(s[i],'size');fFace=tinyMCE.getAttrib(s[i],'face');fColor=tinyMCE.getAttrib(s[i],'color');if(fSize!==''){fSize=parseInt(fSize);if(fSize>0&&fSize<8){if(fsClasses!=null)tinyMCE.setAttrib(s[i],'class',fsClasses[fSize-1]);else s[i].style.fontSize=sizes[fSize-1]}s[i].removeAttribute('size')}if(fFace!==''){s[i].style.fontFamily=fFace;s[i].removeAttribute('face')}if(fColor!==''){s[i].style.color=fColor;s[i].removeAttribute('color')}}},cleanupAnchors:function(doc){var i,cn,x,an=doc.getElementsByTagName("a");for(i=an.length-1;i>=0;i--){if(tinyMCE.getAttrib(an[i],"name")!==''&&tinyMCE.getAttrib(an[i],"href")==''){cn=an[i].childNodes;for(x=cn.length-1;x>=0;x--)tinyMCE.insertAfter(cn[x],an[i])}}},getContent:function(editor_id){if(typeof(editor_id)!="undefined")tinyMCE.getInstanceById(editor_id).select();if(tinyMCE.selectedInstance)return tinyMCE.selectedInstance.getHTML();return null},_fixListElements:function(d){var nl,x,a=['ol','ul'],i,n,p,r=new RegExp('^(OL|UL)$'),np;for(x=0;x<a.length;x++){nl=d.getElementsByTagName(a[x]);for(i=0;i<nl.length;i++){n=nl[i];p=n.parentNode;if(r.test(p.nodeName)){np=tinyMCE.prevNode(n,'LI');if(!np){np=d.createElement('li');np.innerHTML='&nbsp;';np.appendChild(n);p.insertBefore(np,p.firstChild)}else np.appendChild(n)}}}},_fixTables:function(d){var nl,i,n,p,np,x,t;nl=d.getElementsByTagName('table');for(i=0;i<nl.length;i++){n=nl[i];if((p=tinyMCE.getParentElement(n,'p,h1,h2,h3,h4,h5,h6'))!=null){np=p.cloneNode(false);np.removeAttribute('id');t=n;while((n=n.nextSibling))np.appendChild(n);tinyMCE.insertAfter(np,p);tinyMCE.insertAfter(t,p)}}},_cleanupHTML:function(inst,doc,config,elm,visual,on_save,on_submit,inn){var h,d,t1,t2,t3,t4,t5,c,s,nb;if(!tinyMCE.getParam('cleanup'))return elm.innerHTML;on_save=typeof(on_save)=='undefined'?false:on_save;c=inst.cleanup;s=inst.settings;d=c.settings.debug;if(d)t1=new Date().getTime();inst._fixRootBlocks();if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertFontsToSpans(doc);if(tinyMCE.getParam("fix_list_elements"))tinyMCE._fixListElements(doc);if(tinyMCE.getParam("fix_table_elements"))tinyMCE._fixTables(doc);tinyMCE._customCleanup(inst,on_save?"get_from_editor_dom":"insert_to_editor_dom",doc.body);if(d)t2=new Date().getTime();c.settings.on_save=on_save;c.idCount=0;c.serializationId++;c.serializedNodes=[];c.sourceIndex=-1;if(s.cleanup_serializer=="xml")h=c.serializeNodeAsXML(elm,inn);else h=c.serializeNodeAsHTML(elm,inn);if(d)t3=new Date().getTime();nb=tinyMCE.getParam('entity_encoding')=='numeric'?'&#160;':'&nbsp;';h=h.replace(/<\/?(body|head|html)[^>]*>/gi,'');h=h.replace(new RegExp(' (rowspan="1"|colspan="1")','g'),'');h=h.replace(/<p><hr \/><\/p>/g,'<hr />');h=h.replace(/<p>(&nbsp;|&#160;)<\/p><hr \/><p>(&nbsp;|&#160;)<\/p>/g,'<hr />');h=h.replace(/<td>\s*<br \/>\s*<\/td>/g,'<td>'+nb+'</td>');h=h.replace(/<p>\s*<br \/>\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<br \/>$/,'');h=h.replace(/<br \/><\/p>/g,'</p>');h=h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(new RegExp('<a>(.*?)<\\/a>','g'),'$1');h=h.replace(/<p([^>]*)>\s*<\/p>/g,'<p$1>'+nb+'</p>');if(/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))h='';if(s.preformatted){h=h.replace(/^<pre>/,'');h=h.replace(/<\/pre>$/,'');h='<pre>'+h+'</pre>'}if(tinyMCE.isGecko){h=h.replace(/<br \/>\s*<\/li>/g,'</li>');h=h.replace(/&nbsp;\s*<\/(dd|dt)>/g,'</$1>');h=h.replace(/<o:p _moz-userdefined="" \/>/g,'');h=h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g,'<td$1>'+nb+'</td>')}if(s.force_br_newlines)h=h.replace(/<p>(&nbsp;|&#160;)<\/p>/g,'<br />');h=tinyMCE._customCleanup(inst,on_save?"get_from_editor":"insert_to_editor",h);if(on_save){h=h.replace(new RegExp(' ?(mceItem[a-zA-Z0-9]*|'+s.visual_table_class+')','g'),'');h=h.replace(new RegExp(' ?class=""','g'),'')}if(s.remove_linebreaks&&!c.settings.indent)h=h.replace(/\n|\r/g,' ');if(d)t4=new Date().getTime();if(on_save&&c.settings.indent)h=c.formatHTML(h);if(on_submit&&(s.encoding=="xml"||s.encoding=="html"))h=c.xmlEncode(h);if(d)t5=new Date().getTime();if(c.settings.debug)tinyMCE.debug("Cleanup in ms: Pre="+(t2-t1)+", Serialize: "+(t3-t2)+", Post: "+(t4-t3)+", Format: "+(t5-t4)+", Sum: "+(t5-t1)+".");return h}});function TinyMCE_Cleanup(){this.isIE=(navigator.appName=="Microsoft Internet Explorer");this.rules=tinyMCE.clearArray([]);this.settings={indent_elements:'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object',newline_before_elements:'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td',newline_after_elements:'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script',newline_before_after_elements:'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div',indent_char:'\t',indent_levels:1,entity_encoding:'raw',valid_elements:'*[*]',entities:'',url_converter:'',invalid_elements:'',verify_html:false};this.vElements=tinyMCE.clearArray([]);this.vElementsRe='';this.closeElementsRe=/^(IMG|BR|HR|LINK|META|BASE|INPUT|AREA)$/;this.codeElementsRe=/^(SCRIPT|STYLE)$/;this.serializationId=0;this.mceAttribs={href:'mce_href',src:'mce_src',type:'mce_type'}}TinyMCE_Cleanup.prototype={init:function(s){var n,a,i,ir,or,st;for(n in s)this.settings[n]=s[n];s=this.settings;this.inRe=this._arrayToRe(s.indent_elements.split(','),'','^<(',')[^>]*');this.ouRe=this._arrayToRe(s.indent_elements.split(','),'','^<\\/(',')[^>]*');this.nlBeforeRe=this._arrayToRe(s.newline_before_elements.split(','),'gi','<(',')([^>]*)>');this.nlAfterRe=this._arrayToRe(s.newline_after_elements.split(','),'gi','<(',')([^>]*)>');this.nlBeforeAfterRe=this._arrayToRe(s.newline_before_after_elements.split(','),'gi','<(\\/?)(',')([^>]*)>');this.serializedNodes=[];this.serializationId=0;if(s.invalid_elements!=='')this.iveRe=this._arrayToRe(s.invalid_elements.toUpperCase().split(','),'g','^(',')$');else this.iveRe=null;st='';for(i=0;i<s.indent_levels;i++)st+=s.indent_char;this.inStr=st;if(!s.verify_html){s.valid_elements='*[*]';s.extended_valid_elements=''}this.fillStr=s.entity_encoding=="named"?"&nbsp;":"&#160;";this.idCount=0;this.xmlEncodeRe=new RegExp('[\u007F-\uFFFF<>&"]','g')},addRuleStr:function(s){var r=this.parseRuleStr(s),n;for(n in r){if(r[n])this.rules[n]=r[n]}this.vElements=tinyMCE.clearArray([]);for(n in this.rules){if(this.rules[n])this.vElements[this.vElements.length]=this.rules[n].tag}this.vElementsRe=this._arrayToRe(this.vElements,'')},isValid:function(n){if(!this.rulesDone)this._setupRules();if(!n)return true;n=n.replace(/[^a-z0-9]+/gi,'').toUpperCase();return!tinyMCE.getParam('cleanup')||this.vElementsRe.test(n)},addChildRemoveRuleStr:function(s){var x,y,p,i,t,tn,ta,cl,r;if(!s)return;ta=s.split(',');for(x=0;x<ta.length;x++){s=ta[x];p=this.split(/\[|\]/,s);if(p==null||p.length<1)t=s.toUpperCase();else t=p[0].toUpperCase();tn=this.split('/',t);for(y=0;y<tn.length;y++){r="^(";cl=this.split(/\|/,p[1]);for(i=0;i<cl.length;i++){if(cl[i]=='%istrict')r+=tinyMCE.inlineStrict;else if(cl[i]=='%itrans')r+=tinyMCE.inlineTransitional;else if(cl[i]=='%istrict_na')r+=tinyMCE.inlineStrict.substring(2);else if(cl[i]=='%itrans_na')r+=tinyMCE.inlineTransitional.substring(2);else if(cl[i]=='%btrans')r+=tinyMCE.blockElms;else if(cl[i]=='%strict')r+=tinyMCE.blockStrict;else r+=(cl[i].charAt(0)!='#'?cl[i].toUpperCase():cl[i]);r+=(i!=cl.length-1?'|':'')}r+=')$';if(this.childRules==null)this.childRules=tinyMCE.clearArray([]);this.childRules[tn[y]]=new RegExp(r);if(p.length>1)this.childRules[tn[y]].wrapTag=p[2]}}},parseRuleStr:function(s){var ta,p,r,a,i,x,px,t,tn,y,av,or=tinyMCE.clearArray([]),dv;if(s==null||s.length==0)return or;ta=s.split(',');for(x=0;x<ta.length;x++){s=ta[x];if(s.length==0)continue;p=this.split(/\[|\]/,s);if(p==null||p.length<1)t=s.toUpperCase();else t=p[0].toUpperCase();tn=this.split('/',t);for(y=0;y<tn.length;y++){r={};r.tag=tn[y];r.forceAttribs=null;r.defaultAttribs=null;r.validAttribValues=null;px=r.tag.charAt(0);r.forceOpen=px=='+';r.removeEmpty=px=='-';r.fill=px=='#';r.tag=r.tag.replace(/\+|-|#/g,'');r.oTagName=tn[0].replace(/\+|-|#/g,'').toLowerCase();r.isWild=new RegExp('\\*|\\?|\\+','g').test(r.tag);r.validRe=new RegExp(this._wildcardToRe('^'+r.tag+'$'));if(p.length>1){r.vAttribsRe='^(';a=this.split(/\|/,p[1]);for(i=0;i<a.length;i++){t=a[i];if(t.charAt(0)=='!'){a[i]=t=t.substring(1);if(!r.reqAttribsRe)r.reqAttribsRe='\\s+('+t;else r.reqAttribsRe+='|'+t}av=new RegExp('(=|:|<)(.*?)$').exec(t);t=t.replace(new RegExp('(=|:|<).*?$'),'');if(av&&av.length>0){if(av[0].charAt(0)==':'){if(!r.forceAttribs)r.forceAttribs=tinyMCE.clearArray([]);r.forceAttribs[t.toLowerCase()]=av[0].substring(1)}else if(av[0].charAt(0)=='='){if(!r.defaultAttribs)r.defaultAttribs=tinyMCE.clearArray([]);dv=av[0].substring(1);r.defaultAttribs[t.toLowerCase()]=dv==''?"mce_empty":dv}else if(av[0].charAt(0)=='<'){if(!r.validAttribValues)r.validAttribValues=tinyMCE.clearArray([]);r.validAttribValues[t.toLowerCase()]=this._arrayToRe(this.split('?',av[0].substring(1)),'i')}}r.vAttribsRe+=''+t.toLowerCase()+(i!=a.length-1?'|':'');a[i]=t.toLowerCase()}if(r.reqAttribsRe)r.reqAttribsRe=new RegExp(r.reqAttribsRe+')=\"','g');r.vAttribsRe+=')$';r.vAttribsRe=this._wildcardToRe(r.vAttribsRe);r.vAttribsReIsWild=new RegExp('\\*|\\?|\\+','g').test(r.vAttribsRe);r.vAttribsRe=new RegExp(r.vAttribsRe);r.vAttribs=a.reverse();}else{r.vAttribsRe='';r.vAttribs=tinyMCE.clearArray([]);r.vAttribsReIsWild=false}or[r.tag]=r}}return or},serializeNodeAsXML:function(n){var s,b;if(!this.xmlDoc){if(this.isIE){try{this.xmlDoc=new ActiveXObject('MSXML2.DOMDocument')}catch(e){}if(!this.xmlDoc)try{this.xmlDoc=new ActiveXObject('Microsoft.XmlDom')}catch(e){}}else this.xmlDoc=document.implementation.createDocument('','',null);if(!this.xmlDoc)alert("Error XML Parser could not be found.")}if(this.xmlDoc.firstChild)this.xmlDoc.removeChild(this.xmlDoc.firstChild);b=this.xmlDoc.createElement("html");b=this.xmlDoc.appendChild(b);this._convertToXML(n,b);if(this.isIE)return this.xmlDoc.xml;else return new XMLSerializer().serializeToString(this.xmlDoc)},_convertToXML:function(n,xn){var xd,el,i,l,cn,at,no,hc=false;if(tinyMCE.isRealIE&&this._isDuplicate(n))return;xd=this.xmlDoc;switch(n.nodeType){case 1:hc=n.hasChildNodes();el=xd.createElement(n.nodeName.toLowerCase());at=n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified&&no.nodeValue)el.setAttribute(no.nodeName.toLowerCase(),no.nodeValue)}if(!hc&&!this.closeElementsRe.test(n.nodeName))el.appendChild(xd.createTextNode(""));xn=xn.appendChild(el);break;case 3:xn.appendChild(xd.createTextNode(n.nodeValue));return;case 8:xn.appendChild(xd.createComment(n.nodeValue));return}if(hc){cn=n.childNodes;for(i=0,l=cn.length;i<l;i++)this._convertToXML(cn[i],xn)}},serializeNodeAsHTML:function(n,inn){var en,no,h='',i,l,t,st,r,cn,va=false,f=false,at,hc,cr,nn;if(!this.rulesDone)this._setupRules();if(tinyMCE.isRealIE&&this._isDuplicate(n))return'';if(n.parentNode&&this.childRules!=null){cr=this.childRules[n.parentNode.nodeName];if(typeof(cr)!="undefined"&&!cr.test(n.nodeName)){st=true;t=null}}switch(n.nodeType){case 1:hc=n.hasChildNodes();if(st)break;nn=n.nodeName;if(tinyMCE.isRealIE){if(n.nodeName.indexOf('/')!=-1)break;if(n.scopeName&&n.scopeName!='HTML')nn=n.scopeName.toUpperCase()+':'+nn.toUpperCase()}else if(tinyMCE.isOpera&&nn.indexOf(':')>0)nn=nn.toUpperCase();if(this.settings.convert_fonts_to_spans){if(this.settings.on_save&&nn=='FONT')nn='SPAN';if(!this.settings.on_save&&nn=='SPAN')nn='FONT'}if(this.vElementsRe.test(nn)&&(!this.iveRe||!this.iveRe.test(nn))&&!inn){va=true;r=this.rules[nn];if(!r){at=this.rules;for(no in at){if(at[no]&&at[no].validRe.test(nn)){r=at[no];break}}}en=r.isWild?nn.toLowerCase():r.oTagName;f=r.fill;if(r.removeEmpty&&!hc)return"";t='<'+en;if(r.vAttribsReIsWild){at=n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified&&r.vAttribsRe.test(no.nodeName))t+=this._serializeAttribute(n,r,no.nodeName)}}else{for(i=r.vAttribs.length-1;i>-1;i--)t+=this._serializeAttribute(n,r,r.vAttribs[i])}if(!this.settings.on_save){at=this.mceAttribs;for(no in at){if(at[no])t+=this._serializeAttribute(n,r,at[no])}}if(r.reqAttribsRe&&!t.match(r.reqAttribsRe))t=null;if(t!=null&&this.closeElementsRe.test(nn))return t+' />';if(t!=null)h+=t+'>';if(this.isIE&&this.codeElementsRe.test(nn))h+=n.innerHTML}break;case 3:if(st)break;if(n.parentNode&&this.codeElementsRe.test(n.parentNode.nodeName))return this.isIE?'':n.nodeValue;return this.xmlEncode(n.nodeValue);case 8:if(st)break;return"<!--"+this._trimComment(n.nodeValue)+"-->"}if(hc){cn=n.childNodes;for(i=0,l=cn.length;i<l;i++)h+=this.serializeNodeAsHTML(cn[i])}if(f&&!hc)h+=this.fillStr;if(t!=null&&va)h+='</'+en+'>';return h},_serializeAttribute:function(n,r,an){var av='',t,os=this.settings.on_save;if(os&&(an.indexOf('mce_')==0||an.indexOf('_moz')==0))return'';if(os&&this.mceAttribs[an])av=this._getAttrib(n,this.mceAttribs[an]);if(av.length==0)av=this._getAttrib(n,an);if(av.length==0&&r.defaultAttribs&&(t=r.defaultAttribs[an])){av=t;if(av=="mce_empty")return" "+an+'=""'}if(r.forceAttribs&&(t=r.forceAttribs[an]))av=t;if(os&&av.length!=0&&/^(src|href|longdesc)$/.test(an))av=this._urlConverter(this,n,av);if(av.length!=0&&r.validAttribValues&&r.validAttribValues[an]&&!r.validAttribValues[an].test(av))return"";if(av.length!=0&&av=="{$uid}")av="uid_"+(this.idCount++);if(av.length!=0){if(an.indexOf('on')!=0)av=this.xmlEncode(av,1);return" "+an+"="+'"'+av+'"'}return""},formatHTML:function(h){var s=this.settings,p='',i=0,li=0,o='',l;h=h.replace(/<pre([^>]*)>(.*?)<\/pre>/gi,function(a,b,c){c=c.replace(/<br\s*\/>/gi,'\n');return'<pre'+b+'>'+c+'</pre>'});h=h.replace(/\r/g,'');h='\n'+h;h=h.replace(new RegExp('\\n\\s+','gi'),'\n');h=h.replace(this.nlBeforeRe,'\n<$1$2>');h=h.replace(this.nlAfterRe,'<$1$2>\n');h=h.replace(this.nlBeforeAfterRe,'\n<$1$2$3>\n');h+='\n';while((i=h.indexOf('\n',i+1))!=-1){if((l=h.substring(li+1,i)).length!=0){if(this.ouRe.test(l)&&p.length>=s.indent_levels)p=p.substring(s.indent_levels);o+=p+l+'\n';if(this.inRe.test(l))p+=this.inStr}li=i}return o},xmlEncode:function(s){var cl=this,re=this.xmlEncodeRe;if(!this.entitiesDone)this._setupEntities();switch(this.settings.entity_encoding){case"raw":return tinyMCE.xmlEncode(s);case"named":return s.replace(re,function(c){var b=cl.entities[c.charCodeAt(0)];return b?'&'+b+';':c});case"numeric":return s.replace(re,function(c){return'&#'+c.charCodeAt(0)+';'})}return s},split:function(re,s){var i,l,o=[],c=s.split(re);for(i=0,l=c.length;i<l;i++){if(c[i]!=='')o[i]=c[i]}return o},_trimComment:function(s){s=s.replace(new RegExp('\\smce_src=\"[^\"]*\"','gi'),"");s=s.replace(new RegExp('\\smce_href=\"[^\"]*\"','gi'),"");return s},_getAttrib:function(e,n,d){var v,ex,nn;if(typeof(d)=="undefined")d="";if(!e||e.nodeType!=1)return d;try{v=e.getAttribute(n,0)}catch(ex){v=e.getAttribute(n,2)}if(n=="class"&&!v)v=e.className;if(this.isIE){if(n=="http-equiv")v=e.httpEquiv;nn=e.nodeName;if(nn=="FORM"&&n=="enctype"&&v=="application/x-www-form-urlencoded")v="";if(nn=="INPUT"&&n=="size"&&v=="20")v="";if(nn=="INPUT"&&n=="maxlength"&&v=="2147483647")v="";if(n=="width"||n=="height")v=e.getAttribute(n,2)}if(n=='style'&&v){if(!tinyMCE.isOpera)v=e.style.cssText;v=tinyMCE.serializeStyle(tinyMCE.parseStyle(v))}if(this.settings.on_save&&n.indexOf('on')!=-1&&this.settings.on_save&&v&&v!=='')v=tinyMCE.cleanupEventStr(v);return(v&&v!=='')?''+v:d},_urlConverter:function(c,n,v){if(!c.settings.on_save)return tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,v);else if(tinyMCE.getParam('convert_urls')){if(!this.urlConverter)this.urlConverter=eval(tinyMCE.settings.urlconverter_callback);return this.urlConverter(v,n,true)}return v},_arrayToRe:function(a,op,be,af){var i,r;op=typeof(op)=="undefined"?"gi":op;be=typeof(be)=="undefined"?"^(":be;af=typeof(af)=="undefined"?")$":af;r=be;for(i=0;i<a.length;i++)r+=this._wildcardToRe(a[i])+(i!=a.length-1?"|":"");r+=af;return new RegExp(r,op)},_wildcardToRe:function(s){s=s.replace(/\?/g,'(\\S?)');s=s.replace(/\+/g,'(\\S+)');s=s.replace(/\*/g,'(\\S*)');return s},_setupEntities:function(){var n,a,i,s=this.settings;if(s.entity_encoding=="named"){n=tinyMCE.clearArray([]);a=this.split(',',s.entities);for(i=0;i<a.length;i+=2)n[a[i]]=a[i+1];this.entities=n}this.entitiesDone=true},_setupRules:function(){var s=this.settings;this.addRuleStr(s.valid_elements);this.addRuleStr(s.extended_valid_elements);this.addChildRemoveRuleStr(s.valid_child_elements);this.rulesDone=true},_isDuplicate:function(n){var i,l,sn;if(!this.settings.fix_content_duplication)return false;if(tinyMCE.isRealIE&&n.nodeType==1){if(n.mce_serialized==this.serializationId)return true;n.setAttribute('mce_serialized',this.serializationId)}else{sn=this.serializedNodes;for(i=0,l=sn.length;i<l;i++){if(sn[i]==n)return true}sn.push(n)}return false}};tinyMCE.add(TinyMCE_Engine,{createTagHTML:function(tn,a,h){var o='',f=tinyMCE.xmlEncode,n;o='<'+tn;if(a){for(n in a){if(typeof(a[n])!='function'&&a[n]!=null)o+=' '+f(n)+'="'+f(''+a[n])+'"'}}o+=!h?' />':'>'+h+'</'+tn+'>';return o},createTag:function(d,tn,a,h){var o=d.createElement(tn),n;if(a){for(n in a){if(typeof(a[n])!='function'&&a[n]!=null)tinyMCE.setAttrib(o,n,a[n])}}if(h)o.innerHTML=h;return o},getElementByAttributeValue:function(n,e,a,v){return(n=this.getElementsByAttributeValue(n,e,a,v)).length==0?null:n[0]},getElementsByAttributeValue:function(n,e,a,v){var i,nl=n.getElementsByTagName(e),o=[];for(i=0;i<nl.length;i++){if(tinyMCE.getAttrib(nl[i],a).indexOf(v)!=-1)o[o.length]=nl[i]}return o},isBlockElement:function(n){return n!=null&&n.nodeType==1&&this.blockRegExp.test(n.nodeName)},getParentBlockElement:function(n,r){return this.getParentNode(n,function(n){return tinyMCE.isBlockElement(n)},r);return null},insertAfter:function(n,r){if(r.nextSibling)r.parentNode.insertBefore(n,r.nextSibling);else r.parentNode.appendChild(n)},setInnerHTML:function(e,h){var i,nl,n;if(tinyMCE.isGecko){h=h.replace(/<embed([^>]*)>/gi,'<tmpembed$1>');h=h.replace(/<em([^>]*)>/gi,'<i$1>');h=h.replace(/<tmpembed([^>]*)>/gi,'<embed$1>');h=h.replace(/<strong([^>]*)>/gi,'<b$1>');h=h.replace(/<\/strong>/gi,'</b>');h=h.replace(/<\/em>/gi,'</i>')}if(tinyMCE.isRealIE){h=h.replace(/\s\/>/g,'>');h=h.replace(/<p([^>]*)>\u00A0?<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');h=h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');h=h.replace(/<p([^>]*)>\s+<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');e.innerHTML=tinyMCE.uniqueTag+h;e.firstChild.removeNode(true);nl=e.getElementsByTagName("p");for(i=nl.length-1;i>=0;i--){n=nl[i];if(n.nodeName=='P'&&!n.hasChildNodes()&&!n.mce_keep)n.parentNode.removeChild(n)}}else{h=this.fixGeckoBaseHREFBug(1,e,h);e.innerHTML=h;this.fixGeckoBaseHREFBug(2,e,h)}},getOuterHTML:function(e){var d;if(tinyMCE.isIE)return e.outerHTML;d=e.ownerDocument.createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML},setOuterHTML:function(e,h,d){var d=typeof(d)=="undefined"?e.ownerDocument:d,i,nl,t;if(tinyMCE.isIE&&e.nodeType==1)e.outerHTML=h;else{t=d.createElement("body");t.innerHTML=h;for(i=0,nl=t.childNodes;i<nl.length;i++)e.parentNode.insertBefore(nl[i].cloneNode(true),e);e.parentNode.removeChild(e)}},_getElementById:function(id,d){var e,i,j,f;if(typeof(d)=="undefined")d=document;e=d.getElementById(id);if(!e){f=d.forms;for(i=0;i<f.length;i++){for(j=0;j<f[i].elements.length;j++){if(f[i].elements[j].name==id){e=f[i].elements[j];break}}}}return e},getNodeTree:function(n,na,t,nn){return this.selectNodes(n,function(n){return(!t||n.nodeType==t)&&(!nn||n.nodeName==nn)},na?na:[])},getParentElement:function(n,na,f,r){var re=na?new RegExp('^('+na.toUpperCase().replace(/,/g,'|')+')$'):0,v;if(f&&typeof(f)=='string')return this.getParentElement(n,na,function(no){return tinyMCE.getAttrib(no,f)!==''});return this.getParentNode(n,function(n){return((n.nodeType==1&&!re)||(re&&re.test(n.nodeName)))&&(!f||f(n))},r)},getParentNode:function(n,f,r){while(n){if(n==r)return null;if(f(n))return n;n=n.parentNode}return null},getAttrib:function(elm,name,dv){var v;if(typeof(dv)=="undefined")dv="";if(!elm||elm.nodeType!=1)return dv;try{v=elm.getAttribute(name,0)}catch(ex){v=elm.getAttribute(name,2)}if(name=="class"&&!v)v=elm.className;if(tinyMCE.isGecko){if(name=="src"&&elm.src!=null&&elm.src!=='')v=elm.src;if(name=="href"&&elm.href!=null&&elm.href!=='')v=elm.href}else if(tinyMCE.isIE){switch(name){case"http-equiv":v=elm.httpEquiv;break;case"width":case"height":v=elm.getAttribute(name,2);break}}if(name=="style"&&!tinyMCE.isOpera)v=elm.style.cssText;return(v&&v!=='')?v:dv},setAttrib:function(el,name,va,fix){if(typeof(va)=="number"&&va!=null)va=""+va;if(fix){if(va==null)va="";va=va.replace(/[^0-9%]/g,'')}if(name=="style")el.style.cssText=va;if(name=="class")el.className=va;if(va!=null&&va!==''&&va!=-1)el.setAttribute(name,va);else el.removeAttribute(name)},setStyleAttrib:function(e,n,v){e.style[n]=v;if(tinyMCE.isIE&&v==null||v==''){v=tinyMCE.serializeStyle(tinyMCE.parseStyle(e.style.cssText));e.style.cssText=v;e.setAttribute("style",v)}},switchClass:function(ei,c){var e;if(tinyMCE.switchClassCache[ei])e=tinyMCE.switchClassCache[ei];else e=tinyMCE.switchClassCache[ei]=document.getElementById(ei);if(e){if(tinyMCE.settings.button_tile_map&&e.className&&e.className.indexOf('mceTiledButton')==0)c='mceTiledButton '+c;e.className=c}},getAbsPosition:function(n,cn){var l=0,t=0;while(n&&n!=cn){l+=n.offsetLeft;t+=n.offsetTop;n=n.offsetParent}return{absLeft:l,absTop:t}},prevNode:function(e,n){var a=n.split(','),i;while((e=e.previousSibling)!=null){for(i=0;i<a.length;i++){if(e.nodeName==a[i])return e}}return null},nextNode:function(e,n){var a=n.split(','),i;while((e=e.nextSibling)!=null){for(i=0;i<a.length;i++){if(e.nodeName==a[i])return e}}return null},selectElements:function(n,na,f){var i,a=[],nl,x;for(x=0,na=na.split(',');x<na.length;x++)for(i=0,nl=n.getElementsByTagName(na[x]);i<nl.length;i++)(!f||f(nl[i]))&&a.push(nl[i]);return a},selectNodes:function(n,f,a){var i;if(!a)a=[];if(f(n))a[a.length]=n;if(n.hasChildNodes()){for(i=0;i<n.childNodes.length;i++)tinyMCE.selectNodes(n.childNodes[i],f,a)}return a},addCSSClass:function(e,c,b){var o=this.removeCSSClass(e,c);return e.className=b?c+(o!==''?(' '+o):''):(o!==''?(o+' '):'')+c},removeCSSClass:function(e,c){c=e.className.replace(new RegExp("(^|\\s+)"+c+"(\\s+|$)"),' ');return e.className=c!=' '?c:''},hasCSSClass:function(n,c){return new RegExp('\\b'+c+'\\b','g').test(n.className)},renameElement:function(e,n,d){var ne,i,ar;d=typeof(d)=="undefined"?tinyMCE.selectedInstance.getDoc():d;if(e){ne=d.createElement(n);ar=e.attributes;for(i=ar.length-1;i>-1;i--){if(ar[i].specified&&ar[i].nodeValue)ne.setAttribute(ar[i].nodeName.toLowerCase(),ar[i].nodeValue)}ar=e.childNodes;for(i=0;i<ar.length;i++)ne.appendChild(ar[i].cloneNode(true));e.parentNode.replaceChild(ne,e)}},getViewPort:function(w){var d=w.document,m=d.compatMode=='CSS1Compat',b=d.body,de=d.documentElement;return{left:w.pageXOffset||(m?de.scrollLeft:b.scrollLeft),top:w.pageYOffset||(m?de.scrollTop:b.scrollTop),width:w.innerWidth||(m?de.clientWidth:b.clientWidth),height:w.innerHeight||(m?de.clientHeight:b.clientHeight)}},getStyle:function(n,na,d){if(!n)return false;if(tinyMCE.isGecko&&n.ownerDocument.defaultView){try{return n.ownerDocument.defaultView.getComputedStyle(n,null).getPropertyValue(na)}catch(n){return null}}na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase()});if(n.currentStyle)return n.currentStyle[na];return false}});tinyMCE.add(TinyMCE_Engine,{parseURL:function(url_str){var urlParts=[],i,pos,lastPos,chr;if(url_str){pos=url_str.indexOf('://');if(pos!=-1){urlParts.protocol=url_str.substring(0,pos);lastPos=pos+3}for(i=lastPos;i<url_str.length;i++){chr=url_str.charAt(i);if(chr==':')break;if(chr=='/')break}pos=i;urlParts.host=url_str.substring(lastPos,pos);urlParts.port="";lastPos=pos;if(url_str.charAt(pos)==':'){pos=url_str.indexOf('/',lastPos);urlParts.port=url_str.substring(lastPos+1,pos)}lastPos=pos;pos=url_str.indexOf('?',lastPos);if(pos==-1)pos=url_str.indexOf('#',lastPos);if(pos==-1)pos=url_str.length;urlParts.path=url_str.substring(lastPos,pos);lastPos=pos;if(url_str.charAt(pos)=='?'){pos=url_str.indexOf('#');pos=(pos==-1)?url_str.length:pos;urlParts.query=url_str.substring(lastPos+1,pos)}lastPos=pos;if(url_str.charAt(pos)=='#'){pos=url_str.length;urlParts.anchor=url_str.substring(lastPos+1,pos)}}return urlParts},serializeURL:function(up){var o="";if(up.protocol)o+=up.protocol+"://";if(up.host)o+=up.host;if(up.port)o+=":"+up.port;if(up.path)o+=up.path;if(up.query)o+="?"+up.query;if(up.anchor)o+="#"+up.anchor;return o},convertAbsoluteURLToRelativeURL:function(base_url,url_to_relative){var baseURL=this.parseURL(base_url),targetURL=this.parseURL(url_to_relative);var i,strTok1,strTok2,breakPoint=0,outPath="",forceSlash=false;var fileName,pos;if(targetURL.path=='')targetURL.path="/";else forceSlash=true;base_url=baseURL.path.substring(0,baseURL.path.lastIndexOf('/'));strTok1=base_url.split('/');strTok2=targetURL.path.split('/');if(strTok1.length>=strTok2.length){for(i=0;i<strTok1.length;i++){if(i>=strTok2.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(strTok1.length<strTok2.length){for(i=0;i<strTok2.length;i++){if(i>=strTok1.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(breakPoint==1)return targetURL.path;for(i=0;i<(strTok1.length-(breakPoint-1));i++)outPath+="../";for(i=breakPoint-1;i<strTok2.length;i++){if(i!=(breakPoint-1))outPath+="/"+strTok2[i];else outPath+=strTok2[i]}targetURL.protocol=null;targetURL.host=null;targetURL.port=null;targetURL.path=outPath==''&&forceSlash?"/":outPath;fileName=baseURL.path;if((pos=fileName.lastIndexOf('/'))!=-1)fileName=fileName.substring(pos+1);if(fileName==targetURL.path&&targetURL.anchor!=='')targetURL.path="";if(targetURL.path==''&&!targetURL.anchor)targetURL.path=fileName!==''?fileName:"/";return this.serializeURL(targetURL)},convertRelativeToAbsoluteURL:function(base_url,relative_url){var baseURL=this.parseURL(base_url),baseURLParts,relURLParts,newRelURLParts,numBack,relURL=this.parseURL(relative_url),i;var len,absPath,start,end,newBaseURLParts;if(relative_url==''||relative_url.indexOf('://')!=-1||/^(mailto:|javascript:|#|\/)/.test(relative_url))return relative_url;baseURLParts=baseURL.path.split('/');relURLParts=relURL.path.split('/');newBaseURLParts=[];for(i=baseURLParts.length-1;i>=0;i--){if(baseURLParts[i].length==0)continue;newBaseURLParts[newBaseURLParts.length]=baseURLParts[i]}baseURLParts=newBaseURLParts.reverse();newRelURLParts=[];numBack=0;for(i=relURLParts.length-1;i>=0;i--){if(relURLParts[i].length==0||relURLParts[i]==".")continue;if(relURLParts[i]=='..'){numBack++;continue}if(numBack>0){numBack--;continue}newRelURLParts[newRelURLParts.length]=relURLParts[i]}relURLParts=newRelURLParts.reverse();len=baseURLParts.length-numBack;absPath=(len<=0?"":"/")+baseURLParts.slice(0,len).join('/')+"/"+relURLParts.join('/');start="";end="";relURL.protocol=baseURL.protocol;relURL.host=baseURL.host;relURL.port=baseURL.port;if(relURL.path.charAt(relURL.path.length-1)=="/")absPath+="/";relURL.path=absPath;return this.serializeURL(relURL)},convertURL:function(url,node,on_save){var dl=document.location,start,portPart,urlParts,baseUrlParts,tmpUrlParts,curl;var prot=dl.protocol,host=dl.hostname,port=dl.port;if(prot=="file:")return url;url=tinyMCE.regexpReplace(url,'(http|https):///','/');if(url.indexOf('mailto:')!=-1||url.indexOf('javascript:')!=-1||/^[ \t\r\n\+]*[#\?]/.test(url))return url;if(!tinyMCE.isIE&&!on_save&&url.indexOf("://")==-1&&url.charAt(0)!='/')return tinyMCE.settings.base_href+url;if(on_save&&tinyMCE.getParam('relative_urls')){curl=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,url);if(curl.charAt(0)=='/')curl=tinyMCE.settings.document_base_prefix+curl;urlParts=tinyMCE.parseURL(curl);tmpUrlParts=tinyMCE.parseURL(tinyMCE.settings.document_base_url);if(urlParts.host==tmpUrlParts.host&&(urlParts.port==tmpUrlParts.port))return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings.document_base_url,curl)}if(!tinyMCE.getParam('relative_urls')){urlParts=tinyMCE.parseURL(url);baseUrlParts=tinyMCE.parseURL(tinyMCE.settings.base_href);url=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,url);if(urlParts.anchor&&urlParts.path==baseUrlParts.path)return"#"+urlParts.anchor}if(tinyMCE.getParam('remove_script_host')){start="";portPart="";if(port!=='')portPart=":"+port;start=prot+"//"+host+portPart+"/";if(url.indexOf(start)==0)url=url.substring(start.length-1)}return url},convertAllRelativeURLs:function(body){var i,elms,src,href,mhref,msrc;elms=body.getElementsByTagName("img");for(i=0;i<elms.length;i++){src=tinyMCE.getAttrib(elms[i],'src');msrc=tinyMCE.getAttrib(elms[i],'mce_src');if(msrc!=='')src=msrc;if(src!==''){src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,src);elms[i].setAttribute("src",src)}}elms=body.getElementsByTagName("a");for(i=0;i<elms.length;i++){href=tinyMCE.getAttrib(elms[i],'href');mhref=tinyMCE.getAttrib(elms[i],'mce_href');if(mhref!=='')href=mhref;if(href&&href!==''){href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,href);elms[i].setAttribute("href",href)}}}});tinyMCE.add(TinyMCE_Engine,{clearArray:function(a){var n;for(n in a)a[n]=null;return a},explode:function(d,s){var ar=s.split(d),oar=[],i;for(i=0;i<ar.length;i++){if(ar[i]!=='')oar[oar.length]=ar[i]}return oar}});tinyMCE.add(TinyMCE_Engine,{_setEventsEnabled:function(node,state){var evs,x,y,elms,i,event;var events=['onfocus','onblur','onclick','ondblclick','onmousedown','onmouseup','onmouseover','onmousemove','onmouseout','onkeypress','onkeydown','onkeydown','onkeyup'];evs=tinyMCE.settings.event_elements.split(',');for(y=0;y<evs.length;y++){elms=node.getElementsByTagName(evs[y]);for(i=0;i<elms.length;i++){event="";for(x=0;x<events.length;x++){if((event=tinyMCE.getAttrib(elms[i],events[x]))!==''){event=tinyMCE.cleanupEventStr(""+event);if(!state)event="return true;"+event;else event=event.replace(/^return true;/gi,'');elms[i].removeAttribute(events[x]);elms[i].setAttribute(events[x],event)}}}}},_eventPatch:function(editor_id){var n,inst,win,e;if(typeof(tinyMCE)=="undefined")return true;try{if(tinyMCE.selectedInstance){win=tinyMCE.selectedInstance.getWin();if(win&&win.event){e=win.event;if(!e.target)e.target=e.srcElement;TinyMCE_Engine.prototype.handleEvent(e);return}}for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.select();win=inst.getWin();if(win&&win.event){e=win.event;if(!e.target)e.target=e.srcElement;TinyMCE_Engine.prototype.handleEvent(e);return}}}catch(ex){}},findEvent:function(e){var n,inst;if(e)return e;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(tinyMCE.isInstance(inst)&&inst.getWin().event)return inst.getWin().event}return null},unloadHandler:function(){tinyMCE.triggerSave(true,true)},addEventHandlers:function(inst){this.setEventHandlers(inst,1)},setEventHandlers:function(inst,s){var doc=inst.getDoc(),ie,ot,i,f=s?tinyMCE.addEvent:tinyMCE.removeEvent;ie=['keypress','keyup','keydown','click','mouseup','mousedown','controlselect','dblclick'];ot=['keypress','keyup','keydown','click','mouseup','mousedown','focus','blur','dragdrop'];inst.switchSettings();if(tinyMCE.isIE){for(i=0;i<ie.length;i++)f(doc,ie[i],TinyMCE_Engine.prototype._eventPatch)}else{for(i=0;i<ot.length;i++)f(doc,ot[i],tinyMCE.handleEvent);try{doc.designMode="On"}catch(e){}}},onMouseMove:function(){var inst,lh;if(tinyMCE.lastHover){lh=tinyMCE.lastHover;if(lh.className.indexOf('mceMenu')!=-1)tinyMCE._menuButtonEvent('out',lh);else lh.className=lh.className;tinyMCE.lastHover=null}if(!tinyMCE.hasMouseMoved){inst=tinyMCE.selectedInstance;if(inst.isFocused){inst.undoBookmark=inst.selection.getBookmark();tinyMCE.hasMouseMoved=true}}},cancelEvent:function(e){if(!e)return false;if(tinyMCE.isIE){e.returnValue=false;e.cancelBubble=true}else{e.preventDefault();e.stopPropagation&&e.stopPropagation()}return false},addEvent:function(o,n,h){if(n!='unload'){function clean(){var ex;try{tinyMCE.removeEvent(o,n,h);tinyMCE.removeEvent(window,'unload',clean);o=n=h=null}catch(ex){}}tinyMCE.addEvent(window,'unload',clean)}if(o.attachEvent)o.attachEvent("on"+n,h);else o.addEventListener(n,h,false)},removeEvent:function(o,n,h){if(o.detachEvent)o.detachEvent("on"+n,h);else o.removeEventListener(n,h,false)},addSelectAccessibility:function(e,s,w){if(!s._isAccessible){s.onkeydown=tinyMCE.accessibleEventHandler;s.onblur=tinyMCE.accessibleEventHandler;s._isAccessible=true;s._win=w}return false},accessibleEventHandler:function(e){var elm,win=this._win;e=tinyMCE.isIE?win.event:e;elm=tinyMCE.isIE?e.srcElement:e.target;if(e.type=="blur"){if(elm.oldonchange){elm.onchange=elm.oldonchange;elm.oldonchange=null}return true}if(elm.nodeName=="SELECT"&&!elm.oldonchange){elm.oldonchange=elm.onchange;elm.onchange=null}if(e.keyCode==13||e.keyCode==32){elm.onchange=elm.oldonchange;elm.onchange();elm.oldonchange=null;tinyMCE.cancelEvent(e);return false}return true},_resetIframeHeight:function(){var ife;if(tinyMCE.isRealIE){ife=tinyMCE.selectedInstance.iframeElement;if(ife._oldHeight){ife.style.height=ife._oldHeight;ife.height=ife._oldHeight}}}});function TinyMCE_Selection(inst){this.instance=inst};TinyMCE_Selection.prototype={getSelectedHTML:function(){var inst=this.instance,e,r=this.getRng(),h;if(!r)return null;e=document.createElement("body");if(r.cloneContents)e.appendChild(document.importNode(r.cloneContents(),true));else if(typeof(r.item)!='undefined'||typeof(r.htmlText)!='undefined')e.innerHTML=r.item?r.item(0).outerHTML:r.htmlText;else e.innerHTML=r.toString();h=tinyMCE._cleanupHTML(inst,inst.contentDocument,inst.settings,e,e,false,true,false);return h},getSelectedText:function(){var inst=this.instance,d,r,s,t;if(tinyMCE.isIE){d=inst.getDoc();if(d.selection.type=="Text"){r=d.selection.createRange();t=r.text}else t=''}else{s=this.getSel();if(s&&s.toString)t=s.toString();else t=''}return t},getBookmark:function(simple){var inst=this.instance,rng=this.getRng(),doc=inst.getDoc(),b=inst.getBody();var trng,sx,sy,xx=-999999999,vp=inst.getViewPort();var sp,le,s,e,nl,i,si,ei,w;sx=vp.left;sy=vp.top;if(simple)return{rng:rng,scrollX:sx,scrollY:sy};if(tinyMCE.isRealIE){if(rng.item){e=rng.item(0);nl=b.getElementsByTagName(e.nodeName);for(i=0;i<nl.length;i++){if(e==nl[i]){sp=i;break}}return{tag:e.nodeName,index:sp,scrollX:sx,scrollY:sy}}else{trng=doc.body.createTextRange();trng.moveToElementText(inst.getBody());trng.collapse(true);bp=Math.abs(trng.move('character',xx));trng=rng.duplicate();trng.collapse(true);sp=Math.abs(trng.move('character',xx));trng=rng.duplicate();trng.collapse(false);le=Math.abs(trng.move('character',xx))-sp;return{start:sp-bp,length:le,scrollX:sx,scrollY:sy}}}else{s=this.getSel();e=this.getFocusElement();if(!s)return null;if(e&&e.nodeName=='IMG'){return{start:-1,end:-1,index:sp,scrollX:sx,scrollY:sy}}if(s.anchorNode==s.focusNode&&s.anchorOffset==s.focusOffset){e=this._getPosText(b,s.anchorNode,s.focusNode);if(!e)return{scrollX:sx,scrollY:sy};return{start:e.start+s.anchorOffset,end:e.end+s.focusOffset,scrollX:sx,scrollY:sy}}else{e=this._getPosText(b,rng.startContainer,rng.endContainer);if(!e)return{scrollX:sx,scrollY:sy};return{start:e.start+rng.startOffset,end:e.end+rng.endOffset,scrollX:sx,scrollY:sy}}}return null},moveToBookmark:function(bookmark){var inst=this.instance,rng,nl,i,ex,b=inst.getBody(),sd;var doc=inst.getDoc(),win=inst.getWin(),sel=this.getSel();if(!bookmark)return false;if(tinyMCE.isSafari&&bookmark.rng){sel.setBaseAndExtent(bookmark.rng.startContainer,bookmark.rng.startOffset,bookmark.rng.endContainer,bookmark.rng.endOffset);return true}if(tinyMCE.isRealIE){if(bookmark.rng){try{bookmark.rng.select()}catch(ex){}return true}win.focus();if(bookmark.tag){rng=b.createControlRange();nl=b.getElementsByTagName(bookmark.tag);if(nl.length>bookmark.index){try{rng.addElement(nl[bookmark.index])}catch(ex){}}}else{try{if(bookmark.start<0)return true;rng=inst.getSel().createRange();rng.moveToElementText(inst.getBody());rng.collapse(true);rng.moveStart('character',bookmark.start);rng.moveEnd('character',bookmark.length)}catch(ex){return true}}rng.select();win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true}if(tinyMCE.isGecko||tinyMCE.isOpera){if(!sel)return false;if(bookmark.rng){sel.removeAllRanges();sel.addRange(bookmark.rng)}if(bookmark.start!=-1&&bookmark.end!=-1){try{sd=this._getTextPos(b,bookmark.start,bookmark.end);rng=doc.createRange();rng.setStart(sd.startNode,sd.startOffset);rng.setEnd(sd.endNode,sd.endOffset);sel.removeAllRanges();sel.addRange(rng);if(!tinyMCE.isOpera)win.focus()}catch(ex){}}win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true}return false},_getPosText:function(r,sn,en){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){if(n==sn)d.start=p;if(n==en){d.end=p;return d}p+=n.nodeValue?n.nodeValue.length:0}return null},_getTextPos:function(r,sp,ep){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){p+=n.nodeValue?n.nodeValue.length:0;if(p>=sp&&!d.startNode){d.startNode=n;d.startOffset=sp-(p-n.nodeValue.length)}if(p>=ep){d.endNode=n;d.endOffset=ep-(p-n.nodeValue.length);return d}}return null},selectNode:function(node,collapse,select_text_node,to_start){var inst=this.instance,sel,rng,nodes;if(!node)return;if(typeof(collapse)=="undefined")collapse=true;if(typeof(select_text_node)=="undefined")select_text_node=false;if(typeof(to_start)=="undefined")to_start=true;if(inst.settings.auto_resize)inst.resizeToContent();if(tinyMCE.isRealIE){rng=inst.getDoc().body.createTextRange();try{rng.moveToElementText(node);if(collapse)rng.collapse(to_start);rng.select()}catch(e){}}else{sel=this.getSel();if(!sel)return;if(tinyMCE.isSafari){sel.setBaseAndExtent(node,0,node,node.innerText.length);if(collapse){if(to_start)sel.collapseToStart();else sel.collapseToEnd()}this.scrollToNode(node);return}rng=inst.getDoc().createRange();if(select_text_node){nodes=tinyMCE.getNodeTree(node,[],3);if(nodes.length>0)rng.selectNodeContents(nodes[0]);else rng.selectNodeContents(node)}else rng.selectNode(node);if(collapse){if(!to_start&&node.nodeType==3){rng.setStart(node,node.nodeValue.length);rng.setEnd(node,node.nodeValue.length)}else rng.collapse(to_start)}sel.removeAllRanges();sel.addRange(rng)}this.scrollToNode(node);tinyMCE.selectedElement=null;if(node.nodeType==1)tinyMCE.selectedElement=node},scrollToNode:function(node){var inst=this.instance,w=inst.getWin(),vp=inst.getViewPort(),pos=tinyMCE.getAbsPosition(node),cvp,p,cwin;if(pos.absLeft<vp.left||pos.absLeft>vp.left+vp.width||pos.absTop<vp.top||pos.absTop>vp.top+(vp.height-25))w.scrollTo(pos.absLeft,pos.absTop-vp.height+25);if(inst.settings.auto_resize){cwin=inst.getContainerWin();cvp=tinyMCE.getViewPort(cwin);p=this.getAbsPosition(node);if(p.absLeft<cvp.left||p.absLeft>cvp.left+cvp.width||p.absTop<cvp.top||p.absTop>cvp.top+cvp.height)cwin.scrollTo(p.absLeft,p.absTop-cvp.height+25)}},getAbsPosition:function(n){var pos=tinyMCE.getAbsPosition(n),ipos=tinyMCE.getAbsPosition(this.instance.iframeElement);return{absLeft:ipos.absLeft+pos.absLeft,absTop:ipos.absTop+pos.absTop}},getSel:function(){var inst=this.instance;if(tinyMCE.isRealIE)return inst.getDoc().selection;return inst.contentWindow.getSelection()},getRng:function(){var s=this.getSel();if(s==null)return null;if(tinyMCE.isRealIE)return s.createRange();if(tinyMCE.isSafari&&!s.getRangeAt)return''+window.getSelection();if(s.rangeCount>0)return s.getRangeAt(0);return null},isCollapsed:function(){var r=this.getRng();if(r.item)return false;return r.boundingWidth==0||this.getSel().isCollapsed},collapse:function(b){var r=this.getRng(),s=this.getSel();if(r.select){r.collapse(b);r.select()}else{if(b)s.collapseToStart();else s.collapseToEnd()}},getFocusElement:function(){var inst=this.instance,doc,rng,sel,elm;if(tinyMCE.isRealIE){doc=inst.getDoc();rng=doc.selection.createRange();elm=rng.item?rng.item(0):rng.parentElement()}else{if(!tinyMCE.isSafari&&inst.isHidden())return inst.getBody();sel=this.getSel();rng=this.getRng();if(!sel||!rng)return null;elm=rng.commonAncestorContainer;if(!rng.collapsed){if(rng.startContainer==rng.endContainer){if(rng.startOffset-rng.endOffset<2){if(rng.startContainer.hasChildNodes())elm=rng.startContainer.childNodes[rng.startOffset]}}}elm=tinyMCE.getParentElement(elm);}return elm}};function TinyMCE_UndoRedo(inst){this.instance=inst;this.undoLevels=[];this.undoIndex=0;this.typingUndoIndex=-1;this.undoRedo=true};TinyMCE_UndoRedo.prototype={add:function(l){var b,customUndoLevels,newHTML,inst=this.instance,i,ul,ur;if(l){this.undoLevels[this.undoLevels.length]=l;return true}if(this.typingUndoIndex!=-1){this.undoIndex=this.typingUndoIndex;if(tinyMCE.typingUndoIndex!=-1)tinyMCE.undoIndex=tinyMCE.typingUndoIndex}newHTML=tinyMCE.trim(inst.getBody().innerHTML);if(this.undoLevels[this.undoIndex]&&newHTML!=this.undoLevels[this.undoIndex].content){inst.isNotDirty=false;tinyMCE.dispatchCallback(inst,'onchange_callback','onChange',inst);customUndoLevels=tinyMCE.settings.custom_undo_redo_levels;if(customUndoLevels!=-1&&this.undoLevels.length>customUndoLevels){for(i=0;i<this.undoLevels.length-1;i++)this.undoLevels[i]=this.undoLevels[i+1];this.undoLevels.length--;this.undoIndex--;}b=inst.undoBookmark;if(!b)b=inst.selection.getBookmark();this.undoIndex++;this.undoLevels[this.undoIndex]={content:newHTML,bookmark:b};ul=tinyMCE.undoLevels;for(i=tinyMCE.undoIndex+1;i<ul.length;i++){ur=ul[i].undoRedo;if(ur.undoIndex==ur.undoLevels.length-1)ur.undoIndex--;ur.undoLevels.length--}tinyMCE.undoLevels[tinyMCE.undoIndex++]=inst;tinyMCE.undoLevels.length=tinyMCE.undoIndex;this.undoLevels.length=this.undoIndex+1;return true}return false},undo:function(){var inst=this.instance;if(this.undoIndex>0){this.undoIndex--;tinyMCE.setInnerHTML(inst.getBody(),this.undoLevels[this.undoIndex].content);inst.repaint();if(inst.settings.custom_undo_redo_restore_selection)inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark)}},redo:function(){var inst=this.instance;tinyMCE.execCommand("mceEndTyping");if(this.undoIndex<(this.undoLevels.length-1)){this.undoIndex++;tinyMCE.setInnerHTML(inst.getBody(),this.undoLevels[this.undoIndex].content);inst.repaint();if(inst.settings.custom_undo_redo_restore_selection)inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark)}tinyMCE.triggerNodeChange()}};var TinyMCE_ForceParagraphs={_insertPara:function(inst,e){var doc=inst.getDoc(),sel=inst.getSel(),body=inst.getBody(),win=inst.contentWindow,rng=sel.getRangeAt(0);var rootElm=doc.documentElement,blockName="P",startNode,endNode,startBlock,endBlock;var rngBefore,rngAfter,direct,startNode,startOffset,endNode,endOffset,b=tinyMCE.isOpera?inst.selection.getBookmark():null;var paraBefore,paraAfter,startChop,endChop,contents,i;function isEmpty(para){var nodes;function isEmptyHTML(html){return html.replace(new RegExp('[ \t\r\n]+','g'),'').toLowerCase()==''}if(para.getElementsByTagName("img").length>0)return false;if(para.getElementsByTagName("table").length>0)return false;if(para.getElementsByTagName("hr").length>0)return false;nodes=tinyMCE.getNodeTree(para,[],3);for(i=0;i<nodes.length;i++){if(!isEmptyHTML(nodes[i].nodeValue))return false}return true}rngBefore=doc.createRange();rngBefore.setStart(sel.anchorNode,sel.anchorOffset);rngBefore.collapse(true);rngAfter=doc.createRange();rngAfter.setStart(sel.focusNode,sel.focusOffset);rngAfter.collapse(true);direct=rngBefore.compareBoundaryPoints(rngBefore.START_TO_END,rngAfter)<0;startNode=direct?sel.anchorNode:sel.focusNode;startOffset=direct?sel.anchorOffset:sel.focusOffset;endNode=direct?sel.focusNode:sel.anchorNode;endOffset=direct?sel.focusOffset:sel.anchorOffset;startNode=startNode.nodeName=="HTML"?doc.body:startNode;startNode=startNode.nodeName=="BODY"?startNode.firstChild:startNode;endNode=endNode.nodeName=="BODY"?endNode.firstChild:endNode;startBlock=inst.getParentBlockElement(startNode);endBlock=inst.getParentBlockElement(endNode);if(startBlock&&(startBlock.nodeName=='CAPTION'||/absolute|relative|static/gi.test(startBlock.style.position)))startBlock=null;if(endBlock&&(endBlock.nodeName=='CAPTION'||/absolute|relative|static/gi.test(endBlock.style.position)))endBlock=null;if(startBlock!=null){blockName=startBlock.nodeName;if(/(TD|TABLE|TH|CAPTION)/.test(blockName)||(blockName=="DIV"&&/left|right/gi.test(startBlock.style.cssFloat)))blockName="P"}if(tinyMCE.getParentElement(startBlock,"OL,UL",null,body)!=null)return false;if((startBlock!=null&&startBlock.nodeName=="TABLE")||(endBlock!=null&&endBlock.nodeName=="TABLE"))startBlock=endBlock=null;paraBefore=(startBlock!=null&&startBlock.nodeName==blockName)?startBlock.cloneNode(false):doc.createElement(blockName);paraAfter=(endBlock!=null&&endBlock.nodeName==blockName)?endBlock.cloneNode(false):doc.createElement(blockName);if(/^(H[1-6])$/.test(blockName))paraAfter=doc.createElement("p");startChop=startNode;endChop=endNode;node=startChop;do{if(node==body||node.nodeType==9||tinyMCE.isBlockElement(node))break;startChop=node}while((node=node.previousSibling?node.previousSibling:node.parentNode));node=endChop;do{if(node==body||node.nodeType==9||tinyMCE.isBlockElement(node))break;endChop=node}while((node=node.nextSibling?node.nextSibling:node.parentNode));if(startChop.nodeName=="TD")startChop=startChop.firstChild;if(endChop.nodeName=="TD")endChop=endChop.lastChild;if(startBlock==null){rng.deleteContents();if(!tinyMCE.isSafari)sel.removeAllRanges();if(startChop!=rootElm&&endChop!=rootElm){rngBefore=rng.cloneRange();if(startChop==body)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);paraBefore.appendChild(rngBefore.cloneContents());if(endChop.parentNode.nodeName==blockName)endChop=endChop.parentNode;rng.setEndAfter(endChop);if(endChop.nodeName!="#text"&&endChop.nodeName!="BODY")rngBefore.setEndAfter(endChop);contents=rng.cloneContents();if(contents.firstChild&&(contents.firstChild.nodeName==blockName||contents.firstChild.nodeName=="BODY"))paraAfter.innerHTML=contents.firstChild.innerHTML;else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML="&nbsp;";if(isEmpty(paraAfter))paraAfter.innerHTML="&nbsp;";rng.deleteContents();rngAfter.deleteContents();rngBefore.deleteContents();if(tinyMCE.isOpera){paraBefore.normalize();rngBefore.insertNode(paraBefore);paraAfter.normalize();rngBefore.insertNode(paraAfter)}else{paraAfter.normalize();rngBefore.insertNode(paraAfter);paraBefore.normalize();rngBefore.insertNode(paraBefore)}}else{body.innerHTML="<"+blockName+">&nbsp;</"+blockName+"><"+blockName+">&nbsp;</"+blockName+">";paraAfter=body.childNodes[1]}inst.selection.moveToBookmark(b);inst.selection.selectNode(paraAfter,true,true);return true}if(startChop.nodeName==blockName)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);rngBefore.setEnd(startNode,startOffset);paraBefore.appendChild(rngBefore.cloneContents());rngAfter.setEndAfter(endChop);rngAfter.setStart(endNode,endOffset);contents=rngAfter.cloneContents();if(contents.firstChild&&contents.firstChild.nodeName==blockName){paraAfter.innerHTML=contents.firstChild.innerHTML}else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML="&nbsp;";if(isEmpty(paraAfter))paraAfter.innerHTML="&nbsp;";rng=doc.createRange();if(!startChop.previousSibling&&startChop.parentNode.nodeName.toUpperCase()==blockName){rng.setStartBefore(startChop.parentNode)}else{if(rngBefore.startContainer.nodeName.toUpperCase()==blockName&&rngBefore.startOffset==0)rng.setStartBefore(rngBefore.startContainer);else rng.setStart(rngBefore.startContainer,rngBefore.startOffset)}if(!endChop.nextSibling&&endChop.parentNode.nodeName.toUpperCase()==blockName)rng.setEndAfter(endChop.parentNode);else rng.setEnd(rngAfter.endContainer,rngAfter.endOffset);rng.deleteContents();if(tinyMCE.isOpera){rng.insertNode(paraBefore);rng.insertNode(paraAfter)}else{rng.insertNode(paraAfter);rng.insertNode(paraBefore)}paraAfter.normalize();paraBefore.normalize();inst.selection.moveToBookmark(b);inst.selection.selectNode(paraAfter,true,true);return true},_handleBackSpace:function(inst){var r=inst.getRng(),sn=r.startContainer,nv,s=false;if(sn&&sn.nextSibling&&sn.nextSibling.nodeName=="BR"&&sn.parentNode.nodeName!="BODY"){nv=sn.nodeValue;if(nv!=null&&r.startOffset==nv.length)sn.nextSibling.parentNode.removeChild(sn.nextSibling)}if(inst.settings.auto_resize)inst.resizeToContent();return s}};function TinyMCE_Layer(id,bm){this.id=id;this.blockerElement=null;this.events=false;this.element=null;this.blockMode=typeof(bm)!='undefined'?bm:true;this.doc=document};TinyMCE_Layer.prototype={moveRelativeTo:function(re,p){var rep=this.getAbsPosition(re),e=this.getElement(),x,y;var w=parseInt(re.offsetWidth),h=parseInt(re.offsetHeight);var ew=parseInt(e.offsetWidth),eh=parseInt(e.offsetHeight);switch(p){case"tl":x=rep.absLeft;y=rep.absTop;break;case"tr":x=rep.absLeft+w;y=rep.absTop;break;case"bl":x=rep.absLeft;y=rep.absTop+h;break;case"br":x=rep.absLeft+w;y=rep.absTop+h;break;case"cc":x=rep.absLeft+(w/ 2) - (ew /2);y=rep.absTop+(h/ 2) - (eh /2);break}this.moveTo(x,y)},moveBy:function(x,y){var e=this.getElement();this.moveTo(parseInt(e.style.left)+x,parseInt(e.style.top)+y)},moveTo:function(x,y){var e=this.getElement();e.style.left=x+"px";e.style.top=y+"px";this.updateBlocker()},resizeBy:function(w,h){var e=this.getElement();this.resizeTo(parseInt(e.style.width)+w,parseInt(e.style.height)+h)},resizeTo:function(w,h){var e=this.getElement();if(w!=null)e.style.width=w+"px";if(h!=null)e.style.height=h+"px";this.updateBlocker()},show:function(){var el=this.getElement();if(el){el.style.display='block';this.updateBlocker()}},hide:function(){var el=this.getElement();if(el){el.style.display='none';this.updateBlocker()}},isVisible:function(){return this.getElement().style.display=='block'},getElement:function(){if(!this.element)this.element=this.doc.getElementById(this.id);return this.element},setBlockMode:function(s){this.blockMode=s},updateBlocker:function(){var e,b,x,y,w,h;b=this.getBlocker();if(b){if(this.blockMode){e=this.getElement();x=this.parseInt(e.style.left);y=this.parseInt(e.style.top);w=this.parseInt(e.offsetWidth);h=this.parseInt(e.offsetHeight);b.style.left=x+'px';b.style.top=y+'px';b.style.width=w+'px';b.style.height=h+'px';b.style.display=e.style.display}else b.style.display='none'}},getBlocker:function(){var d,b;if(!this.blockerElement&&this.blockMode){d=this.doc;b=d.getElementById(this.id+"_blocker");if(!b){b=d.createElement("iframe");b.setAttribute('id',this.id+"_blocker");b.style.cssText='display: none; position: absolute; left: 0; top: 0';b.src='javascript:false;';b.frameBorder='0';b.scrolling='no';d.body.appendChild(b)}this.blockerElement=b}return this.blockerElement},getAbsPosition:function(n){var p={absLeft:0,absTop:0};while(n){p.absLeft+=n.offsetLeft;p.absTop+=n.offsetTop;n=n.offsetParent}return p},create:function(n,c,p,h){var d=this.doc,e=d.createElement(n);e.setAttribute('id',this.id);if(c)e.className=c;if(!p)p=d.body;if(h)e.innerHTML=h;p.appendChild(e);return this.element=e},exists:function(){return this.doc.getElementById(this.id)!=null},parseInt:function(s){if(s==null||s=='')return 0;return parseInt(s)},remove:function(){var e=this.getElement(),b=this.getBlocker();if(e)e.parentNode.removeChild(e);if(b)b.parentNode.removeChild(b)}};function TinyMCE_Menu(){var id;if(typeof(tinyMCE.menuCounter)=="undefined")tinyMCE.menuCounter=0;id="mc_menu_"+tinyMCE.menuCounter++;TinyMCE_Layer.call(this,id,true);this.id=id;this.items=[];this.needsUpdate=true};TinyMCE_Menu.prototype=tinyMCE.extend(TinyMCE_Layer.prototype,{init:function(s){var n;this.settings={separator_class:'mceMenuSeparator',title_class:'mceMenuTitle',disabled_class:'mceMenuDisabled',menu_class:'mceMenu',drop_menu:true};for(n in s)this.settings[n]=s[n];this.create('div',this.settings.menu_class)},clear:function(){this.items=[]},addTitle:function(t){this.add({type:'title',text:t})},addDisabled:function(t){this.add({type:'disabled',text:t})},addSeparator:function(){this.add({type:'separator'})},addItem:function(t,js){this.add({text:t,js:js})},add:function(mi){this.items[this.items.length]=mi;this.needsUpdate=true},update:function(){var e=this.getElement(),h='',i,t,m=this.items,s=this.settings;if(this.settings.drop_menu)h+='<span class="mceMenuLine"></span>';h+='<table border="0" cellpadding="0" cellspacing="0">';for(i=0;i<m.length;i++){t=tinyMCE.xmlEncode(m[i].text);c=m[i].class_name?' class="'+m[i].class_name+'"':'';switch(m[i].type){case'separator':h+='<tr class="'+s.separator_class+'"><td>';break;case'title':h+='<tr class="'+s.title_class+'"><td><span'+c+'>'+t+'</span>';break;case'disabled':h+='<tr class="'+s.disabled_class+'"><td><span'+c+'>'+t+'</span>';break;default:h+='<tr><td><a href="'+tinyMCE.xmlEncode(m[i].js)+'" onmousedown="'+tinyMCE.xmlEncode(m[i].js)+';return tinyMCE.cancelEvent(event);" onclick="return tinyMCE.cancelEvent(event);" onmouseup="return tinyMCE.cancelEvent(event);"><span'+c+'>'+t+'</span></a>'}h+='</td></tr>'}h+='</table>';e.innerHTML=h;this.needsUpdate=false;this.updateBlocker()},show:function(){var nl,i;if(tinyMCE.lastMenu==this)return;if(this.needsUpdate)this.update();if(tinyMCE.lastMenu&&tinyMCE.lastMenu!=this)tinyMCE.lastMenu.hide();TinyMCE_Layer.prototype.show.call(this);if(!tinyMCE.isOpera){}tinyMCE.lastMenu=this}});tinyMCE.add(TinyMCE_Engine,{debug:function(){var m="",a,i,l=tinyMCE.log.length;for(i=0,a=this.debug.arguments;i<a.length;i++){m+=a[i];if(i<a.length-1)m+=', '}if(l<1000)tinyMCE.log[l]="[debug] "+m}});
\ No newline at end of file
index eecad28f5a534d1b9975d94e2e0ac881c3966c85..306a021d56be4a364dc3bdf8a4ca8e4485696c14 100644 (file)
-// Some global instances, this will be filled later\r
-var tinyMCE = null, tinyMCELang = null;\r
-\r
-function TinyMCE_Popup() {\r
-};\r
-\r
-TinyMCE_Popup.prototype = {\r
-       findWin : function(w) {\r
-               var c;\r
-\r
-               // Check parents\r
-               c = w;\r
-               while (c && (c = c.parent) != null) {\r
-                       if (typeof(c.tinyMCE) != "undefined")\r
-                               return c;\r
-               }\r
-\r
-               // Check openers\r
-               c = w;\r
-               while (c && (c = c.opener) != null) {\r
-                       if (typeof(c.tinyMCE) != "undefined")\r
-                               return c;\r
-               }\r
-\r
-               // Try top\r
-               if (typeof(top.tinyMCE) != "undefined")\r
-                       return top;\r
-\r
-               return null;\r
-       },\r
-\r
-       init : function() {\r
-               var win = window.opener ? window.opener : window.dialogArguments, c;\r
-               var inst, re, title, divElm;\r
-\r
-               if (!win)\r
-                       win = this.findWin(window);\r
-\r
-               if (!win) {\r
-                       alert("tinyMCE object reference not found from popup.");\r
-                       return;\r
-               }\r
-\r
-               window.opener = win;\r
-               this.windowOpener = win;\r
-               this.onLoadEval = "";\r
-\r
-               // Setup parent references\r
-               tinyMCE = win.tinyMCE;\r
-               tinyMCELang = win.tinyMCELang;\r
-\r
-               inst = tinyMCE.selectedInstance;\r
-               this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;\r
-               this.storeSelection = (tinyMCE.isRealIE) && !this.isWindow && tinyMCE.getWindowArg('mce_store_selection', true);\r
-\r
-               if (this.isWindow)\r
-                       window.focus();\r
-\r
-               // Store selection\r
-               if (this.storeSelection)\r
-                       inst.selectionBookmark = inst.selection.getBookmark(true);\r
-\r
-               // Setup dir\r
-               if (tinyMCELang.lang_dir)\r
-                       document.dir = tinyMCELang.lang_dir;\r
-\r
-               // Setup title\r
-               re = new RegExp('{|\\\$|}', 'g');\r
-               title = document.title.replace(re, "");\r
-               if (typeof(tinyMCELang[title]) != "undefined") {\r
-                       divElm = document.createElement("div");\r
-                       divElm.innerHTML = tinyMCELang[title];\r
-                       document.title = divElm.innerHTML;\r
-\r
-                       if (typeof(tinyMCE.setWindowTitle) != 'undefined')\r
-                               tinyMCE.setWindowTitle(window, divElm.innerHTML);\r
-               }\r
-\r
-               // Output Popup CSS class\r
-               document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');\r
-\r
-               if (tinyMCE.getParam("popups_css_add")) {\r
-                       c = tinyMCE.getParam("popups_css_add");\r
-\r
-                       // Is relative\r
-                       if (c.indexOf('://') == -1 && c.charAt(0) != '/')\r
-                               c = tinyMCE.documentBasePath + "/" + c;\r
-\r
-                       document.write('<link href="' + c + '" rel="stylesheet" type="text/css">');\r
-               }\r
-\r
-               tinyMCE.addEvent(window, "load", this.onLoad);\r
-       },\r
-\r
-       onLoad : function() {\r
-               var dir, i, elms, body = document.body;\r
-\r
-               if (tinyMCE.getWindowArg('mce_replacevariables', true))\r
-                       body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);\r
-\r
-               dir = tinyMCE.selectedInstance.settings.directionality;\r
-               if (dir == "rtl" && document.forms && document.forms.length > 0) {\r
-                       elms = document.forms[0].elements;\r
-                       for (i=0; i<elms.length; i++) {\r
-                               if ((elms[i].type == "text" || elms[i].type == "textarea") && elms[i].getAttribute("dir") != "ltr")\r
-                                       elms[i].dir = dir;\r
-                       }\r
-               }\r
-\r
-               if (body.style.display == 'none')\r
-                       body.style.display = 'block';\r
-\r
-               // Execute real onload (Opera fix)\r
-               if (tinyMCEPopup.onLoadEval !== '')\r
-                       eval(tinyMCEPopup.onLoadEval);\r
-       },\r
-\r
-       executeOnLoad : function(str) {\r
-               if (tinyMCE.isOpera)\r
-                       this.onLoadEval = str;\r
-               else\r
-                       eval(str);\r
-       },\r
-\r
-       resizeToInnerSize : function() {\r
-               var i, doc, body, oldMargin, wrapper, iframe, nodes, dx, dy;\r
-\r
-               // Netscape 7.1 workaround\r
-               if (this.isWindow && tinyMCE.isNS71) {\r
-                       window.resizeBy(0, 10);\r
-                       return;\r
-               }\r
-\r
-               if (this.isWindow) {\r
-                       doc = document;\r
-                       body = doc.body;\r
-\r
-                       if (body.style.display == 'none')\r
-                               body.style.display = 'block';\r
-\r
-                       // Remove margin\r
-                       oldMargin = body.style.margin;\r
-                       body.style.margin = '0';\r
-\r
-                       // Create wrapper\r
-                       wrapper = doc.createElement("div");\r
-                       wrapper.id = 'mcBodyWrapper';\r
-                       wrapper.style.display = 'none';\r
-                       wrapper.style.margin = '0';\r
-\r
-                       // Wrap body elements\r
-                       nodes = doc.body.childNodes;\r
-                       for (i=nodes.length-1; i>=0; i--) {\r
-                               if (wrapper.hasChildNodes())\r
-                                       wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);\r
-                               else\r
-                                       wrapper.appendChild(nodes[i].cloneNode(true));\r
-\r
-                               nodes[i].parentNode.removeChild(nodes[i]);\r
-                       }\r
-\r
-                       // Add wrapper\r
-                       doc.body.appendChild(wrapper);\r
-\r
-                       // Create iframe\r
-                       iframe = document.createElement("iframe");\r
-                       iframe.id = "mcWinIframe";\r
-                       iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings.default_document;\r
-                       iframe.width = "100%";\r
-                       iframe.height = "100%";\r
-                       iframe.style.margin = '0';\r
-\r
-                       // Add iframe\r
-                       doc.body.appendChild(iframe);\r
-\r
-                       // Measure iframe\r
-                       iframe = document.getElementById('mcWinIframe');\r
-                       dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth;\r
-                       dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight;\r
-\r
-                       // Resize window\r
-                       // tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);\r
-                       window.resizeBy(dx, dy);\r
-\r
-                       // Hide iframe and show wrapper\r
-                       body.style.margin = oldMargin;\r
-                       iframe.style.display = 'none';\r
-                       wrapper.style.display = 'block';\r
-               }\r
-       },\r
-\r
-       resizeToContent : function() {\r
-               var isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
-               var isOpera = (navigator.userAgent.indexOf("Opera") != -1);\r
-               var elm, width, height, x, y, dx, dy;\r
-\r
-               if (isOpera)\r
-                       return;\r
-\r
-               if (isMSIE) {\r
-                       try { window.resizeTo(10, 10); } catch (e) {}\r
-\r
-                       elm = document.body;\r
-                       width = elm.offsetWidth;\r
-                       height = elm.offsetHeight;\r
-                       dx = (elm.scrollWidth - width) + 4;\r
-                       dy = elm.scrollHeight - height;\r
-\r
-                       try { window.resizeBy(dx, dy); } catch (e) {}\r
-               } else {\r
-                       window.scrollBy(1000, 1000);\r
-                       if (window.scrollX > 0 || window.scrollY > 0) {\r
-                               window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);\r
-                               window.sizeToContent();\r
-                               window.scrollTo(0, 0);\r
-                               x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);\r
-                               y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);\r
-                               window.moveTo(x, y);\r
-                       }\r
-               }\r
-       },\r
-\r
-       getWindowArg : function(name, default_value) {\r
-               return tinyMCE.getWindowArg(name, default_value);\r
-       },\r
-\r
-       restoreSelection : function() {\r
-               var inst;\r
-\r
-               if (this.storeSelection) {\r
-                       inst = tinyMCE.selectedInstance;\r
-\r
-                       inst.getWin().focus();\r
-\r
-                       if (inst.selectionBookmark)\r
-                               inst.selection.moveToBookmark(inst.selectionBookmark);\r
-               }\r
-       },\r
-\r
-       execCommand : function(command, user_interface, value) {\r
-               var inst = tinyMCE.selectedInstance;\r
-\r
-               this.restoreSelection();\r
-               inst.execCommand(command, user_interface, value);\r
-\r
-               // Store selection\r
-               if (this.storeSelection)\r
-                       inst.selectionBookmark = inst.selection.getBookmark(true);\r
-       },\r
-\r
-       close : function() {\r
-               tinyMCE.closeWindow(window);\r
-       },\r
-\r
-       pickColor : function(e, element_id) {\r
-               tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {\r
-                       element_id : element_id,\r
-                       document : document,\r
-                       window : window,\r
-                       store_selection : false\r
-               });\r
-       },\r
-\r
-       openBrowser : function(element_id, type, option) {\r
-               var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));\r
-               var url = document.getElementById(element_id).value;\r
-\r
-               tinyMCE.setWindowArg("window", window);\r
-               tinyMCE.setWindowArg("document", document);\r
-\r
-               // Call to external callback\r
-               if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")\r
-                       alert("Callback function: " + cb + " could not be found.");\r
-               else\r
-                       eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");\r
-       },\r
-\r
-       importClass : function(c) {\r
-               var n;\r
-\r
-               window[c] = function() {};\r
-\r
-               for (n in window.opener[c].prototype)\r
-                       window[c].prototype[n] = window.opener[c].prototype[n];\r
-\r
-               window[c].constructor = window.opener[c].constructor;\r
-       }\r
-\r
-       };\r
-\r
-// Setup global instance\r
-var tinyMCEPopup = new TinyMCE_Popup();\r
-\r
-tinyMCEPopup.init();\r
+// Some global instances, this will be filled later
+var tinyMCE = null, tinyMCELang = null;
+
+function TinyMCE_Popup() {
+};
+
+TinyMCE_Popup.prototype = {
+       findWin : function(w) {
+               var c;
+
+               // Check parents
+               c = w;
+               while (c && (c = c.parent) != null) {
+                       if (typeof(c.tinyMCE) != "undefined")
+                               return c;
+               }
+
+               // Check openers
+               c = w;
+               while (c && (c = c.opener) != null) {
+                       if (typeof(c.tinyMCE) != "undefined")
+                               return c;
+               }
+
+               // Try top
+               if (typeof(top.tinyMCE) != "undefined")
+                       return top;
+
+               return null;
+       },
+
+       init : function() {
+               var win = window.opener ? window.opener : window.dialogArguments, c;
+               var inst, re, title, divElm;
+
+               if (!win)
+                       win = this.findWin(window);
+
+               if (!win) {
+                       alert("tinyMCE object reference not found from popup.");
+                       return;
+               }
+
+               window.opener = win;
+               this.windowOpener = win;
+               this.onLoadEval = "";
+
+               // Setup parent references
+               tinyMCE = win.tinyMCE;
+               tinyMCELang = win.tinyMCELang;
+
+               inst = tinyMCE.selectedInstance;
+               this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;
+               this.storeSelection = (tinyMCE.isRealIE) && !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
+               re = new RegExp('{|\\\$|}', 'g');
+               title = document.title.replace(re, "");
+               if (typeof(tinyMCELang[title]) != "undefined") {
+                       divElm = document.createElement("div");
+                       divElm.innerHTML = tinyMCELang[title];
+                       document.title = divElm.innerHTML;
+
+                       if (typeof(tinyMCE.setWindowTitle) != 'undefined')
+                               tinyMCE.setWindowTitle(window, divElm.innerHTML);
+               }
+
+               // Output Popup CSS class
+               document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');
+
+               if (tinyMCE.getParam("popups_css_add")) {
+                       c = tinyMCE.getParam("popups_css_add");
+
+                       // Is relative
+                       if (c.indexOf('://') == -1 && c.charAt(0) != '/')
+                               c = tinyMCE.documentBasePath + "/" + c;
+
+                       document.write('<link href="' + c + '" rel="stylesheet" type="text/css">');
+               }
+
+               tinyMCE.addEvent(window, "load", this.onLoad);
+       },
+
+       onLoad : function() {
+               var dir, i, elms, body = document.body;
+
+               if (tinyMCE.getWindowArg('mce_replacevariables', true))
+                       body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);
+
+               dir = tinyMCE.selectedInstance.settings.directionality;
+               if (dir == "rtl" && document.forms && document.forms.length > 0) {
+                       elms = document.forms[0].elements;
+                       for (i=0; i<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);
+       },
+
+       executeOnLoad : function(str) {
+               if (tinyMCE.isOpera && parseFloat(opera.version()) < 9.5)
+                       this.onLoadEval = str;
+               else
+                       eval(str);
+       },
+
+       resizeToInnerSize : function() {
+               var i, doc, body, oldMargin, wrapper, iframe, nodes, dx, dy;
+
+               // Netscape 7.1 workaround
+               if (this.isWindow && tinyMCE.isNS71) {
+                       window.resizeBy(0, 10);
+                       return;
+               }
+
+               if (this.isWindow) {
+                       doc = document;
+                       body = doc.body;
+
+                       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 (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';
+               }
+       },
+
+       resizeToContent : function() {
+               var isMSIE = (navigator.appName == "Microsoft Internet Explorer");
+               var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
+               var elm, width, height, x, y, dx, dy;
+
+               if (isOpera)
+                       return;
+
+               if (isMSIE) {
+                       try { window.resizeTo(10, 10); } catch (e) {}
+
+                       elm = document.body;
+                       width = elm.offsetWidth;
+                       height = elm.offsetHeight;
+                       dx = (elm.scrollWidth - width) + 4;
+                       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);
+                               x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);
+                               y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);
+                               window.moveTo(x, y);
+                       }
+               }
+       },
+
+       getWindowArg : function(name, default_value) {
+               return tinyMCE.getWindowArg(name, default_value);
+       },
+
+       restoreSelection : function() {
+               var inst;
+
+               if (this.storeSelection) {
+                       inst = tinyMCE.selectedInstance;
+
+                       inst.getWin().focus();
+
+                       if (inst.selectionBookmark)
+                               inst.selection.moveToBookmark(inst.selectionBookmark);
+               }
+       },
+
+       execCommand : function(command, user_interface, value) {
+               var inst = tinyMCE.selectedInstance;
+
+               this.restoreSelection();
+               inst.execCommand(command, user_interface, value);
+
+               // Store selection
+               if (this.storeSelection)
+                       inst.selectionBookmark = inst.selection.getBookmark(true);
+       },
+
+       close : function() {
+               tinyMCE.closeWindow(window);
+       },
+
+       pickColor : function(e, element_id) {
+               tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {
+                       element_id : element_id,
+                       document : document,
+                       window : window,
+                       store_selection : false
+               });
+       },
+
+       openBrowser : function(element_id, type, option) {
+               var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
+               var url = document.getElementById(element_id).value;
+
+               tinyMCE.setWindowArg("window", window);
+               tinyMCE.setWindowArg("document", document);
+
+               // Call to external callback
+               if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")
+                       alert("Callback function: " + cb + " could not be found.");
+               else
+                       eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");
+       },
+
+       importClass : function(c) {
+               var n;
+
+               window[c] = function() {};
+
+               for (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();
index ba713a897ed45aa3dc4e561ea3bae9b91a16f0d7..d14c858001ddc8ff06b01fc84db37df3ecf9eb8f 100644 (file)
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_Engine.class.js */\r
-\r
-function TinyMCE_Engine() {\r
-       var ua;\r
-\r
-       this.majorVersion = "2";\r
-       this.minorVersion = "1.1.1";\r
-       this.releaseDate = "2007-05-14";\r
-\r
-       this.instances = [];\r
-       this.switchClassCache = [];\r
-       this.windowArgs = [];\r
-       this.loadedFiles = [];\r
-       this.pendingFiles = [];\r
-       this.loadingIndex = 0;\r
-       this.configs = [];\r
-       this.currentConfig = 0;\r
-       this.eventHandlers = [];\r
-       this.log = [];\r
-       this.undoLevels = [];\r
-       this.undoIndex = 0;\r
-       this.typingUndoIndex = -1;\r
-       this.settings = [];\r
-\r
-       // Browser check\r
-       ua = navigator.userAgent;\r
-       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
-       this.isMSIE5 = this.isMSIE && (ua.indexOf('MSIE 5') != -1);\r
-       this.isMSIE5_0 = this.isMSIE && (ua.indexOf('MSIE 5.0') != -1);\r
-       this.isMSIE7 = this.isMSIE && (ua.indexOf('MSIE 7') != -1);\r
-       this.isGecko = ua.indexOf('Gecko') != -1; // Will also be true on Safari\r
-       this.isSafari = ua.indexOf('Safari') != -1;\r
-       this.isOpera = window['opera'] && opera.buildNumber ? true : false;\r
-       this.isMac = ua.indexOf('Mac') != -1;\r
-       this.isNS7 = ua.indexOf('Netscape/7') != -1;\r
-       this.isNS71 = ua.indexOf('Netscape/7.1') != -1;\r
-       this.dialogCounter = 0;\r
-       this.plugins = [];\r
-       this.themes = [];\r
-       this.menus = [];\r
-       this.loadedPlugins = [];\r
-       this.buttonMap = [];\r
-       this.isLoaded = false;\r
-\r
-       // Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those\r
-       if (this.isOpera) {\r
-               this.isMSIE = true;\r
-               this.isGecko = false;\r
-               this.isSafari =  false;\r
-       }\r
-\r
-       this.isIE = this.isMSIE;\r
-       this.isRealIE = this.isMSIE && !this.isOpera;\r
-\r
-       // TinyMCE editor id instance counter\r
-       this.idCounter = 0;\r
-};\r
-\r
-TinyMCE_Engine.prototype = {\r
-       init : function(settings) {\r
-               var theme, nl, baseHREF = "", i, cssPath, entities, h, p, src, elements = [], head;\r
-\r
-               // IE 5.0x is no longer supported since 5.5, 6.0 and 7.0 now exists. We can't support old browsers forever, sorry.\r
-               if (this.isMSIE5_0)\r
-                       return;\r
-\r
-               this.settings = settings;\r
-\r
-               // Check if valid browser has execcommand support\r
-               if (typeof(document.execCommand) == 'undefined')\r
-                       return;\r
-\r
-               // Get script base path\r
-               if (!tinyMCE.baseURL) {\r
-                       // Search through head\r
-                       head = document.getElementsByTagName('head')[0];\r
-\r
-                       if (head) {\r
-                               for (i=0, nl = head.getElementsByTagName('script'); i<nl.length; i++)\r
-                                       elements.push(nl[i]);\r
-                       }\r
-\r
-                       // Search through rest of document\r
-                       for (i=0, nl = document.getElementsByTagName('script'); i<nl.length; i++)\r
-                               elements.push(nl[i]);\r
-\r
-                       // If base element found, add that infront of baseURL\r
-                       nl = document.getElementsByTagName('base');\r
-                       for (i=0; i<nl.length; i++) {\r
-                               if (nl[i].href)\r
-                                       baseHREF = nl[i].href;\r
-                       }\r
-\r
-                       for (i=0; i<elements.length; i++) {\r
-                               if (elements[i].src && (elements[i].src.indexOf("tiny_mce.js") != -1 || elements[i].src.indexOf("tiny_mce_dev.js") != -1 || elements[i].src.indexOf("tiny_mce_src.js") != -1 || elements[i].src.indexOf("tiny_mce_gzip") != -1)) {\r
-                                       src = elements[i].src;\r
-\r
-                                       tinyMCE.srcMode = (src.indexOf('_src') != -1 || src.indexOf('_dev') != -1) ? '_src' : '';\r
-                                       tinyMCE.gzipMode = src.indexOf('_gzip') != -1;\r
-                                       src = src.substring(0, src.lastIndexOf('/'));\r
-\r
-                                       if (settings.exec_mode == "src" || settings.exec_mode == "normal")\r
-                                               tinyMCE.srcMode = settings.exec_mode == "src" ? '_src' : '';\r
-\r
-                                       // Force it absolute if page has a base href\r
-                                       if (baseHREF !== '' && src.indexOf('://') == -1)\r
-                                               tinyMCE.baseURL = baseHREF + src;\r
-                                       else\r
-                                               tinyMCE.baseURL = src;\r
-\r
-                                       break;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               // Get document base path\r
-               this.documentBasePath = document.location.href;\r
-               if (this.documentBasePath.indexOf('?') != -1)\r
-                       this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.indexOf('?'));\r
-               this.documentURL = this.documentBasePath;\r
-               this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.lastIndexOf('/'));\r
-\r
-               // If not HTTP absolute\r
-               if (tinyMCE.baseURL.indexOf('://') == -1 && tinyMCE.baseURL.charAt(0) != '/') {\r
-                       // If site absolute\r
-                       tinyMCE.baseURL = this.documentBasePath + "/" + tinyMCE.baseURL;\r
-               }\r
-\r
-               // Set default values on settings\r
-               this._def("mode", "none");\r
-               this._def("theme", "advanced");\r
-               this._def("plugins", "", true);\r
-               this._def("language", "en");\r
-               this._def("docs_language", this.settings.language);\r
-               this._def("elements", "");\r
-               this._def("textarea_trigger", "mce_editable");\r
-               this._def("editor_selector", "");\r
-               this._def("editor_deselector", "mceNoEditor");\r
-               this._def("valid_elements", "+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],cite[title|id|class|style|dir|lang],abbr[title|id|class|style|dir|lang],acronym[title|id|class|style|dir|lang],del[title|id|class|style|dir|lang|datetime|cite],ins[title|id|class|style|dir|lang|datetime|cite]");\r
-               this._def("extended_valid_elements", "");\r
-               this._def("invalid_elements", "");\r
-               this._def("encoding", "");\r
-               this._def("urlconverter_callback", tinyMCE.getParam("urlconvertor_callback", "TinyMCE_Engine.prototype.convertURL"));\r
-               this._def("save_callback", "");\r
-               this._def("force_br_newlines", false);\r
-               this._def("force_p_newlines", true);\r
-               this._def("add_form_submit_trigger", true);\r
-               this._def("relative_urls", true);\r
-               this._def("remove_script_host", true);\r
-               this._def("focus_alert", true);\r
-               this._def("document_base_url", this.documentURL);\r
-               this._def("visual", true);\r
-               this._def("visual_table_class", "mceVisualAid");\r
-               this._def("setupcontent_callback", "");\r
-               this._def("fix_content_duplication", true);\r
-               this._def("custom_undo_redo", true);\r
-               this._def("custom_undo_redo_levels", -1);\r
-               this._def("custom_undo_redo_keyboard_shortcuts", true);\r
-               this._def("custom_undo_redo_restore_selection", true);\r
-               this._def("custom_undo_redo_global", false);\r
-               this._def("verify_html", true);\r
-               this._def("apply_source_formatting", false);\r
-               this._def("directionality", "ltr");\r
-               this._def("cleanup_on_startup", false);\r
-               this._def("inline_styles", false);\r
-               this._def("convert_newlines_to_brs", false);\r
-               this._def("auto_reset_designmode", true);\r
-               this._def("entities", "39,#39,160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,34,quot,38,amp,60,lt,62,gt,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro", true);\r
-               this._def("entity_encoding", "named");\r
-               this._def("cleanup_callback", "");\r
-               this._def("add_unload_trigger", true);\r
-               this._def("ask", false);\r
-               this._def("nowrap", false);\r
-               this._def("auto_resize", false);\r
-               this._def("auto_focus", false);\r
-               this._def("cleanup", true);\r
-               this._def("remove_linebreaks", true);\r
-               this._def("button_tile_map", false);\r
-               this._def("submit_patch", true);\r
-               this._def("browsers", "msie,safari,gecko,opera", true);\r
-               this._def("dialog_type", "window");\r
-               this._def("accessibility_warnings", true);\r
-               this._def("accessibility_focus", true);\r
-               this._def("merge_styles_invalid_parents", "");\r
-               this._def("force_hex_style_colors", true);\r
-               this._def("trim_span_elements", true);\r
-               this._def("convert_fonts_to_spans", false);\r
-               this._def("doctype", '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');\r
-               this._def("font_size_classes", '');\r
-               this._def("font_size_style_values", 'xx-small,x-small,small,medium,large,x-large,xx-large', true);\r
-               this._def("event_elements", 'a,img', true);\r
-               this._def("convert_urls", true);\r
-               this._def("table_inline_editing", false);\r
-               this._def("object_resizing", true);\r
-               this._def("custom_shortcuts", true);\r
-               this._def("convert_on_click", false);\r
-               this._def("content_css", '');\r
-               this._def("fix_list_elements", true);\r
-               this._def("fix_table_elements", false);\r
-               this._def("strict_loading_mode", document.contentType == 'application/xhtml+xml');\r
-               this._def("hidden_tab_class", '');\r
-               this._def("display_tab_class", '');\r
-               this._def("gecko_spellcheck", false);\r
-               this._def("hide_selects_on_submit", true);\r
-               this._def("forced_root_block", false);\r
-               this._def("remove_trailing_nbsp", false);\r
-\r
-               // Force strict loading mode to false on non Gecko browsers\r
-               if (this.isMSIE && !this.isOpera)\r
-                       this.settings.strict_loading_mode = false;\r
-\r
-               // Browser check IE\r
-               if (this.isMSIE && this.settings.browsers.indexOf('msie') == -1)\r
-                       return;\r
-\r
-               // Browser check Gecko\r
-               if (this.isGecko && this.settings.browsers.indexOf('gecko') == -1)\r
-                       return;\r
-\r
-               // Browser check Safari\r
-               if (this.isSafari && this.settings.browsers.indexOf('safari') == -1)\r
-                       return;\r
-\r
-               // Browser check Opera\r
-               if (this.isOpera && this.settings.browsers.indexOf('opera') == -1)\r
-                       return;\r
-\r
-               // If not super absolute make it so\r
-               baseHREF = tinyMCE.settings.document_base_url;\r
-               h = document.location.href;\r
-               p = h.indexOf('://');\r
-               if (p > 0 && document.location.protocol != "file:") {\r
-                       p = h.indexOf('/', p + 3);\r
-                       h = h.substring(0, p);\r
-\r
-                       if (baseHREF.indexOf('://') == -1)\r
-                               baseHREF = h + baseHREF;\r
-\r
-                       tinyMCE.settings.document_base_url = baseHREF;\r
-                       tinyMCE.settings.document_base_prefix = h;\r
-               }\r
-\r
-               // Trim away query part\r
-               if (baseHREF.indexOf('?') != -1)\r
-                       baseHREF = baseHREF.substring(0, baseHREF.indexOf('?'));\r
-\r
-               this.settings.base_href = baseHREF.substring(0, baseHREF.lastIndexOf('/')) + "/";\r
-\r
-               theme = this.settings.theme;\r
-               this.inlineStrict = 'A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';\r
-               this.inlineTransitional = 'A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';\r
-               this.blockElms = 'H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';\r
-               this.blockRegExp = new RegExp("^(" + this.blockElms + ")$", "i");\r
-               this.posKeyCodes = [13,45,36,35,33,34,37,38,39,40];\r
-               this.uniqueURL = 'javascript:void(091039730);'; // Make unique URL non real URL\r
-               this.uniqueTag = '<div id="mceTMPElement" style="display: none">TMP</div>';\r
-               this.callbacks = ['onInit', 'getInfo', 'getEditorTemplate', 'setupContent', 'onChange', 'onPageLoad', 'handleNodeChange', 'initInstance', 'execCommand', 'getControlHTML', 'handleEvent', 'cleanup', 'removeInstance'];\r
-\r
-               // Theme url\r
-               this.settings.theme_href = tinyMCE.baseURL + "/themes/" + theme;\r
-\r
-               if (!tinyMCE.isIE || tinyMCE.isOpera)\r
-                       this.settings.force_br_newlines = false;\r
-\r
-               if (tinyMCE.getParam("popups_css", false)) {\r
-                       cssPath = tinyMCE.getParam("popups_css", "");\r
-\r
-                       // Is relative\r
-                       if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')\r
-                               this.settings.popups_css = this.documentBasePath + "/" + cssPath;\r
-                       else\r
-                               this.settings.popups_css = cssPath;\r
-               } else\r
-                       this.settings.popups_css = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_popup.css";\r
-\r
-               if (tinyMCE.getParam("editor_css", false)) {\r
-                       cssPath = tinyMCE.getParam("editor_css", "");\r
-\r
-                       // Is relative\r
-                       if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')\r
-                               this.settings.editor_css = this.documentBasePath + "/" + cssPath;\r
-                       else\r
-                               this.settings.editor_css = cssPath;\r
-               } else {\r
-                       if (this.settings.editor_css !== '')\r
-                               this.settings.editor_css = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_ui.css";\r
-               }\r
-\r
-               // Only do this once\r
-               if (this.configs.length == 0) {\r
-                       if (typeof(TinyMCECompressed) == "undefined") {\r
-                               tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCE_Engine.prototype.onLoad);\r
-\r
-                               if (tinyMCE.isRealIE) {\r
-                                       if (document.body)\r
-                                               tinyMCE.addEvent(document.body, "readystatechange", TinyMCE_Engine.prototype.onLoad);\r
-                                       else\r
-                                               tinyMCE.addEvent(document, "readystatechange", TinyMCE_Engine.prototype.onLoad);\r
-                               }\r
-\r
-                               tinyMCE.addEvent(window, "load", TinyMCE_Engine.prototype.onLoad);\r
-                               tinyMCE._addUnloadEvents();\r
-                       }\r
-               }\r
-\r
-               this.loadScript(tinyMCE.baseURL + '/themes/' + this.settings.theme + '/editor_template' + tinyMCE.srcMode + '.js');\r
-               this.loadScript(tinyMCE.baseURL + '/langs/' + this.settings.language +  '.js');\r
-               this.loadCSS(this.settings.editor_css);\r
-\r
-               // Add plugins\r
-               p = tinyMCE.getParam('plugins', '', true, ',');\r
-               if (p.length > 0) {\r
-                       for (i=0; i<p.length; i++) {\r
-                               if (p[i].charAt(0) != '-')\r
-                                       this.loadScript(tinyMCE.baseURL + '/plugins/' + p[i] + '/editor_plugin' + tinyMCE.srcMode + '.js');\r
-                       }\r
-               }\r
-\r
-               // Setup entities\r
-               if (tinyMCE.getParam('entity_encoding') == 'named') {\r
-                       settings.cleanup_entities = [];\r
-                       entities = tinyMCE.getParam('entities', '', true, ',');\r
-                       for (i=0; i<entities.length; i+=2)\r
-                               settings.cleanup_entities['c' + entities[i]] = entities[i+1];\r
-               }\r
-\r
-               // Save away this config\r
-               settings.index = this.configs.length;\r
-               this.configs[this.configs.length] = settings;\r
-\r
-               // Start loading first one in chain\r
-               this.loadNextScript();\r
-\r
-               // Force flicker free CSS backgrounds in IE\r
-               if (this.isIE && !this.isOpera) {\r
-                       try {\r
-                               document.execCommand('BackgroundImageCache', false, true);\r
-                       } catch (e) {\r
-                               // Ignore\r
-                       }\r
-               }\r
-\r
-               // Setup XML encoding regexps\r
-               this.xmlEncodeRe = new RegExp('[<>&"]', 'g');\r
-       },\r
-\r
-       _addUnloadEvents : function() {\r
-               var st = tinyMCE.settings.add_unload_trigger;\r
-\r
-               if (tinyMCE.isIE) {\r
-                       if (st) {\r
-                               tinyMCE.addEvent(window, "unload", TinyMCE_Engine.prototype.unloadHandler);\r
-                               tinyMCE.addEvent(window.document, "beforeunload", TinyMCE_Engine.prototype.unloadHandler);\r
-                       }\r
-               } else {\r
-                       if (st)\r
-                               tinyMCE.addEvent(window, "unload", function () {tinyMCE.triggerSave(true, true);});\r
-               }\r
-       },\r
-\r
-       _def : function(key, def_val, t) {\r
-               var v = tinyMCE.getParam(key, def_val);\r
-\r
-               v = t ? v.replace(/\s+/g, "") : v;\r
-\r
-               this.settings[key] = v;\r
-       },\r
-\r
-       hasPlugin : function(n) {\r
-               return typeof(this.plugins[n]) != "undefined" && this.plugins[n] != null;\r
-       },\r
-\r
-       addPlugin : function(n, p) {\r
-               var op = this.plugins[n];\r
-\r
-               // Use the previous plugin object base URL used when loading external plugins\r
-               p.baseURL = op ? op.baseURL : tinyMCE.baseURL + "/plugins/" + n;\r
-               this.plugins[n] = p;\r
-\r
-               this.loadNextScript();\r
-       },\r
-\r
-       setPluginBaseURL : function(n, u) {\r
-               var op = this.plugins[n];\r
-\r
-               if (op)\r
-                       op.baseURL = u;\r
-               else\r
-                       this.plugins[n] = {baseURL : u};\r
-       },\r
-\r
-       loadPlugin : function(n, u) {\r
-               u = u.indexOf('.js') != -1 ? u.substring(0, u.lastIndexOf('/')) : u;\r
-               u = u.charAt(u.length-1) == '/' ? u.substring(0, u.length-1) : u;\r
-               this.plugins[n] = {baseURL : u};\r
-               this.loadScript(u + "/editor_plugin" + (tinyMCE.srcMode ? '_src' : '') + ".js");\r
-       },\r
-\r
-       hasTheme : function(n) {\r
-               return typeof(this.themes[n]) != "undefined" && this.themes[n] != null;\r
-       },\r
-\r
-       addTheme : function(n, t) {\r
-               this.themes[n] = t;\r
-\r
-               this.loadNextScript();\r
-       },\r
-\r
-       addMenu : function(n, m) {\r
-               this.menus[n] = m;\r
-       },\r
-\r
-       hasMenu : function(n) {\r
-               return typeof(this.plugins[n]) != "undefined" && this.plugins[n] != null;\r
-       },\r
-\r
-       loadScript : function(url) {\r
-               var i;\r
-\r
-               for (i=0; i<this.loadedFiles.length; i++) {\r
-                       if (this.loadedFiles[i] == url)\r
-                               return;\r
-               }\r
-\r
-               if (tinyMCE.settings.strict_loading_mode)\r
-                       this.pendingFiles[this.pendingFiles.length] = url;\r
-               else\r
-                       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></script>');\r
-\r
-               this.loadedFiles[this.loadedFiles.length] = url;\r
-       },\r
-\r
-       loadNextScript : function() {\r
-               var d = document, se;\r
-\r
-               if (!tinyMCE.settings.strict_loading_mode)\r
-                       return;\r
-\r
-               if (this.loadingIndex < this.pendingFiles.length) {\r
-                       se = d.createElementNS('http://www.w3.org/1999/xhtml', 'script');\r
-                       se.setAttribute('language', 'javascript');\r
-                       se.setAttribute('type', 'text/javascript');\r
-                       se.setAttribute('src', this.pendingFiles[this.loadingIndex++]);\r
-\r
-                       d.getElementsByTagName("head")[0].appendChild(se);\r
-               } else\r
-                       this.loadingIndex = -1; // Done with loading\r
-       },\r
-\r
-       loadCSS : function(url) {\r
-               var ar = url.replace(/\s+/, '').split(',');\r
-               var lflen = 0, csslen = 0, skip = false;\r
-               var x = 0, i = 0, nl, le;\r
-\r
-               for (x = 0,csslen = ar.length; x<csslen; x++) {\r
-                       if (ar[x] != null && ar[x] != 'null' && ar[x].length > 0) {\r
-                               /* Make sure it doesn't exist. */\r
-                               for (i=0, lflen=this.loadedFiles.length; i<lflen; i++) {\r
-                                       if (this.loadedFiles[i] == ar[x]) {\r
-                                               skip = true;\r
-                                               break;\r
-                                       }\r
-                               }\r
-\r
-                               if (!skip) {\r
-                                       if (tinyMCE.settings.strict_loading_mode) {\r
-                                               nl = document.getElementsByTagName("head");\r
-\r
-                                               le = document.createElement('link');\r
-                                               le.setAttribute('href', ar[x]);\r
-                                               le.setAttribute('rel', 'stylesheet');\r
-                                               le.setAttribute('type', 'text/css');\r
-\r
-                                               nl[0].appendChild(le);                  \r
-                                       } else\r
-                                               document.write('<link href="' + ar[x] + '" rel="stylesheet" type="text/css" />');\r
-\r
-                                       this.loadedFiles[this.loadedFiles.length] = ar[x];\r
-                               }\r
-                       }\r
-               }\r
-       },\r
-\r
-       importCSS : function(doc, css) {\r
-               var css_ary = css.replace(/\s+/, '').split(',');\r
-               var csslen, elm, headArr, x, css_file;\r
-\r
-               for (x = 0, csslen = css_ary.length; x<csslen; x++) {\r
-                       css_file = css_ary[x];\r
-\r
-                       if (css_file != null && css_file != 'null' && css_file.length > 0) {\r
-                               // Is relative, make absolute\r
-                               if (css_file.indexOf('://') == -1 && css_file.charAt(0) != '/')\r
-                                       css_file = this.documentBasePath + "/" + css_file;\r
-\r
-                               if (typeof(doc.createStyleSheet) == "undefined") {\r
-                                       elm = doc.createElement("link");\r
-\r
-                                       elm.rel = "stylesheet";\r
-                                       elm.href = css_file;\r
-\r
-                                       if ((headArr = doc.getElementsByTagName("head")) != null && headArr.length > 0)\r
-                                               headArr[0].appendChild(elm);\r
-                               } else\r
-                                       doc.createStyleSheet(css_file);\r
-                       }\r
-               }\r
-       },\r
-\r
-       confirmAdd : function(e, settings) {\r
-               var elm = tinyMCE.isIE ? event.srcElement : e.target;\r
-               var elementId = elm.name ? elm.name : elm.id;\r
-\r
-               tinyMCE.settings = settings;\r
-\r
-               if (tinyMCE.settings.convert_on_click || (!elm.getAttribute('mce_noask') && confirm(tinyMCELang.lang_edit_confirm)))\r
-                       tinyMCE.addMCEControl(elm, elementId);\r
-\r
-               elm.setAttribute('mce_noask', 'true');\r
-       },\r
-\r
-       updateContent : function(form_element_name) {\r
-               var formElement, n, inst, doc;\r
-\r
-               // Find MCE instance linked to given form element and copy it's value\r
-               formElement = document.getElementById(form_element_name);\r
-               for (n in tinyMCE.instances) {\r
-                       inst = tinyMCE.instances[n];\r
-\r
-                       if (!tinyMCE.isInstance(inst))\r
-                               continue;\r
-\r
-                       inst.switchSettings();\r
-\r
-                       if (inst.formElement == formElement) {\r
-                               doc = inst.getDoc();\r
-\r
-                               tinyMCE._setHTML(doc, inst.formElement.value);\r
-\r
-                               if (!tinyMCE.isIE)\r
-                                       doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, this.settings, doc.body, inst.visualAid);\r
-                       }\r
-               }\r
-       },\r
-\r
-       addMCEControl : function(replace_element, form_element_name, target_document) {\r
-               var id = "mce_editor_" + tinyMCE.idCounter++;\r
-               var inst = new TinyMCE_Control(tinyMCE.settings);\r
-\r
-               inst.editorId = id;\r
-               this.instances[id] = inst;\r
-\r
-               inst._onAdd(replace_element, form_element_name, target_document);\r
-       },\r
-\r
-       removeInstance : function(ti) {\r
-               var t = [], n, i;\r
-\r
-               // Remove from instances\r
-               for (n in tinyMCE.instances) {\r
-                       i = tinyMCE.instances[n];\r
-\r
-                       if (tinyMCE.isInstance(i) && ti != i)\r
-                                       t[n] = i;\r
-               }\r
-\r
-               tinyMCE.instances = t;\r
-\r
-               // Remove from global undo/redo\r
-               n = [];\r
-               t = tinyMCE.undoLevels;\r
-\r
-               for (i=0; i<t.length; i++) {\r
-                       if (t[i] != ti)\r
-                               n.push(t[i]);\r
-               }\r
-\r
-               tinyMCE.undoLevels = n;\r
-               tinyMCE.undoIndex = n.length;\r
-\r
-               // Dispatch remove instance call\r
-               tinyMCE.dispatchCallback(ti, 'remove_instance_callback', 'removeInstance', ti);\r
-\r
-               return ti;\r
-       },\r
-\r
-       removeMCEControl : function(editor_id) {\r
-               var inst = tinyMCE.getInstanceById(editor_id), h, re, ot, tn;\r
-\r
-               if (inst) {\r
-                       inst.switchSettings();\r
-\r
-                       editor_id = inst.editorId;\r
-                       h = tinyMCE.getContent(editor_id);\r
-\r
-                       this.removeInstance(inst);\r
-\r
-                       tinyMCE.selectedElement = null;\r
-                       tinyMCE.selectedInstance = null;\r
-\r
-                       // Remove element\r
-                       re = document.getElementById(editor_id + "_parent");\r
-                       ot = inst.oldTargetElement;\r
-                       tn = ot.nodeName.toLowerCase();\r
-\r
-                       if (tn == "textarea" || tn == "input") {\r
-                               re.parentNode.removeChild(re);\r
-                               ot.style.display = "inline";\r
-                               ot.value = h;\r
-                       } else {\r
-                               ot.innerHTML = h;\r
-                               ot.style.display = 'block';\r
-                               re.parentNode.insertBefore(ot, re);\r
-                               re.parentNode.removeChild(re);\r
-                       }\r
-               }\r
-       },\r
-\r
-       triggerSave : function(skip_cleanup, skip_callback) {\r
-               var inst, n;\r
-\r
-               // Default to false\r
-               if (typeof(skip_cleanup) == "undefined")\r
-                       skip_cleanup = false;\r
-\r
-               // Default to false\r
-               if (typeof(skip_callback) == "undefined")\r
-                       skip_callback = false;\r
-\r
-               // Cleanup and set all form fields\r
-               for (n in tinyMCE.instances) {\r
-                       inst = tinyMCE.instances[n];\r
-\r
-                       if (!tinyMCE.isInstance(inst))\r
-                               continue;\r
-\r
-                       inst.triggerSave(skip_cleanup, skip_callback);\r
-               }\r
-       },\r
-\r
-       resetForm : function(form_index) {\r
-               var i, inst, n, formObj = document.forms[form_index];\r
-\r
-               for (n in tinyMCE.instances) {\r
-                       inst = tinyMCE.instances[n];\r
-\r
-                       if (!tinyMCE.isInstance(inst))\r
-                               continue;\r
-\r
-                       inst.switchSettings();\r
-\r
-                       for (i=0; i<formObj.elements.length; i++) {\r
-                               if (inst.formTargetElementId == formObj.elements[i].name)\r
-                                       inst.getBody().innerHTML = inst.startContent;\r
-                       }\r
-               }\r
-       },\r
-\r
-       execInstanceCommand : function(editor_id, command, user_interface, value, focus) {\r
-               var inst = tinyMCE.getInstanceById(editor_id), r;\r
-\r
-               if (inst) {\r
-                       r = inst.selection.getRng();\r
-\r
-                       if (typeof(focus) == "undefined")\r
-                               focus = true;\r
-\r
-                       // IE bug lost focus on images in absolute divs Bug #1534575\r
-                       if (focus && (!r || !r.item))\r
-                               inst.contentWindow.focus();\r
-\r
-                       // Reset design mode if lost\r
-                       inst.autoResetDesignMode();\r
-\r
-                       this.selectedElement = inst.getFocusElement();\r
-                       inst.select();\r
-                       tinyMCE.execCommand(command, user_interface, value);\r
-\r
-                       // Cancel event so it doesn't call onbeforeonunlaod\r
-                       if (tinyMCE.isIE && window.event != null)\r
-                               tinyMCE.cancelEvent(window.event);\r
-               }\r
-       },\r
-\r
-       execCommand : function(command, user_interface, value) {\r
-               var inst = tinyMCE.selectedInstance, n, pe, te;\r
-\r
-               // Default input\r
-               user_interface = user_interface ? user_interface : false;\r
-               value = value ? value : null;\r
-\r
-               if (inst)\r
-                       inst.switchSettings();\r
-\r
-               switch (command) {\r
-                       case "Undo":\r
-                               if (this.getParam('custom_undo_redo_global')) {\r
-                                       if (this.undoIndex > 0) {\r
-                                               tinyMCE.nextUndoRedoAction = 'Undo';\r
-                                               inst = this.undoLevels[--this.undoIndex];\r
-                                               inst.select();\r
-\r
-                                               if (!tinyMCE.nextUndoRedoInstanceId)\r
-                                                       inst.execCommand('Undo');\r
-                                       }\r
-                               } else\r
-                                       inst.execCommand('Undo');\r
-                               return true;\r
-\r
-                       case "Redo":\r
-                               if (this.getParam('custom_undo_redo_global')) {\r
-                                       if (this.undoIndex <= this.undoLevels.length - 1) {\r
-                                               tinyMCE.nextUndoRedoAction = 'Redo';\r
-                                               inst = this.undoLevels[this.undoIndex++];\r
-                                               inst.select();\r
-\r
-                                               if (!tinyMCE.nextUndoRedoInstanceId)\r
-                                                       inst.execCommand('Redo');\r
-                                       }\r
-                               } else\r
-                                       inst.execCommand('Redo');\r
-\r
-                               return true;\r
-\r
-                       case 'mceFocus':\r
-                               inst = tinyMCE.getInstanceById(value);\r
-\r
-                               if (inst)\r
-                                       inst.getWin().focus();\r
-                       return;\r
-\r
-                       case "mceAddControl":\r
-                       case "mceAddEditor":\r
-                               tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);\r
-                               return;\r
-\r
-                       case "mceAddFrameControl":\r
-                               tinyMCE.addMCEControl(tinyMCE._getElementById(value.element, value.document), value.element, value.document);\r
-                               return;\r
-\r
-                       case "mceRemoveControl":\r
-                       case "mceRemoveEditor":\r
-                               tinyMCE.removeMCEControl(value);\r
-                               return;\r
-\r
-                       case "mceToggleEditor":\r
-                               inst = tinyMCE.getInstanceById(value);\r
-\r
-                               if (inst) {\r
-                                       pe = document.getElementById(inst.editorId + '_parent');\r
-                                       te = inst.oldTargetElement;\r
-\r
-                                       if (typeof(inst.enabled) == 'undefined')\r
-                                               inst.enabled = true;\r
-\r
-                                       inst.enabled = !inst.enabled;\r
-\r
-                                       if (!inst.enabled) {\r
-                                               pe.style.display = 'none';\r
-\r
-                                               if (te.nodeName == 'TEXTAREA' || te.nodeName == 'INPUT')\r
-                                                       te.value = inst.getHTML();\r
-                                               else\r
-                                                       te.innerHTML = inst.getHTML();\r
-\r
-                                               te.style.display = inst.oldTargetDisplay;\r
-                                               tinyMCE.dispatchCallback(inst, 'hide_instance_callback', 'hideInstance', inst);\r
-                                       } else {\r
-                                               pe.style.display = 'block';\r
-                                               te.style.display = 'none';\r
-\r
-                                               if (te.nodeName == 'TEXTAREA' || te.nodeName == 'INPUT')\r
-                                                       inst.setHTML(te.value);\r
-                                               else\r
-                                                       inst.setHTML(te.innerHTML);\r
-\r
-                                               inst.useCSS = false;\r
-                                               tinyMCE.dispatchCallback(inst, 'show_instance_callback', 'showInstance', inst);\r
-                                       }\r
-                               } else\r
-                                       tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);\r
-\r
-                               return;\r
-\r
-                       case "mceResetDesignMode":\r
-                               // Resets the designmode state of the editors in Gecko\r
-                               if (tinyMCE.isGecko) {\r
-                                       for (n in tinyMCE.instances) {\r
-                                               if (!tinyMCE.isInstance(tinyMCE.instances[n]))\r
-                                                       continue;\r
-\r
-                                               try {\r
-                                                       tinyMCE.instances[n].getDoc().designMode = "off";\r
-                                                       tinyMCE.instances[n].getDoc().designMode = "on";\r
-                                                       tinyMCE.instances[n].useCSS = false;\r
-                                               } catch (e) {\r
-                                                       // Ignore any errors\r
-                                               }\r
-                                       }\r
-                               }\r
-\r
-                               return;\r
-               }\r
-\r
-               if (inst) {\r
-                       inst.execCommand(command, user_interface, value);\r
-               } else if (tinyMCE.settings.focus_alert)\r
-                       alert(tinyMCELang.lang_focus_alert);\r
-       },\r
-\r
-       _createIFrame : function(replace_element, doc, win) {\r
-               var iframe, id = replace_element.getAttribute("id");\r
-               var aw, ah;\r
-\r
-               if (typeof(doc) == "undefined")\r
-                       doc = document;\r
-\r
-               if (typeof(win) == "undefined")\r
-                       win = window;\r
-\r
-               iframe = doc.createElement("iframe");\r
-\r
-               aw = "" + tinyMCE.settings.area_width;\r
-               ah = "" + tinyMCE.settings.area_height;\r
-\r
-               if (aw.indexOf('%') == -1) {\r
-                       aw = parseInt(aw);\r
-                       aw = (isNaN(aw) || aw < 0) ? 300 : aw;\r
-                       aw = aw + "px";\r
-               }\r
-\r
-               if (ah.indexOf('%') == -1) {\r
-                       ah = parseInt(ah);\r
-                       ah = (isNaN(ah) || ah < 0) ? 240 : ah;\r
-                       ah = ah + "px";\r
-               }\r
-\r
-               iframe.setAttribute("id", id);\r
-               iframe.setAttribute("name", id);\r
-               iframe.setAttribute("class", "mceEditorIframe");\r
-               iframe.setAttribute("border", "0");\r
-               iframe.setAttribute("frameBorder", "0");\r
-               iframe.setAttribute("marginWidth", "0");\r
-               iframe.setAttribute("marginHeight", "0");\r
-               iframe.setAttribute("leftMargin", "0");\r
-               iframe.setAttribute("topMargin", "0");\r
-               iframe.setAttribute("width", aw);\r
-               iframe.setAttribute("height", ah);\r
-               iframe.setAttribute("allowtransparency", "true");\r
-               iframe.className = 'mceEditorIframe';\r
-\r
-               if (tinyMCE.settings.auto_resize)\r
-                       iframe.setAttribute("scrolling", "no");\r
-\r
-               // Must have a src element in MSIE HTTPs breaks aswell as absoute URLs\r
-               if (tinyMCE.isRealIE)\r
-                       iframe.setAttribute("src", this.settings.default_document);\r
-\r
-               iframe.style.width = aw;\r
-               iframe.style.height = ah;\r
-\r
-               // Ugly hack for Gecko problem in strict mode\r
-               if (tinyMCE.settings.strict_loading_mode)\r
-                       iframe.style.marginBottom = '-5px';\r
-\r
-               // MSIE 5.0 issue\r
-               if (tinyMCE.isRealIE)\r
-                       replace_element.outerHTML = iframe.outerHTML;\r
-               else\r
-                       replace_element.parentNode.replaceChild(iframe, replace_element);\r
-\r
-               if (tinyMCE.isRealIE)\r
-                       return win.frames[id];\r
-               else\r
-                       return iframe;\r
-       },\r
-\r
-       setupContent : function(editor_id) {\r
-               var inst = tinyMCE.instances[editor_id], i, doc = inst.getDoc(), head = doc.getElementsByTagName('head').item(0);\r
-               var content = inst.startContent, contentElement, body;\r
-\r
-               // HTML values get XML encoded in strict mode\r
-               if (tinyMCE.settings.strict_loading_mode) {\r
-                       content = content.replace(/&lt;/g, '<');\r
-                       content = content.replace(/&gt;/g, '>');\r
-                       content = content.replace(/&quot;/g, '"');\r
-                       content = content.replace(/&amp;/g, '&');\r
-               }\r
-\r
-               tinyMCE.selectedInstance = inst;\r
-               inst.switchSettings();\r
-\r
-               // Not loaded correctly hit it again, Mozilla bug #997860\r
-               if (!tinyMCE.isIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") {\r
-                       // This part will remove the designMode status\r
-                       // Failes first time in Firefox 1.5b2 on Mac\r
-                       try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {}\r
-                       window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000);\r
-                       return;\r
-               }\r
-\r
-               // Wait for it to load\r
-               if (!head || !doc.body) {\r
-                       window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10);\r
-                       return;\r
-               }\r
-\r
-               // Import theme specific content CSS the user specific\r
-               tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/themes/" + inst.settings.theme + "/css/editor_content.css");\r
-               tinyMCE.importCSS(inst.getDoc(), inst.settings.content_css);\r
-               tinyMCE.dispatchCallback(inst, 'init_instance_callback', 'initInstance', inst);\r
-\r
-               // Setup keyboard shortcuts\r
-               if (tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')) {\r
-                       inst.addShortcut('ctrl', 'z', 'lang_undo_desc', 'Undo');\r
-                       inst.addShortcut('ctrl', 'y', 'lang_redo_desc', 'Redo');\r
-               }\r
-\r
-               // BlockFormat shortcuts keys\r
-               for (i=1; i<=6; i++)\r
-                       inst.addShortcut('ctrl', '' + i, '', 'FormatBlock', false, '<h' + i + '>');\r
-\r
-               inst.addShortcut('ctrl', '7', '', 'FormatBlock', false, '<p>');\r
-               inst.addShortcut('ctrl', '8', '', 'FormatBlock', false, '<div>');\r
-               inst.addShortcut('ctrl', '9', '', 'FormatBlock', false, '<address>');\r
-\r
-               // Add default shortcuts for gecko\r
-               if (tinyMCE.isGecko) {\r
-                       inst.addShortcut('ctrl', 'b', 'lang_bold_desc', 'Bold');\r
-                       inst.addShortcut('ctrl', 'i', 'lang_italic_desc', 'Italic');\r
-                       inst.addShortcut('ctrl', 'u', 'lang_underline_desc', 'Underline');\r
-               }\r
-\r
-               // Setup span styles\r
-               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
-                       inst.getBody().setAttribute('id', 'mceSpanFonts');\r
-\r
-               if (tinyMCE.settings.nowrap)\r
-                       doc.body.style.whiteSpace = "nowrap";\r
-\r
-               doc.body.dir = this.settings.directionality;\r
-               doc.editorId = editor_id;\r
-\r
-               // Add on document element in Mozilla\r
-               if (!tinyMCE.isIE)\r
-                       doc.documentElement.editorId = editor_id;\r
-\r
-               inst.setBaseHREF(tinyMCE.settings.base_href);\r
-\r
-               // Replace new line characters to BRs\r
-               if (tinyMCE.settings.convert_newlines_to_brs) {\r
-                       content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi");\r
-                       content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi");\r
-                       content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi");\r
-               }\r
-\r
-               // Open closed anchors\r
-       //      content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');\r
-\r
-               // Call custom cleanup code\r
-               content = tinyMCE.storeAwayURLs(content);\r
-               content = tinyMCE._customCleanup(inst, "insert_to_editor", content);\r
-\r
-               if (tinyMCE.isIE) {\r
-                       // Ugly!!!\r
-                       window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["' + editor_id + '"].getDoc(), "' + editor_id + '");}catch(e){}', 500);\r
-\r
-                       if (tinyMCE.settings.force_br_newlines)\r
-                               doc.styleSheets[0].addRule("p", "margin: 0;");\r
-\r
-                       body = inst.getBody();\r
-                       body.editorId = editor_id;\r
-               }\r
-\r
-               content = tinyMCE.cleanupHTMLCode(content);\r
-\r
-               // Fix for bug #958637\r
-               if (!tinyMCE.isIE) {\r
-                       contentElement = inst.getDoc().createElement("body");\r
-                       doc = inst.getDoc();\r
-\r
-                       contentElement.innerHTML = content;\r
-\r
-                       if (tinyMCE.settings.cleanup_on_startup)\r
-                               tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, this.settings, contentElement));\r
-                       else\r
-                               tinyMCE.setInnerHTML(inst.getBody(), content);\r
-\r
-                       tinyMCE.convertAllRelativeURLs(inst.getBody());\r
-               } else {\r
-                       if (tinyMCE.settings.cleanup_on_startup) {\r
-                               tinyMCE._setHTML(inst.getDoc(), content);\r
-\r
-                               // Produces permission denied error in MSIE 5.5\r
-                               try {\r
-                                       tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));\r
-                               } catch(e) {\r
-                                       // Ignore\r
-                               }\r
-                       } else\r
-                               tinyMCE._setHTML(inst.getDoc(), content);\r
-               }\r
-\r
-               // Fix for bug #957681\r
-               //inst.getDoc().designMode = inst.getDoc().designMode;\r
-\r
-               tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings.visual, inst);\r
-               tinyMCE.dispatchCallback(inst, 'setupcontent_callback', 'setupContent', editor_id, inst.getBody(), inst.getDoc());\r
-\r
-               // Re-add design mode on mozilla\r
-               if (!tinyMCE.isIE)\r
-                       tinyMCE.addEventHandlers(inst);\r
-\r
-               // Add blur handler\r
-               if (tinyMCE.isIE) {\r
-                       tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE_Engine.prototype._eventPatch);\r
-                       tinyMCE.addEvent(inst.getBody(), "beforedeactivate", TinyMCE_Engine.prototype._eventPatch); // Bug #1439953\r
-\r
-                       // Workaround for drag drop/copy paste base href bug\r
-                       if (!tinyMCE.isOpera) {\r
-                               tinyMCE.addEvent(doc.body, "mousemove", TinyMCE_Engine.prototype.onMouseMove);\r
-                               tinyMCE.addEvent(doc.body, "beforepaste", TinyMCE_Engine.prototype._eventPatch);\r
-                               tinyMCE.addEvent(doc.body, "drop", TinyMCE_Engine.prototype._eventPatch);\r
-                       }\r
-               }\r
-\r
-               // Trigger node change, this call locks buttons for tables and so forth\r
-               inst.select();\r
-               tinyMCE.selectedElement = inst.contentWindow.document.body;\r
-\r
-               // Call custom DOM cleanup\r
-               tinyMCE._customCleanup(inst, "insert_to_editor_dom", inst.getBody());\r
-               tinyMCE._customCleanup(inst, "setup_content_dom", inst.getBody());\r
-               tinyMCE._setEventsEnabled(inst.getBody(), false);\r
-               tinyMCE.cleanupAnchors(inst.getDoc());\r
-\r
-               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
-                       tinyMCE.convertSpansToFonts(inst.getDoc());\r
-\r
-               inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);\r
-               inst.undoRedo.add({ content : inst.startContent });\r
-\r
-               // Cleanup any mess left from storyAwayURLs\r
-               if (tinyMCE.isGecko) {\r
-                       // Remove mce_src from textnodes and comments\r
-                       tinyMCE.selectNodes(inst.getBody(), function(n) {\r
-                               if (n.nodeType == 3 || n.nodeType == 8)\r
-                                       n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), "");\r
-\r
-                               return false;\r
-                       });\r
-               }\r
-\r
-               // Remove Gecko spellchecking\r
-               if (tinyMCE.isGecko)\r
-                       inst.getBody().spellcheck = tinyMCE.getParam("gecko_spellcheck");\r
-\r
-               // Cleanup any mess left from storyAwayURLs\r
-               tinyMCE._removeInternal(inst.getBody());\r
-\r
-               inst.select();\r
-               tinyMCE.triggerNodeChange(false, true);\r
-       },\r
-\r
-       storeAwayURLs : function(s) {\r
-               // Remove all mce_src, mce_href and replace them with new ones\r
-               // s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');\r
-               // s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');\r
-\r
-               if (!s.match(/(mce_src|mce_href)/gi, s)) {\r
-                       s = s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'src="$1" mce_src="$1"');\r
-                       s = s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'href="$1" mce_href="$1"');\r
-               }\r
-\r
-               return s;\r
-       },\r
-\r
-       _removeInternal : function(n) {\r
-               if (tinyMCE.isGecko) {\r
-                       // Remove mce_src from textnodes and comments\r
-                       tinyMCE.selectNodes(n, function(n) {\r
-                               if (n.nodeType == 3 || n.nodeType == 8)\r
-                                       n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), "");\r
-\r
-                               return false;\r
-                       });\r
-               }\r
-       },\r
-\r
-       removeTinyMCEFormElements : function(form_obj) {\r
-               var i, elementId;\r
-\r
-               // Skip form element removal\r
-               if (!tinyMCE.getParam('hide_selects_on_submit'))\r
-                       return;\r
-\r
-               // Check if form is valid\r
-               if (typeof(form_obj) == "undefined" || form_obj == null)\r
-                       return;\r
-\r
-               // If not a form, find the form\r
-               if (form_obj.nodeName != "FORM") {\r
-                       if (form_obj.form)\r
-                               form_obj = form_obj.form;\r
-                       else\r
-                               form_obj = tinyMCE.getParentElement(form_obj, "form");\r
-               }\r
-\r
-               // Still nothing\r
-               if (form_obj == null)\r
-                       return;\r
-\r
-               // Disable all UI form elements that TinyMCE created\r
-               for (i=0; i<form_obj.elements.length; i++) {\r
-                       elementId = form_obj.elements[i].name ? form_obj.elements[i].name : form_obj.elements[i].id;\r
-\r
-                       if (elementId.indexOf('mce_editor_') == 0)\r
-                               form_obj.elements[i].disabled = true;\r
-               }\r
-       },\r
-\r
-       handleEvent : function(e) {\r
-               var inst = tinyMCE.selectedInstance, i, elm, keys;\r
-\r
-               // Remove odd, error\r
-               if (typeof(tinyMCE) == "undefined")\r
-                       return true;\r
-\r
-               //tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));\r
-\r
-               if (tinyMCE.executeCallback(tinyMCE.selectedInstance, 'handle_event_callback', 'handleEvent', e))\r
-                       return false;\r
-\r
-               switch (e.type) {\r
-                       case "beforedeactivate": // Was added due to bug #1439953\r
-                       case "blur":\r
-                               if (tinyMCE.selectedInstance)\r
-                                       tinyMCE.selectedInstance.execCommand('mceEndTyping');\r
-\r
-                               tinyMCE.hideMenus();\r
-\r
-                               return;\r
-\r
-                       // Workaround for drag drop/copy paste base href bug\r
-                       case "drop":\r
-                       case "beforepaste":\r
-                               if (tinyMCE.selectedInstance)\r
-                                       tinyMCE.selectedInstance.setBaseHREF(null);\r
-\r
-                               // Fixes odd MSIE bug where drag/droping elements in a iframe with height 100% breaks\r
-                               // This logic forces the width/height to be in pixels while the user is drag/dropping\r
-                               if (tinyMCE.isRealIE) {\r
-                                       var ife = tinyMCE.selectedInstance.iframeElement;\r
-\r
-                                       /*if (ife.style.width.indexOf('%') != -1) {\r
-                                               ife._oldWidth = ife.width.height;\r
-                                               ife.style.width = ife.clientWidth;\r
-                                       }*/\r
-\r
-                                       if (ife.style.height.indexOf('%') != -1) {\r
-                                               ife._oldHeight = ife.style.height;\r
-                                               ife.style.height = ife.clientHeight;\r
-                                       }\r
-                               }\r
-\r
-                               window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings.base_href);tinyMCE._resetIframeHeight();", 1);\r
-                               return;\r
-\r
-                       case "submit":\r
-                               tinyMCE.formSubmit(tinyMCE.isMSIE ? window.event.srcElement : e.target);\r
-                               return;\r
-\r
-                       case "reset":\r
-                               var formObj = tinyMCE.isIE ? window.event.srcElement : e.target;\r
-\r
-                               for (i=0; i<document.forms.length; i++) {\r
-                                       if (document.forms[i] == formObj)\r
-                                               window.setTimeout('tinyMCE.resetForm(' + i + ');', 10);\r
-                               }\r
-\r
-                               return;\r
-\r
-                       case "keypress":\r
-                               if (inst && inst.handleShortcut(e))\r
-                                       return false;\r
-\r
-                               if (e.target.editorId) {\r
-                                       tinyMCE.instances[e.target.editorId].select();\r
-                               } else {\r
-                                       if (e.target.ownerDocument.editorId)\r
-                                               tinyMCE.instances[e.target.ownerDocument.editorId].select();\r
-                               }\r
-\r
-                               if (tinyMCE.selectedInstance)\r
-                                       tinyMCE.selectedInstance.switchSettings();\r
-\r
-                               // Insert P element\r
-                               if ((tinyMCE.isGecko || tinyMCE.isOpera || tinyMCE.isSafari) && tinyMCE.settings.force_p_newlines && e.keyCode == 13 && !e.shiftKey) {\r
-                                       // Insert P element instead of BR\r
-                                       if (TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance, e)) {\r
-                                               // Cancel event\r
-                                               tinyMCE.execCommand("mceAddUndoLevel");\r
-                                               return tinyMCE.cancelEvent(e);\r
-                                       }\r
-                               }\r
-\r
-                               // Handle backspace\r
-                               if ((tinyMCE.isGecko && !tinyMCE.isSafari) && tinyMCE.settings.force_p_newlines && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {\r
-                                       // Insert P element instead of BR\r
-                                       if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {\r
-                                               // Cancel event\r
-                                               tinyMCE.execCommand("mceAddUndoLevel");\r
-                                               return tinyMCE.cancelEvent(e);\r
-                                       }\r
-                               }\r
-\r
-                               // Return key pressed\r
-                               if (tinyMCE.isIE && tinyMCE.settings.force_br_newlines && e.keyCode == 13) {\r
-                                       if (e.target.editorId)\r
-                                               tinyMCE.instances[e.target.editorId].select();\r
-\r
-                                       if (tinyMCE.selectedInstance) {\r
-                                               var sel = tinyMCE.selectedInstance.getDoc().selection;\r
-                                               var rng = sel.createRange();\r
-\r
-                                               if (tinyMCE.getParentElement(rng.parentElement(), "li") != null)\r
-                                                       return false;\r
-\r
-                                               // Cancel event\r
-                                               e.returnValue = false;\r
-                                               e.cancelBubble = true;\r
-\r
-                                               // Insert BR element\r
-                                               rng.pasteHTML("<br />");\r
-                                               rng.collapse(false);\r
-                                               rng.select();\r
-\r
-                                               tinyMCE.execCommand("mceAddUndoLevel");\r
-                                               tinyMCE.triggerNodeChange(false);\r
-                                               return false;\r
-                                       }\r
-                               }\r
-\r
-                               // Backspace or delete\r
-                               if (e.keyCode == 8 || e.keyCode == 46) {\r
-                                       tinyMCE.selectedElement = e.target;\r
-                                       tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a");\r
-                                       tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img");\r
-                                       tinyMCE.triggerNodeChange(false);\r
-                               }\r
-\r
-                               return false;\r
-\r
-                       case "keyup":\r
-                       case "keydown":\r
-                               tinyMCE.hideMenus();\r
-                               tinyMCE.hasMouseMoved = false;\r
-\r
-                               if (inst && inst.handleShortcut(e))\r
-                                       return false;\r
-\r
-                               inst._fixRootBlocks();\r
-\r
-                               if (inst.settings.remove_trailing_nbsp)\r
-                                       inst._fixTrailingNbsp();\r
-\r
-                               if (e.target.editorId)\r
-                                       tinyMCE.instances[e.target.editorId].select();\r
-\r
-                               if (tinyMCE.selectedInstance)\r
-                                       tinyMCE.selectedInstance.switchSettings();\r
-\r
-                               inst = tinyMCE.selectedInstance;\r
-\r
-                               // Handle backspace\r
-                               if (tinyMCE.isGecko && tinyMCE.settings.force_p_newlines && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {\r
-                                       // Insert P element instead of BR\r
-                                       if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {\r
-                                               // Cancel event\r
-                                               tinyMCE.execCommand("mceAddUndoLevel");\r
-                                               e.preventDefault();\r
-                                               return false;\r
-                                       }\r
-                               }\r
-\r
-                               tinyMCE.selectedElement = null;\r
-                               tinyMCE.selectedNode = null;\r
-                               elm = tinyMCE.selectedInstance.getFocusElement();\r
-                               tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a");\r
-                               tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img");\r
-                               tinyMCE.selectedElement = elm;\r
-\r
-                               // Update visualaids on tabs\r
-                               if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9)\r
-                                       tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings.visual, tinyMCE.selectedInstance);\r
-\r
-                               // Fix empty elements on return/enter, check where enter occured\r
-                               if (tinyMCE.isIE && e.type == "keydown" && e.keyCode == 13)\r
-                                       tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();\r
-\r
-                               // Fix empty elements on return/enter\r
-                               if (tinyMCE.isIE && e.type == "keyup" && e.keyCode == 13) {\r
-                                       elm = tinyMCE.enterKeyElement;\r
-                                       if (elm) {\r
-                                               var re = new RegExp('^HR|IMG|BR$','g'); // Skip these\r
-                                               var dre = new RegExp('^H[1-6]$','g'); // Add double on these\r
-\r
-                                               if (!elm.hasChildNodes() && !re.test(elm.nodeName)) {\r
-                                                       if (dre.test(elm.nodeName))\r
-                                                               elm.innerHTML = "&nbsp;&nbsp;";\r
-                                                       else\r
-                                                               elm.innerHTML = "&nbsp;";\r
-                                               }\r
-                                       }\r
-                               }\r
-\r
-                               // Check if it's a position key\r
-                               keys = tinyMCE.posKeyCodes;\r
-                               var posKey = false;\r
-                               for (i=0; i<keys.length; i++) {\r
-                                       if (keys[i] == e.keyCode) {\r
-                                               posKey = true;\r
-                                               break;\r
-                                       }\r
-                               }\r
-\r
-                               // MSIE custom key handling\r
-                               if (tinyMCE.isIE && tinyMCE.settings.custom_undo_redo) {\r
-                                       keys = [8, 46]; // Backspace,Delete\r
-\r
-                                       for (i=0; i<keys.length; i++) {\r
-                                               if (keys[i] == e.keyCode) {\r
-                                                       if (e.type == "keyup")\r
-                                                               tinyMCE.triggerNodeChange(false);\r
-                                               }\r
-                                       }\r
-                               }\r
-\r
-                               // If Ctrl key\r
-                               if (e.keyCode == 17)\r
-                                       return true;\r
-\r
-                               // Handle Undo/Redo when typing content\r
-\r
-                               if (tinyMCE.isGecko) {\r
-                                       // Start typing (not a position key or ctrl key, but ctrl+x and ctrl+p is ok)\r
-                                       if (!posKey && e.type == "keyup" && !e.ctrlKey || (e.ctrlKey && (e.keyCode == 86 || e.keyCode == 88)))\r
-                                               tinyMCE.execCommand("mceStartTyping");\r
-                               } else {\r
-                                       // IE seems to be working better with this setting\r
-                                       if (!posKey && e.type == "keyup")\r
-                                               tinyMCE.execCommand("mceStartTyping");\r
-                               }\r
-\r
-                               // Store undo bookmark\r
-                               if (e.type == "keydown" && (posKey || e.ctrlKey) && inst)\r
-                                       inst.undoBookmark = inst.selection.getBookmark();\r
-\r
-                               // End typing (position key) or some Ctrl event\r
-                               if (e.type == "keyup" && (posKey || e.ctrlKey))\r
-                                       tinyMCE.execCommand("mceEndTyping");\r
-\r
-                               if (posKey && e.type == "keyup")\r
-                                       tinyMCE.triggerNodeChange(false);\r
-\r
-                               if (tinyMCE.isIE && e.ctrlKey)\r
-                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
-                       break;\r
-\r
-                       case "mousedown":\r
-                       case "mouseup":\r
-                       case "click":\r
-                       case "dblclick":\r
-                       case "focus":\r
-                               tinyMCE.hideMenus();\r
-\r
-                               if (tinyMCE.selectedInstance) {\r
-                                       tinyMCE.selectedInstance.switchSettings();\r
-                                       tinyMCE.selectedInstance.isFocused = true;\r
-                               }\r
-\r
-                               // Check instance event trigged on\r
-                               var targetBody = tinyMCE.getParentElement(e.target, "html");\r
-                               for (var instanceName in tinyMCE.instances) {\r
-                                       if (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))\r
-                                               continue;\r
-\r
-                                       inst = tinyMCE.instances[instanceName];\r
-\r
-                                       // Reset design mode if lost (on everything just in case)\r
-                                       inst.autoResetDesignMode();\r
-\r
-                                       // Use HTML element since users might click outside of body element\r
-                                       if (inst.getBody().parentNode == targetBody) {\r
-                                               inst.select();\r
-                                               tinyMCE.selectedElement = e.target;\r
-                                               tinyMCE.linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");\r
-                                               tinyMCE.imgElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "img");\r
-                                               break;\r
-                                       }\r
-                               }\r
-\r
-                               // Add first bookmark location\r
-                               if (!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark && (e.type == "mouseup" || e.type == "dblclick"))\r
-                                       tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark = tinyMCE.selectedInstance.selection.getBookmark();\r
-\r
-                               // Reset selected node\r
-                               if (e.type != "focus")\r
-                                       tinyMCE.selectedNode = null;\r
-\r
-                               tinyMCE.triggerNodeChange(false);\r
-                               tinyMCE.execCommand("mceEndTyping");\r
-\r
-                               if (e.type == "mouseup")\r
-                                       tinyMCE.execCommand("mceAddUndoLevel");\r
-\r
-                               // Just in case\r
-                               if (!tinyMCE.selectedInstance && e.target.editorId)\r
-                                       tinyMCE.instances[e.target.editorId].select();\r
-\r
-                               return false;\r
-               }\r
-       },\r
-\r
-       getButtonHTML : function(id, lang, img, cmd, ui, val) {\r
-               var h = '', m, x, io = '';\r
-\r
-               cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';\r
-\r
-               if (typeof(ui) != "undefined" && ui != null)\r
-                       cmd += ',' + ui;\r
-\r
-               if (typeof(val) != "undefined" && val != null)\r
-                       cmd += ",'" + val + "'";\r
-\r
-               cmd += ');';\r
-\r
-               // Patch for IE7 bug with hover out not restoring correctly\r
-               if (tinyMCE.isRealIE)\r
-                       io = 'onmouseover="tinyMCE.lastHover = this;"';\r
-\r
-               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled\r
-               if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = this.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {\r
-                       // Tiled button\r
-                       x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);\r
-                       h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" ' + io + ' class="mceTiledButton mceButtonNormal" target="_self">';\r
-                       h += '<img src="{$themeurl}/images/spacer.gif" style="background-position: ' + x + 'px 0" alt="{$'+lang+'}" title="{$' + lang + '}" />';\r
-                       h += '</a>';\r
-               } else {\r
-                       // Normal button\r
-                       h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" ' + io + ' class="mceButtonNormal" target="_self">';\r
-                       h += '<img src="' + img + '" alt="{$'+lang+'}" title="{$' + lang + '}" />';\r
-                       h += '</a>';\r
-               }\r
-\r
-               return h;\r
-       },\r
-\r
-       getMenuButtonHTML : function(id, lang, img, mcmd, cmd, ui, val) {\r
-               var h = '', m, x;\r
-\r
-               mcmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + mcmd + '\');';\r
-               cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';\r
-\r
-               if (typeof(ui) != "undefined" && ui != null)\r
-                       cmd += ',' + ui;\r
-\r
-               if (typeof(val) != "undefined" && val != null)\r
-                       cmd += ",'" + val + "'";\r
-\r
-               cmd += ');';\r
-\r
-               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled\r
-               if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = tinyMCE.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {\r
-                       x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);\r
-\r
-                       if (tinyMCE.isRealIE)\r
-                               h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';\r
-                       else\r
-                               h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton">';\r
-\r
-                       h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceTiledButton mceMenuButtonNormal" target="_self">';\r
-                       h += '<img src="{$themeurl}/images/spacer.gif" style="width: 20px; height: 20px; background-position: ' + x + 'px 0" title="{$' + lang + '}" /></a>';\r
-                       h += '<a href="javascript:' + mcmd + '" onclick="' + mcmd + 'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';\r
-                       h += '</a></span>';\r
-               } else {\r
-                       if (tinyMCE.isRealIE)\r
-                               h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';\r
-                       else\r
-                               h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton">';\r
-\r
-                       h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';\r
-                       h += '<img src="' + img + '" title="{$' + lang + '}" /></a>';\r
-                       h += '<a href="javascript:' + mcmd + '" onclick="' + mcmd + 'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';\r
-                       h += '</a></span>';\r
-               }\r
-\r
-               return h;\r
-       },\r
-\r
-       _menuButtonEvent : function(e, o) {\r
-               if (o.className == 'mceMenuButtonFocus')\r
-                       return;\r
-\r
-               if (e == 'over')\r
-                       o.className = o.className + ' mceMenuHover';\r
-               else\r
-                       o.className = o.className.replace(/\s.*$/, '');\r
-       },\r
-\r
-       addButtonMap : function(m) {\r
-               var i, a = m.replace(/\s+/, '').split(',');\r
-\r
-               for (i=0; i<a.length; i++)\r
-                       this.buttonMap[a[i]] = i;\r
-       },\r
-\r
-       formSubmit : function(f, p) {\r
-               var n, inst, found = false;\r
-\r
-               if (f.form)\r
-                       f = f.form;\r
-\r
-               // Is it a form that has a TinyMCE instance\r
-               for (n in tinyMCE.instances) {\r
-                       inst = tinyMCE.instances[n];\r
-\r
-                       if (!tinyMCE.isInstance(inst))\r
-                               continue;\r
-\r
-                       if (inst.formElement) {\r
-                               if (f == inst.formElement.form) {\r
-                                       found = true;\r
-                                       inst.isNotDirty = true;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               // Is valid\r
-               if (found) {\r
-                       tinyMCE.removeTinyMCEFormElements(f);\r
-                       tinyMCE.triggerSave();\r
-               }\r
-\r
-               // Is it patched\r
-               if (f.mceOldSubmit && p)\r
-                       f.mceOldSubmit();\r
-       },\r
-\r
-       submitPatch : function() {\r
-               tinyMCE.formSubmit(this, true);\r
-       },\r
-\r
-       onLoad : function() {\r
-               var r, i, c, mode, trigger, elements, element, settings, elementId, elm;\r
-               var selector, deselector, elementRefAr, form;\r
-\r
-               // Wait for everything to be loaded first\r
-               if (tinyMCE.settings.strict_loading_mode && this.loadingIndex != -1) {\r
-                       window.setTimeout('tinyMCE.onLoad();', 1);\r
-                       return;\r
-               }\r
-\r
-               if (tinyMCE.isRealIE && window.event.type == "readystatechange" && document.readyState != "complete")\r
-                       return true;\r
-\r
-               if (tinyMCE.isLoaded)\r
-                       return true;\r
-\r
-               tinyMCE.isLoaded = true;\r
-\r
-               // IE produces JS error if TinyMCE is placed in a frame\r
-               // It seems to have something to do with the selection not beeing\r
-               // correctly initialized in IE so this hack solves the problem\r
-               if (tinyMCE.isRealIE && document.body && window.location.href != window.top.location.href) {\r
-                       r = document.body.createTextRange();\r
-                       r.collapse(true);\r
-                       r.select();\r
-               }\r
-\r
-               tinyMCE.dispatchCallback(null, 'onpageload', 'onPageLoad');\r
-\r
-               for (c=0; c<tinyMCE.configs.length; c++) {\r
-                       tinyMCE.settings = tinyMCE.configs[c];\r
-\r
-                       selector = tinyMCE.getParam("editor_selector");\r
-                       deselector = tinyMCE.getParam("editor_deselector");\r
-                       elementRefAr = [];\r
-\r
-                       // Add submit triggers\r
-                       if (document.forms && tinyMCE.settings.add_form_submit_trigger && !tinyMCE.submitTriggers) {\r
-                               for (i=0; i<document.forms.length; i++) {\r
-                                       form = document.forms[i];\r
-\r
-                                       tinyMCE.addEvent(form, "submit", TinyMCE_Engine.prototype.handleEvent);\r
-                                       tinyMCE.addEvent(form, "reset", TinyMCE_Engine.prototype.handleEvent);\r
-                                       tinyMCE.submitTriggers = true; // Do it only once\r
-\r
-                                       // Patch the form.submit function\r
-                                       if (tinyMCE.settings.submit_patch) {\r
-                                               try {\r
-                                                       form.mceOldSubmit = form.submit;\r
-                                                       form.submit = TinyMCE_Engine.prototype.submitPatch;\r
-                                               } catch (e) {\r
-                                                       // Do nothing\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       // Add editor instances based on mode\r
-                       mode = tinyMCE.settings.mode;\r
-                       switch (mode) {\r
-                               case "exact":\r
-                                       elements = tinyMCE.getParam('elements', '', true, ',');\r
-\r
-                                       for (i=0; i<elements.length; i++) {\r
-                                               element = tinyMCE._getElementById(elements[i]);\r
-                                               trigger = element ? element.getAttribute(tinyMCE.settings.textarea_trigger) : "";\r
-\r
-                                               if (new RegExp('\\b' + deselector + '\\b').test(tinyMCE.getAttrib(element, "class")))\r
-                                                       continue;\r
-\r
-                                               if (trigger == "false")\r
-                                                       continue;\r
-\r
-                                               if ((tinyMCE.settings.ask || tinyMCE.settings.convert_on_click) && element) {\r
-                                                       elementRefAr[elementRefAr.length] = element;\r
-                                                       continue;\r
-                                               }\r
-\r
-                                               if (element)\r
-                                                       tinyMCE.addMCEControl(element, elements[i]);\r
-                                       }\r
-                               break;\r
-\r
-                               case "specific_textareas":\r
-                               case "textareas":\r
-                                       elements = document.getElementsByTagName("textarea");\r
-\r
-                                       for (i=0; i<elements.length; i++) {\r
-                                               elm = elements.item(i);\r
-                                               trigger = elm.getAttribute(tinyMCE.settings.textarea_trigger);\r
-\r
-                                               if (selector !== '' && !new RegExp('\\b' + selector + '\\b').test(tinyMCE.getAttrib(elm, "class")))\r
-                                                       continue;\r
-\r
-                                               if (selector !== '')\r
-                                                       trigger = selector !== '' ? "true" : "";\r
-\r
-                                               if (new RegExp('\\b' + deselector + '\\b').test(tinyMCE.getAttrib(elm, "class")))\r
-                                                       continue;\r
-\r
-                                               if ((mode == "specific_textareas" && trigger == "true") || (mode == "textareas" && trigger != "false"))\r
-                                                       elementRefAr[elementRefAr.length] = elm;\r
-                                       }\r
-                               break;\r
-                       }\r
-\r
-                       for (i=0; i<elementRefAr.length; i++) {\r
-                               element = elementRefAr[i];\r
-                               elementId = element.name ? element.name : element.id;\r
-\r
-                               if (tinyMCE.settings.ask || tinyMCE.settings.convert_on_click) {\r
-                                       // Focus breaks in Mozilla\r
-                                       if (tinyMCE.isGecko) {\r
-                                               settings = tinyMCE.settings;\r
-\r
-                                               tinyMCE.addEvent(element, "focus", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});\r
-\r
-                                               if (element.nodeName != "TEXTAREA" && element.nodeName != "INPUT")\r
-                                                       tinyMCE.addEvent(element, "click", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});\r
-                                               // tinyMCE.addEvent(element, "mouseover", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});\r
-                                       } else {\r
-                                               settings = tinyMCE.settings;\r
-\r
-                                               tinyMCE.addEvent(element, "focus", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });\r
-                                               tinyMCE.addEvent(element, "click", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });\r
-                                               // tinyMCE.addEvent(element, "mouseenter", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });\r
-                                       }\r
-                               } else\r
-                                       tinyMCE.addMCEControl(element, elementId);\r
-                       }\r
-\r
-                       // Handle auto focus\r
-                       if (tinyMCE.settings.auto_focus) {\r
-                               window.setTimeout(function () {\r
-                                       var inst = tinyMCE.getInstanceById(tinyMCE.settings.auto_focus);\r
-                                       inst.selection.selectNode(inst.getBody(), true, true);\r
-                                       inst.contentWindow.focus();\r
-                               }, 100);\r
-                       }\r
-\r
-                       tinyMCE.dispatchCallback(null, 'oninit', 'onInit');\r
-               }\r
-       },\r
-\r
-       isInstance : function(o) {\r
-               return o != null && typeof(o) == "object" && o.isTinyMCE_Control;\r
-       },\r
-\r
-       getParam : function(name, default_value, strip_whitespace, split_chr) {\r
-               var i, outArray, value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];\r
-\r
-               // Fix bool values\r
-               if (value == "true" || value == "false")\r
-                       return (value == "true");\r
-\r
-               if (strip_whitespace)\r
-                       value = tinyMCE.regexpReplace(value, "[ \t\r\n]", "");\r
-\r
-               if (typeof(split_chr) != "undefined" && split_chr != null) {\r
-                       value = value.split(split_chr);\r
-                       outArray = [];\r
-\r
-                       for (i=0; i<value.length; i++) {\r
-                               if (value[i] && value[i] !== '')\r
-                                       outArray[outArray.length] = value[i];\r
-                       }\r
-\r
-                       value = outArray;\r
-               }\r
-\r
-               return value;\r
-       },\r
-\r
-       getLang : function(name, default_value, parse_entities, va) {\r
-               var v = (typeof(tinyMCELang[name]) == "undefined") ? default_value : tinyMCELang[name], n;\r
-\r
-               if (parse_entities)\r
-                       v = tinyMCE.entityDecode(v);\r
-\r
-               if (va) {\r
-                       for (n in va)\r
-                               v = this.replaceVar(v, n, va[n]);\r
-               }\r
-\r
-               return v;\r
-       },\r
-\r
-       entityDecode : function(s) {\r
-               var e = document.createElement("div");\r
-\r
-               e.innerHTML = s;\r
-\r
-               return !e.firstChild ? s : e.firstChild.nodeValue;\r
-       },\r
-\r
-       addToLang : function(prefix, ar) {\r
-               var k;\r
-\r
-               for (k in ar) {\r
-                       if (typeof(ar[k]) == 'function')\r
-                               continue;\r
-\r
-                       tinyMCELang[(k.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix !== '' ? (prefix + "_") : '') + k] = ar[k];\r
-               }\r
-\r
-               this.loadNextScript();\r
-       },\r
-\r
-       triggerNodeChange : function(focus, setup_content) {\r
-               var elm, inst, editorId, undoIndex = -1, undoLevels = -1, doc, anySelection = false, st;\r
-\r
-               if (tinyMCE.selectedInstance) {\r
-                       inst = tinyMCE.selectedInstance;\r
-                       elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();\r
-\r
-/*                     if (elm == inst.lastTriggerEl)\r
-                               return;\r
-\r
-                       inst.lastTriggerEl = elm;*/\r
-\r
-                       editorId = inst.editorId;\r
-                       st = inst.selection.getSelectedText();\r
-\r
-                       if (tinyMCE.settings.auto_resize)\r
-                               inst.resizeToContent();\r
-\r
-                       if (setup_content && tinyMCE.isGecko && inst.isHidden())\r
-                               elm = inst.getBody();\r
-\r
-                       inst.switchSettings();\r
-\r
-                       if (tinyMCE.selectedElement)\r
-                               anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (st && st.length > 0);\r
-\r
-                       if (tinyMCE.settings.custom_undo_redo) {\r
-                               undoIndex = inst.undoRedo.undoIndex;\r
-                               undoLevels = inst.undoRedo.undoLevels.length;\r
-                       }\r
-\r
-                       tinyMCE.dispatchCallback(inst, 'handle_node_change_callback', 'handleNodeChange', editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content);\r
-               }\r
-\r
-               if (this.selectedInstance && (typeof(focus) == "undefined" || focus))\r
-                       this.selectedInstance.contentWindow.focus();\r
-       },\r
-\r
-       _customCleanup : function(inst, type, content) {\r
-               var pl, po, i, customCleanup;\r
-\r
-               // Call custom cleanup\r
-               customCleanup = tinyMCE.settings.cleanup_callback;\r
-               if (customCleanup != '')\r
-                       content = tinyMCE.resolveDots(tinyMCE.settings.cleanup_callback, window)(type, content, inst);\r
-\r
-               // Trigger theme cleanup\r
-               po = tinyMCE.themes[tinyMCE.settings.theme];\r
-               if (po && po.cleanup)\r
-                       content = po.cleanup(type, content, inst);\r
-\r
-               // Trigger plugin cleanups\r
-               pl = inst.plugins;\r
-               for (i=0; i<pl.length; i++) {\r
-                       po = tinyMCE.plugins[pl[i]];\r
-\r
-                       if (po && po.cleanup)\r
-                               content = po.cleanup(type, content, inst);\r
-               }\r
-\r
-               return content;\r
-       },\r
-\r
-       setContent : function(h) {\r
-               if (tinyMCE.selectedInstance) {\r
-                       tinyMCE.selectedInstance.execCommand('mceSetContent', false, h);\r
-                       tinyMCE.selectedInstance.repaint();\r
-               }\r
-       },\r
-\r
-       importThemeLanguagePack : function(name) {\r
-               if (typeof(name) == "undefined")\r
-                       name = tinyMCE.settings.theme;\r
-\r
-               tinyMCE.loadScript(tinyMCE.baseURL + '/themes/' + name + '/langs/' + tinyMCE.settings.language + '.js');\r
-       },\r
-\r
-       importPluginLanguagePack : function(name) {\r
-               var b = tinyMCE.baseURL + '/plugins/' + name;\r
-\r
-               if (this.plugins[name])\r
-                       b = this.plugins[name].baseURL;\r
-\r
-               tinyMCE.loadScript(b + '/langs/' + tinyMCE.settings.language +  '.js');\r
-       },\r
-\r
-       applyTemplate : function(h, ag) {\r
-               return h.replace(new RegExp('\\{\\$([a-z0-9_]+)\\}', 'gi'), function(m, s) {\r
-                       if (s.indexOf('lang_') == 0 && tinyMCELang[s])\r
-                               return tinyMCELang[s];\r
-\r
-                       if (ag && ag[s])\r
-                               return ag[s];\r
-\r
-                       if (tinyMCE.settings[s])\r
-                               return tinyMCE.settings[s];\r
-\r
-                       if (m == 'themeurl')\r
-                               return tinyMCE.themeURL;\r
-\r
-                       return m;\r
-               });\r
-       },\r
-\r
-       replaceVar : function(h, r, v) {\r
-               return h.replace(new RegExp('{\\\$' + r + '}', 'g'), v);\r
-       },\r
-\r
-       openWindow : function(template, args) {\r
-               var html, width, height, x, y, resizable, scrollbars, url, name, win, modal, features;\r
-\r
-               args = !args ? {} : args;\r
-\r
-               args.mce_template_file = template.file;\r
-               args.mce_width = template.width;\r
-               args.mce_height = template.height;\r
-               tinyMCE.windowArgs = args;\r
-\r
-               html = template.html;\r
-               if (!(width = parseInt(template.width)))\r
-                       width = 320;\r
-\r
-               if (!(height = parseInt(template.height)))\r
-                       height = 200;\r
-\r
-               // Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!\r
-               if (tinyMCE.isIE)\r
-                       height += 40;\r
-               else\r
-                       height += 20;\r
-\r
-               x = parseInt(screen.width / 2.0) - (width / 2.0);\r
-               y = parseInt(screen.height / 2.0) - (height / 2.0);\r
-\r
-               resizable = (args && args.resizable) ? args.resizable : "no";\r
-               scrollbars = (args && args.scrollbars) ? args.scrollbars : "no";\r
-\r
-               if (template.file.charAt(0) != '/' && template.file.indexOf('://') == -1)\r
-                       url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template.file;\r
-               else\r
-                       url = template.file;\r
-\r
-               // Replace all args as variables in URL\r
-               for (name in args) {\r
-                       if (typeof(args[name]) == 'function')\r
-                               continue;\r
-\r
-                       url = tinyMCE.replaceVar(url, name, escape(args[name]));\r
-               }\r
-\r
-               if (html) {\r
-                       html = tinyMCE.replaceVar(html, "css", this.settings.popups_css);\r
-                       html = tinyMCE.applyTemplate(html, args);\r
-\r
-                       win = window.open("", "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=yes,minimizable=" + resizable + ",modal=yes,width=" + width + ",height=" + height + ",resizable=" + resizable);\r
-                       if (win == null) {\r
-                               alert(tinyMCELang.lang_popup_blocked);\r
-                               return;\r
-                       }\r
-\r
-                       win.document.write(html);\r
-                       win.document.close();\r
-                       win.resizeTo(width, height);\r
-                       win.focus();\r
-               } else {\r
-                       if ((tinyMCE.isRealIE) && resizable != 'yes' && tinyMCE.settings.dialog_type == "modal") {\r
-                               height += 10;\r
-\r
-                               features = "resizable:" + resizable + ";scroll:" + scrollbars + ";status:yes;center:yes;help:no;dialogWidth:" + width + "px;dialogHeight:" + height + "px;";\r
-\r
-                               window.showModalDialog(url, window, features);\r
-                       } else {\r
-                               modal = (resizable == "yes") ? "no" : "yes";\r
-\r
-                               if (tinyMCE.isGecko && tinyMCE.isMac)\r
-                                       modal = "no";\r
-\r
-                               if (template.close_previous != "no")\r
-                                       try {tinyMCE.lastWindow.close();} catch (ex) {}\r
-\r
-                               win = window.open(url, "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=" + modal + ",minimizable=" + resizable + ",modal=" + modal + ",width=" + width + ",height=" + height + ",resizable=" + resizable);\r
-                               if (win == null) {\r
-                                       alert(tinyMCELang.lang_popup_blocked);\r
-                                       return;\r
-                               }\r
-\r
-                               if (template.close_previous != "no")\r
-                                       tinyMCE.lastWindow = win;\r
-\r
-                               try {\r
-                                       win.resizeTo(width, height);\r
-                               } catch(e) {\r
-                                       // Ignore\r
-                               }\r
-\r
-                               // Make it bigger if statusbar is forced\r
-                               if (tinyMCE.isGecko) {\r
-                                       if (win.document.defaultView.statusbar.visible)\r
-                                               win.resizeBy(0, tinyMCE.isMac ? 10 : 24);\r
-                               }\r
-\r
-                               win.focus();\r
-                       }\r
-               }\r
-       },\r
-\r
-       closeWindow : function(win) {\r
-               win.close();\r
-       },\r
-\r
-       getVisualAidClass : function(class_name, state) {\r
-               var i, classNames, ar, className, aidClass = tinyMCE.settings.visual_table_class;\r
-\r
-               if (typeof(state) == "undefined")\r
-                       state = tinyMCE.settings.visual;\r
-\r
-               // Split\r
-               classNames = [];\r
-               ar = class_name.split(' ');\r
-               for (i=0; i<ar.length; i++) {\r
-                       if (ar[i] == aidClass)\r
-                               ar[i] = "";\r
-\r
-                       if (ar[i] !== '')\r
-                               classNames[classNames.length] = ar[i];\r
-               }\r
-\r
-               if (state)\r
-                       classNames[classNames.length] = aidClass;\r
-\r
-               // Glue\r
-               className = "";\r
-               for (i=0; i<classNames.length; i++) {\r
-                       if (i > 0)\r
-                               className += " ";\r
-\r
-                       className += classNames[i];\r
-               }\r
-\r
-               return className;\r
-       },\r
-\r
-       handleVisualAid : function(el, deep, state, inst, skip_dispatch) {\r
-               var i, x, y, tableElement, anchorName, oldW, oldH, bo, cn;\r
-\r
-               if (!el)\r
-                       return;\r
-\r
-               if (!skip_dispatch)\r
-                       tinyMCE.dispatchCallback(inst, 'handle_visual_aid_callback', 'handleVisualAid', el, deep, state, inst);\r
-\r
-               tableElement = null;\r
-\r
-               switch (el.nodeName) {\r
-                       case "TABLE":\r
-                               oldW = el.style.width;\r
-                               oldH = el.style.height;\r
-                               bo = tinyMCE.getAttrib(el, "border");\r
-\r
-                               bo = bo == '' || bo == "0" ? true : false;\r
-\r
-                               tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo));\r
-\r
-                               el.style.width = oldW;\r
-                               el.style.height = oldH;\r
-\r
-                               for (y=0; y<el.rows.length; y++) {\r
-                                       for (x=0; x<el.rows[y].cells.length; x++) {\r
-                                               cn = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x], "class"), state && bo);\r
-                                               tinyMCE.setAttrib(el.rows[y].cells[x], "class", cn);\r
-                                       }\r
-                               }\r
-\r
-                               break;\r
-\r
-                       case "A":\r
-                               anchorName = tinyMCE.getAttrib(el, "name");\r
-\r
-                               if (anchorName !== '' && state) {\r
-                                       el.title = anchorName;\r
-                                       tinyMCE.addCSSClass(el, 'mceItemAnchor');\r
-                               } else if (anchorName !== '' && !state)\r
-                                       el.className = '';\r
-\r
-                               break;\r
-               }\r
-\r
-               if (deep && el.hasChildNodes()) {\r
-                       for (i=0; i<el.childNodes.length; i++)\r
-                               tinyMCE.handleVisualAid(el.childNodes[i], deep, state, inst, true);\r
-               }\r
-       },\r
-\r
-       fixGeckoBaseHREFBug : function(m, e, h) {\r
-               var xsrc, xhref;\r
-\r
-               if (tinyMCE.isGecko) {\r
-                       if (m == 1) {\r
-                               h = h.replace(/\ssrc=/gi, " mce_tsrc=");\r
-                               h = h.replace(/\shref=/gi, " mce_thref=");\r
-\r
-                               return h;\r
-                       } else {\r
-                               // Why bother if there is no src or href broken\r
-                               if (!new RegExp('(src|href)=', 'g').test(h))\r
-                                       return h;\r
-\r
-                               // Restore src and href that gets messed up by Gecko\r
-                               tinyMCE.selectElements(e, 'A,IMG,SELECT,AREA,IFRAME,BASE,INPUT,SCRIPT,EMBED,OBJECT,LINK', function (n) {\r
-                                       xsrc = tinyMCE.getAttrib(n, "mce_tsrc");\r
-                                       xhref = tinyMCE.getAttrib(n, "mce_thref");\r
-\r
-                                       if (xsrc !== '') {\r
-                                               try {\r
-                                                       n.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, xsrc);\r
-                                               } catch (e) {\r
-                                                       // Ignore, Firefox cast exception if local file wasn't found\r
-                                               }\r
-\r
-                                               n.removeAttribute("mce_tsrc");\r
-                                       }\r
-\r
-                                       if (xhref !== '') {\r
-                                               try {\r
-                                                       n.href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, xhref);\r
-                                               } catch (e) {\r
-                                                       // Ignore, Firefox cast exception if local file wasn't found\r
-                                               }\r
-\r
-                                               n.removeAttribute("mce_thref");\r
-                                       }\r
-\r
-                                       return false;\r
-                               });\r
-\r
-                               // Restore text/comment nodes\r
-                               tinyMCE.selectNodes(e, function(n) {\r
-                                       if (n.nodeType == 3 || n.nodeType == 8) {\r
-                                               n.nodeValue = n.nodeValue.replace(/\smce_tsrc=/gi, " src=");\r
-                                               n.nodeValue = n.nodeValue.replace(/\smce_thref=/gi, " href=");\r
-                                       }\r
-\r
-                                       return false;\r
-                               });\r
-                       }\r
-               }\r
-\r
-               return h;\r
-       },\r
-\r
-       _setHTML : function(doc, html_content) {\r
-               var i, html, paras, node;\r
-\r
-               // Force closed anchors open\r
-               //html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');\r
-\r
-               html_content = tinyMCE.cleanupHTMLCode(html_content);\r
-\r
-               // Try innerHTML if it fails use pasteHTML in MSIE\r
-               try {\r
-                       tinyMCE.setInnerHTML(doc.body, html_content);\r
-               } catch (e) {\r
-                       if (this.isMSIE)\r
-                               doc.body.createTextRange().pasteHTML(html_content);\r
-               }\r
-\r
-               // Content duplication bug fix\r
-               if (tinyMCE.isIE && tinyMCE.settings.fix_content_duplication) {\r
-                       // Remove P elements in P elements\r
-                       paras = doc.getElementsByTagName("P");\r
-                       for (i=0; i<paras.length; i++) {\r
-                               node = paras[i];\r
-\r
-                               while ((node = node.parentNode) != null) {\r
-                                       if (node.nodeName == "P")\r
-                                               node.outerHTML = node.innerHTML;\r
-                               }\r
-                       }\r
-\r
-                       // Content duplication bug fix (Seems to be word crap)\r
-                       html = doc.body.innerHTML;\r
-\r
-                       // Always set the htmlText output\r
-                       tinyMCE.setInnerHTML(doc.body, html);\r
-               }\r
-\r
-               tinyMCE.cleanupAnchors(doc);\r
-\r
-               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
-                       tinyMCE.convertSpansToFonts(doc);\r
-       },\r
-\r
-       getEditorId : function(form_element) {\r
-               var inst = this.getInstanceById(form_element);\r
-\r
-               if (!inst)\r
-                       return null;\r
-\r
-               return inst.editorId;\r
-       },\r
-\r
-       getInstanceById : function(editor_id) {\r
-               var inst = this.instances[editor_id], n;\r
-\r
-               if (!inst) {\r
-                       for (n in tinyMCE.instances) {\r
-                               inst = tinyMCE.instances[n];\r
-\r
-                               if (!tinyMCE.isInstance(inst))\r
-                                       continue;\r
-\r
-                               if (inst.formTargetElementId == editor_id)\r
-                                       return inst;\r
-                       }\r
-               } else\r
-                       return inst;\r
-\r
-               return null;\r
-       },\r
-\r
-       queryInstanceCommandValue : function(editor_id, command) {\r
-               var inst = tinyMCE.getInstanceById(editor_id);\r
-\r
-               if (inst)\r
-                       return inst.queryCommandValue(command);\r
-\r
-               return false;\r
-       },\r
-\r
-       queryInstanceCommandState : function(editor_id, command) {\r
-               var inst = tinyMCE.getInstanceById(editor_id);\r
-\r
-               if (inst)\r
-                       return inst.queryCommandState(command);\r
-\r
-               return null;\r
-       },\r
-\r
-       setWindowArg : function(n, v) {\r
-               this.windowArgs[n] = v;\r
-       },\r
-\r
-       getWindowArg : function(n, d) {\r
-               return (typeof(this.windowArgs[n]) == "undefined") ? d : this.windowArgs[n];\r
-       },\r
-\r
-       getCSSClasses : function(editor_id, doc) {\r
-               var i, c, x, rule, styles, rules, csses, selectorText, inst = tinyMCE.getInstanceById(editor_id);\r
-               var cssClass, addClass, p;\r
-\r
-               if (!inst)\r
-                       inst = tinyMCE.selectedInstance;\r
-\r
-               if (!inst)\r
-                       return [];\r
-\r
-               if (!doc)\r
-                       doc = inst.getDoc();\r
-\r
-               // Is cached, use that\r
-               if (inst && inst.cssClasses.length > 0)\r
-                       return inst.cssClasses;\r
-\r
-               if (!doc)\r
-                       return;\r
-\r
-               styles = doc.styleSheets;\r
-\r
-               if (styles && styles.length > 0) {\r
-                       for (x=0; x<styles.length; x++) {\r
-                               csses = null;\r
-\r
-                               try {\r
-                                       csses = tinyMCE.isIE ? doc.styleSheets(x).rules : styles[x].cssRules;\r
-                               } catch(e) {\r
-                                       // Just ignore any errors I know this is ugly!!\r
-                               }\r
-       \r
-                               if (!csses)\r
-                                       return [];\r
-\r
-                               for (i=0; i<csses.length; i++) {\r
-                                       selectorText = csses[i].selectorText;\r
-\r
-                                       // Can be multiple rules per selector\r
-                                       if (selectorText) {\r
-                                               rules = selectorText.split(',');\r
-                                               for (c=0; c<rules.length; c++) {\r
-                                                       rule = rules[c];\r
-\r
-                                                       // Strip spaces between selectors\r
-                                                       while (rule.indexOf(' ') == 0)\r
-                                                               rule = rule.substring(1);\r
-\r
-                                                       // Invalid rule\r
-                                                       if (rule.indexOf(' ') != -1 || rule.indexOf(':') != -1 || rule.indexOf('mceItem') != -1)\r
-                                                               continue;\r
-\r
-                                                       if (rule.indexOf(tinyMCE.settings.visual_table_class) != -1 || rule.indexOf('mceEditable') != -1 || rule.indexOf('mceNonEditable') != -1)\r
-                                                               continue;\r
-\r
-                                                       // Is class rule\r
-                                                       if (rule.indexOf('.') != -1) {\r
-                                                               cssClass = rule.substring(rule.indexOf('.') + 1);\r
-                                                               addClass = true;\r
-\r
-                                                               for (p=0; p<inst.cssClasses.length && addClass; p++) {\r
-                                                                       if (inst.cssClasses[p] == cssClass)\r
-                                                                               addClass = false;\r
-                                                               }\r
-\r
-                                                               if (addClass)\r
-                                                                       inst.cssClasses[inst.cssClasses.length] = cssClass;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-\r
-               return inst.cssClasses;\r
-       },\r
-\r
-       regexpReplace : function(in_str, reg_exp, replace_str, opts) {\r
-               var re;\r
-\r
-               if (in_str == null)\r
-                       return in_str;\r
-\r
-               if (typeof(opts) == "undefined")\r
-                       opts = 'g';\r
-\r
-               re = new RegExp(reg_exp, opts);\r
-\r
-               return in_str.replace(re, replace_str);\r
-       },\r
-\r
-       trim : function(s) {\r
-               return s.replace(/^\s*|\s*$/g, "");\r
-       },\r
-\r
-       cleanupEventStr : function(s) {\r
-               s = "" + s;\r
-               s = s.replace('function anonymous()\n{\n', '');\r
-               s = s.replace('\n}', '');\r
-               s = s.replace(/^return true;/gi, ''); // Remove event blocker\r
-\r
-               return s;\r
-       },\r
-\r
-       getControlHTML : function(c) {\r
-               var i, l, n, o, v, rtl = tinyMCE.getLang('lang_dir') == 'rtl';\r
-\r
-               l = tinyMCE.plugins;\r
-               for (n in l) {\r
-                       o = l[n];\r
-\r
-                       if (o.getControlHTML && (v = o.getControlHTML(c)) !== '') {\r
-                               if (rtl)\r
-                                       return '<span dir="rtl">' + tinyMCE.replaceVar(v, "pluginurl", o.baseURL) + '</span>';\r
-\r
-                               return tinyMCE.replaceVar(v, "pluginurl", o.baseURL);\r
-                       }\r
-               }\r
-\r
-               o = tinyMCE.themes[tinyMCE.settings.theme];\r
-               if (o.getControlHTML && (v = o.getControlHTML(c)) !== '') {\r
-                       if (rtl)\r
-                               return '<span dir="rtl">' + v + '</span>';\r
-\r
-                       return v;\r
-               }\r
-\r
-               return '';\r
-       },\r
-\r
-       evalFunc : function(f, idx, a, o) {\r
-               o = !o ? window : o;\r
-               f = typeof(f) == 'function' ? f : o[f];\r
-\r
-               return f.apply(o, Array.prototype.slice.call(a, idx));\r
-       },\r
-\r
-       dispatchCallback : function(i, p, n) {\r
-               return this.callFunc(i, p, n, 0, this.dispatchCallback.arguments);\r
-       },\r
-\r
-       executeCallback : function(i, p, n) {\r
-               return this.callFunc(i, p, n, 1, this.executeCallback.arguments);\r
-       },\r
-\r
-       execCommandCallback : function(i, p, n) {\r
-               return this.callFunc(i, p, n, 2, this.execCommandCallback.arguments);\r
-       },\r
-\r
-       callFunc : function(ins, p, n, m, a) {\r
-               var l, i, on, o, s, v;\r
-\r
-               s = m == 2;\r
-\r
-               l = tinyMCE.getParam(p, '');\r
-\r
-               if (l !== '' && (v = tinyMCE.evalFunc(l, 3, a)) == s && m > 0)\r
-                       return true;\r
-\r
-               if (ins != null) {\r
-                       for (i=0, l = ins.plugins; i<l.length; i++) {\r
-                               o = tinyMCE.plugins[l[i]];\r
-\r
-                               if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0)\r
-                                       return true;\r
-                       }\r
-               }\r
-\r
-               l = tinyMCE.themes;\r
-               for (on in l) {\r
-                       o = l[on];\r
-\r
-                       if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0)\r
-                               return true;\r
-               }\r
-\r
-               return false;\r
-       },\r
-\r
-       resolveDots : function(s, o) {\r
-               var i;\r
-\r
-               if (typeof(s) == 'string') {\r
-                       for (i=0, s=s.split('.'); i<s.length; i++)\r
-                               o = o[s[i]];\r
-               } else\r
-                       o = s;\r
-\r
-               return o;\r
-       },\r
-\r
-       xmlEncode : function(s) {\r
-               return s ? ('' + s).replace(this.xmlEncodeRe, function (c, b) {\r
-                       switch (c) {\r
-                               case '&':\r
-                                       return '&amp;';\r
-\r
-                               case '"':\r
-                                       return '&quot;';\r
-\r
-                               case '<':\r
-                                       return '&lt;';\r
-\r
-                               case '>':\r
-                                       return '&gt;';\r
-                       }\r
-\r
-                       return c;\r
-               }) : s;\r
-       },\r
-\r
-       add : function(c, m) {\r
-               var n;\r
-\r
-               for (n in m)\r
-                       c.prototype[n] = m[n];\r
-       },\r
-\r
-       extend : function(p, np) {\r
-               var o = {}, n;\r
-\r
-               o.parent = p;\r
-\r
-               for (n in p)\r
-                       o[n] = p[n];\r
-\r
-               for (n in np)\r
-                       o[n] = np[n];\r
-\r
-               return o;\r
-       },\r
-\r
-       hideMenus : function() {\r
-               var e = tinyMCE.lastSelectedMenuBtn;\r
-\r
-               if (tinyMCE.lastMenu) {\r
-                       tinyMCE.lastMenu.hide();\r
-                       tinyMCE.lastMenu = null;\r
-               }\r
-\r
-               if (e) {\r
-                       tinyMCE.switchClass(e, tinyMCE.lastMenuBtnClass);\r
-                       tinyMCE.lastSelectedMenuBtn = null;\r
-               }\r
-       }\r
-\r
-       };\r
-\r
-// Global instances\r
-var TinyMCE = TinyMCE_Engine; // Compatiblity with gzip compressors\r
-var tinyMCE = new TinyMCE_Engine();\r
-var tinyMCELang = {};\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_Control.class.js */\r
-\r
-function TinyMCE_Control(settings) {\r
-       var t, i, tos, fu, p, x, fn, fu, pn, s = settings;\r
-\r
-       this.undoRedoLevel = true;\r
-       this.isTinyMCE_Control = true;\r
-\r
-       // Default settings\r
-       this.enabled = true;\r
-       this.settings = s;\r
-       this.settings.theme = tinyMCE.getParam("theme", "default");\r
-       this.settings.width = tinyMCE.getParam("width", -1);\r
-       this.settings.height = tinyMCE.getParam("height", -1);\r
-       this.selection = new TinyMCE_Selection(this);\r
-       this.undoRedo = new TinyMCE_UndoRedo(this);\r
-       this.cleanup = new TinyMCE_Cleanup();\r
-       this.shortcuts = [];\r
-       this.hasMouseMoved = false;\r
-       this.foreColor = this.backColor = "#999999";\r
-       this.data = {};\r
-       this.cssClasses = [];\r
-\r
-       this.cleanup.init({\r
-               valid_elements : s.valid_elements,\r
-               extended_valid_elements : s.extended_valid_elements,\r
-               valid_child_elements : s.valid_child_elements,\r
-               entities : s.entities,\r
-               entity_encoding : s.entity_encoding,\r
-               debug : s.cleanup_debug,\r
-               indent : s.apply_source_formatting,\r
-               invalid_elements : s.invalid_elements,\r
-               verify_html : s.verify_html,\r
-               fix_content_duplication : s.fix_content_duplication,\r
-               convert_fonts_to_spans : s.convert_fonts_to_spans\r
-       });\r
-\r
-       // Wrap old theme\r
-       t = this.settings.theme;\r
-       if (!tinyMCE.hasTheme(t)) {\r
-               fn = tinyMCE.callbacks;\r
-               tos = {};\r
-\r
-               for (i=0; i<fn.length; i++) {\r
-                       if ((fu = window['TinyMCE_' + t + "_" + fn[i]]))\r
-                               tos[fn[i]] = fu;\r
-               }\r
-\r
-               tinyMCE.addTheme(t, tos);\r
-       }\r
-\r
-       // Wrap old plugins\r
-       this.plugins = [];\r
-       p = tinyMCE.getParam('plugins', '', true, ',');\r
-       if (p.length > 0) {\r
-               for (i=0; i<p.length; i++) {\r
-                       pn = p[i];\r
-\r
-                       if (pn.charAt(0) == '-')\r
-                               pn = pn.substring(1);\r
-\r
-                       if (!tinyMCE.hasPlugin(pn)) {\r
-                               fn = tinyMCE.callbacks;\r
-                               tos = {};\r
-\r
-                               for (x=0; x<fn.length; x++) {\r
-                                       if ((fu = window['TinyMCE_' + pn + "_" + fn[x]]))\r
-                                               tos[fn[x]] = fu;\r
-                               }\r
-\r
-                               tinyMCE.addPlugin(pn, tos);\r
-                       }\r
-\r
-                       this.plugins[this.plugins.length] = pn; \r
-               }\r
-       }\r
-};\r
-\r
-TinyMCE_Control.prototype = {\r
-       selection : null,\r
-\r
-       settings : null,\r
-\r
-       cleanup : null,\r
-\r
-       getData : function(na) {\r
-               var o = this.data[na];\r
-\r
-               if (!o)\r
-                       o = this.data[na] = {};\r
-\r
-               return o;\r
-       },\r
-\r
-       hasPlugin : function(n) {\r
-               var i;\r
-\r
-               for (i=0; i<this.plugins.length; i++) {\r
-                       if (this.plugins[i] == n)\r
-                               return true;\r
-               }\r
-\r
-               return false;\r
-       },\r
-\r
-       addPlugin : function(n, p) {\r
-               if (!this.hasPlugin(n)) {\r
-                       tinyMCE.addPlugin(n, p);\r
-                       this.plugins[this.plugins.length] = n;\r
-               }\r
-       },\r
-\r
-       repaint : function() {\r
-               var s, b, ex;\r
-\r
-               if (tinyMCE.isRealIE)\r
-                       return;\r
-\r
-               try {\r
-                       s = this.selection;\r
-                       b = s.getBookmark(true);\r
-                       this.getBody().style.display = 'none';\r
-                       this.getDoc().execCommand('selectall', false, null);\r
-                       this.getSel().collapseToStart();\r
-                       this.getBody().style.display = 'block';\r
-                       s.moveToBookmark(b);\r
-               } catch (ex) {\r
-                       // Ignore\r
-               }\r
-       },\r
-\r
-       switchSettings : function() {\r
-               if (tinyMCE.configs.length > 1 && tinyMCE.currentConfig != this.settings.index) {\r
-                       tinyMCE.settings = this.settings;\r
-                       tinyMCE.currentConfig = this.settings.index;\r
-               }\r
-       },\r
-\r
-       select : function() {\r
-               var oldInst = tinyMCE.selectedInstance;\r
-\r
-               if (oldInst != this) {\r
-                       if (oldInst)\r
-                               oldInst.execCommand('mceEndTyping');\r
-\r
-                       tinyMCE.dispatchCallback(this, 'select_instance_callback', 'selectInstance', this, oldInst);\r
-                       tinyMCE.selectedInstance = this;\r
-               }\r
-       },\r
-\r
-       getBody : function() {\r
-               return this.contentBody ? this.contentBody : this.getDoc().body;\r
-       },\r
-\r
-       getDoc : function() {\r
-//             return this.contentDocument ? this.contentDocument : this.contentWindow.document; // Removed due to IE 5.5 ?\r
-               return this.contentWindow.document;\r
-       },\r
-\r
-       getWin : function() {\r
-               return this.contentWindow;\r
-       },\r
-\r
-       getContainerWin : function() {\r
-               return this.containerWindow ? this.containerWindow : window;\r
-       },\r
-\r
-       getViewPort : function() {\r
-               return tinyMCE.getViewPort(this.getWin());\r
-       },\r
-\r
-       getParentNode : function(n, f) {\r
-               return tinyMCE.getParentNode(n, f, this.getBody());\r
-       },\r
-\r
-       getParentElement : function(n, na, f) {\r
-               return tinyMCE.getParentElement(n, na, f, this.getBody());\r
-       },\r
-\r
-       getParentBlockElement : function(n) {\r
-               return tinyMCE.getParentBlockElement(n, this.getBody());\r
-       },\r
-\r
-       resizeToContent : function() {\r
-               var d = this.getDoc(), b = d.body, de = d.documentElement;\r
-\r
-               this.iframeElement.style.height = (tinyMCE.isRealIE) ? b.scrollHeight : de.offsetHeight + 'px';\r
-       },\r
-\r
-       addShortcut : function(m, k, d, cmd, ui, va) {\r
-               var n = typeof(k) == "number", ie = tinyMCE.isIE, c, sc, i, scl = this.shortcuts;\r
-\r
-               if (!tinyMCE.getParam('custom_shortcuts'))\r
-                       return false;\r
-\r
-               m = m.toLowerCase();\r
-               k = ie && !n ? k.toUpperCase() : k;\r
-               c = n ? null : k.charCodeAt(0);\r
-               d = d && d.indexOf('lang_') == 0 ? tinyMCE.getLang(d) : d;\r
-\r
-               sc = {\r
-                       alt : m.indexOf('alt') != -1,\r
-                       ctrl : m.indexOf('ctrl') != -1,\r
-                       shift : m.indexOf('shift') != -1,\r
-                       charCode : c,\r
-                       keyCode : n ? k : (ie ? c : null),\r
-                       desc : d,\r
-                       cmd : cmd,\r
-                       ui : ui,\r
-                       val : va\r
-               };\r
-\r
-               for (i=0; i<scl.length; i++) {\r
-                       if (sc.alt == scl[i].alt && sc.ctrl == scl[i].ctrl && sc.shift == scl[i].shift\r
-                               && sc.charCode == scl[i].charCode && sc.keyCode == scl[i].keyCode) {\r
-                               return false;\r
-                       }\r
-               }\r
-\r
-               scl[scl.length] = sc;\r
-\r
-               return true;\r
-       },\r
-\r
-       handleShortcut : function(e) {\r
-               var i, s, o;\r
-\r
-               // Normal key press, then ignore it\r
-               if (!e.altKey && !e.ctrlKey)\r
-                       return false;\r
-\r
-               s = this.shortcuts;\r
-\r
-               for (i=0; i<s.length; i++) {\r
-                       o = s[i];\r
-\r
-                       if (o.alt == e.altKey && o.ctrl == e.ctrlKey && (o.keyCode == e.keyCode || o.charCode == e.charCode)) {\r
-                               if (o.cmd && (e.type == "keydown" || (e.type == "keypress" && !tinyMCE.isOpera)))\r
-                                       tinyMCE.execCommand(o.cmd, o.ui, o.val);\r
-\r
-                               tinyMCE.cancelEvent(e);\r
-                               return true;\r
-                       }\r
-               }\r
-\r
-               return false;\r
-       },\r
-\r
-       autoResetDesignMode : function() {\r
-               // Add fix for tab/style.display none/block problems in Gecko\r
-               if (!tinyMCE.isIE && this.isHidden() && tinyMCE.getParam('auto_reset_designmode'))\r
-                       eval('try { this.getDoc().designMode = "On"; this.useCSS = false; } catch(e) {}');\r
-       },\r
-\r
-       isHidden : function() {\r
-               var s;\r
-\r
-               if (tinyMCE.isIE)\r
-                       return false;\r
-\r
-               s = this.getSel();\r
-\r
-               // Weird, wheres that cursor selection?\r
-               return (!s || !s.rangeCount || s.rangeCount == 0);\r
-       },\r
-\r
-       isDirty : function() {\r
-               // Is content modified and not in a submit procedure\r
-               return tinyMCE.trim(this.startContent) != tinyMCE.trim(this.getBody().innerHTML) && !this.isNotDirty;\r
-       },\r
-\r
-       _mergeElements : function(scmd, pa, ch, override) {\r
-               var st, stc, className, n;\r
-\r
-               if (scmd == "removeformat") {\r
-                       pa.className = "";\r
-                       pa.style.cssText = "";\r
-                       ch.className = "";\r
-                       ch.style.cssText = "";\r
-                       return;\r
-               }\r
-\r
-               st = tinyMCE.parseStyle(tinyMCE.getAttrib(pa, "style"));\r
-               stc = tinyMCE.parseStyle(tinyMCE.getAttrib(ch, "style"));\r
-               className = tinyMCE.getAttrib(pa, "class");\r
-\r
-               // Removed class adding due to bug #1478272\r
-               className = tinyMCE.getAttrib(ch, "class");\r
-\r
-               if (override) {\r
-                       for (n in st) {\r
-                               if (typeof(st[n]) == 'function')\r
-                                       continue;\r
-\r
-                               stc[n] = st[n];\r
-                       }\r
-               } else {\r
-                       for (n in stc) {\r
-                               if (typeof(stc[n]) == 'function')\r
-                                       continue;\r
-\r
-                               st[n] = stc[n];\r
-                       }\r
-               }\r
-\r
-               tinyMCE.setAttrib(pa, "style", tinyMCE.serializeStyle(st));\r
-               tinyMCE.setAttrib(pa, "class", tinyMCE.trim(className));\r
-               ch.className = "";\r
-               ch.style.cssText = "";\r
-               ch.removeAttribute("class");\r
-               ch.removeAttribute("style");\r
-       },\r
-\r
-       _fixRootBlocks : function() {\r
-               var rb, b, ne, be, nx, bm;\r
-\r
-               rb = tinyMCE.getParam('forced_root_block');\r
-               if (!rb)\r
-                       return;\r
-\r
-               b = this.getBody();\r
-               ne = b.firstChild;\r
-\r
-               while (ne) {\r
-                       nx = ne.nextSibling;\r
-\r
-                       // If text node or inline element wrap it in a block element\r
-                       if (ne.nodeType == 3 || !tinyMCE.blockRegExp.test(ne.nodeName)) {\r
-                               if (!bm)\r
-                                       bm = this.selection.getBookmark();\r
-\r
-                               if (!be) {\r
-                                       be = this.getDoc().createElement(rb);\r
-                                       be.appendChild(ne.cloneNode(true));\r
-                                       b.replaceChild(be, ne);\r
-                               } else {\r
-                                       be.appendChild(ne.cloneNode(true));\r
-                                       b.removeChild(ne);\r
-                               }\r
-                       } else\r
-                               be = null;\r
-\r
-                       ne = nx;\r
-               }\r
-\r
-               if (bm)\r
-                       this.selection.moveToBookmark(bm);\r
-       },\r
-\r
-       _fixTrailingNbsp : function() {\r
-               var s = this.selection, e = s.getFocusElement(), bm, v;\r
-\r
-               if (e && tinyMCE.blockRegExp.test(e.nodeName) && e.firstChild) {\r
-                       v = e.firstChild.nodeValue;\r
-\r
-                       if (v && v.length > 1 && /(^\u00a0|\u00a0$)/.test(v)) {\r
-                               e.firstChild.nodeValue = v.replace(/(^\u00a0|\u00a0$)/, '');\r
-                               s.selectNode(e.firstChild, true, false, false); // Select and collapse\r
-                       }\r
-               }\r
-       },\r
-\r
-       _setUseCSS : function(b) {\r
-               var d = this.getDoc();\r
-\r
-               try {d.execCommand("useCSS", false, !b);} catch (ex) {}\r
-               try {d.execCommand("styleWithCSS", false, b);} catch (ex) {}\r
-\r
-               if (!tinyMCE.getParam("table_inline_editing"))\r
-                       try {d.execCommand('enableInlineTableEditing', false, "false");} catch (ex) {}\r
-\r
-               if (!tinyMCE.getParam("object_resizing"))\r
-                       try {d.execCommand('enableObjectResizing', false, "false");} catch (ex) {}\r
-       },\r
-\r
-       execCommand : function(command, user_interface, value) {\r
-               var i, x, z, align, img, div, doc = this.getDoc(), win = this.getWin(), focusElm = this.getFocusElement();\r
-\r
-               // Is not a undo specific command\r
-               if (!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel', 'gi').test(command))\r
-                       this.undoBookmark = null;\r
-\r
-               // Mozilla issue\r
-               if (!tinyMCE.isIE && !this.useCSS) {\r
-                       this._setUseCSS(false);\r
-                       this.useCSS = true;\r
-               }\r
-\r
-               //debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);\r
-               this.contentDocument = doc; // <-- Strange, unless this is applied Mozilla 1.3 breaks\r
-\r
-               // Don't dispatch key commands\r
-               if (!/mceStartTyping|mceEndTyping/.test(command)) {\r
-                       if (tinyMCE.execCommandCallback(this, 'execcommand_callback', 'execCommand', this.editorId, this.getBody(), command, user_interface, value))\r
-                               return;\r
-               }\r
-\r
-               // Fix align on images\r
-               if (focusElm && focusElm.nodeName == "IMG") {\r
-                       align = focusElm.getAttribute('align');\r
-                       img = command == "JustifyCenter" ? focusElm.cloneNode(false) : focusElm;\r
-\r
-                       switch (command) {\r
-                               case "JustifyLeft":\r
-                                       if (align == 'left')\r
-                                               img.removeAttribute('align');\r
-                                       else\r
-                                               img.setAttribute('align', 'left');\r
-\r
-                                       // Remove the div\r
-                                       div = focusElm.parentNode;\r
-                                       if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
-                                               div.parentNode.replaceChild(img, div);\r
-\r
-                                       this.selection.selectNode(img);\r
-                                       this.repaint();\r
-                                       tinyMCE.triggerNodeChange();\r
-                                       return;\r
-\r
-                               case "JustifyCenter":\r
-                                       img.removeAttribute('align');\r
-\r
-                                       // Is centered\r
-                                       div = tinyMCE.getParentElement(focusElm, "div");\r
-                                       if (div && div.style.textAlign == "center") {\r
-                                               // Remove div\r
-                                               if (div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
-                                                       div.parentNode.replaceChild(img, div);\r
-                                       } else {\r
-                                               // Add div\r
-                                               div = this.getDoc().createElement("div");\r
-                                               div.style.textAlign = 'center';\r
-                                               div.appendChild(img);\r
-                                               focusElm.parentNode.replaceChild(div, focusElm);\r
-                                       }\r
-\r
-                                       this.selection.selectNode(img);\r
-                                       this.repaint();\r
-                                       tinyMCE.triggerNodeChange();\r
-                                       return;\r
-\r
-                               case "JustifyRight":\r
-                                       if (align == 'right')\r
-                                               img.removeAttribute('align');\r
-                                       else\r
-                                               img.setAttribute('align', 'right');\r
-\r
-                                       // Remove the div\r
-                                       div = focusElm.parentNode;\r
-                                       if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
-                                               div.parentNode.replaceChild(img, div);\r
-\r
-                                       this.selection.selectNode(img);\r
-                                       this.repaint();\r
-                                       tinyMCE.triggerNodeChange();\r
-                                       return;\r
-                       }\r
-               }\r
-\r
-               if (tinyMCE.settings.force_br_newlines) {\r
-                       var alignValue = "";\r
-\r
-                       if (doc.selection.type != "Control") {\r
-                               switch (command) {\r
-                                               case "JustifyLeft":\r
-                                                       alignValue = "left";\r
-                                                       break;\r
-\r
-                                               case "JustifyCenter":\r
-                                                       alignValue = "center";\r
-                                                       break;\r
-\r
-                                               case "JustifyFull":\r
-                                                       alignValue = "justify";\r
-                                                       break;\r
-\r
-                                               case "JustifyRight":\r
-                                                       alignValue = "right";\r
-                                                       break;\r
-                               }\r
-\r
-                               if (alignValue !== '') {\r
-                                       var rng = doc.selection.createRange();\r
-\r
-                                       if ((divElm = tinyMCE.getParentElement(rng.parentElement(), "div")) != null)\r
-                                               divElm.setAttribute("align", alignValue);\r
-                                       else if (rng.pasteHTML && rng.htmlText.length > 0)\r
-                                               rng.pasteHTML('<div align="' + alignValue + '">' + rng.htmlText + "</div>");\r
-\r
-                                       tinyMCE.triggerNodeChange();\r
-                                       return;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               switch (command) {\r
-                       case "mceRepaint":\r
-                               this.repaint();\r
-                               return true;\r
-\r
-                       case "unlink":\r
-                               // Unlink if caret is inside link\r
-                               if (tinyMCE.isGecko && this.getSel().isCollapsed) {\r
-                                       focusElm = tinyMCE.getParentElement(focusElm, 'A');\r
-\r
-                                       if (focusElm)\r
-                                               this.selection.selectNode(focusElm, false);\r
-                               }\r
-\r
-                               this.getDoc().execCommand(command, user_interface, value);\r
-\r
-                               tinyMCE.isGecko && this.getSel().collapseToEnd();\r
-\r
-                               tinyMCE.triggerNodeChange();\r
-\r
-                               return true;\r
-\r
-                       case "InsertUnorderedList":\r
-                       case "InsertOrderedList":\r
-                               this.getDoc().execCommand(command, user_interface, value);\r
-                               tinyMCE.triggerNodeChange();\r
-                               break;\r
-\r
-                       case "Strikethrough":\r
-                               this.getDoc().execCommand(command, user_interface, value);\r
-                               tinyMCE.triggerNodeChange();\r
-                               break;\r
-\r
-                       case "mceSelectNode":\r
-                               this.selection.selectNode(value);\r
-                               tinyMCE.triggerNodeChange();\r
-                               tinyMCE.selectedNode = value;\r
-                               break;\r
-\r
-                       case "FormatBlock":\r
-                               if (value == null || value == '') {\r
-                                       var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");\r
-\r
-                                       if (elm)\r
-                                               this.execCommand("mceRemoveNode", false, elm);\r
-                               } else {\r
-                                       if (!this.cleanup.isValid(value))\r
-                                               return true;\r
-\r
-                                       if (tinyMCE.isGecko && new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>', 'gi').test(value))\r
-                                               value = value.replace(/[^a-z]/gi, '');\r
-\r
-                                       if (tinyMCE.isIE && new RegExp('blockquote|code|samp', 'gi').test(value)) {\r
-                                               var b = this.selection.getBookmark();\r
-                                               this.getDoc().execCommand("FormatBlock", false, '<p>');\r
-                                               tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()), value);\r
-                                               this.selection.moveToBookmark(b);\r
-                                       } else\r
-                                               this.getDoc().execCommand("FormatBlock", false, value);\r
-                               }\r
-\r
-                               tinyMCE.triggerNodeChange();\r
-\r
-                               break;\r
-\r
-                       case "mceRemoveNode":\r
-                               if (!value)\r
-                                       value = tinyMCE.getParentElement(this.getFocusElement());\r
-\r
-                               if (tinyMCE.isIE) {\r
-                                       value.outerHTML = value.innerHTML;\r
-                               } else {\r
-                                       var rng = value.ownerDocument.createRange();\r
-                                       rng.setStartBefore(value);\r
-                                       rng.setEndAfter(value);\r
-                                       rng.deleteContents();\r
-                                       rng.insertNode(rng.createContextualFragment(value.innerHTML));\r
-                               }\r
-\r
-                               tinyMCE.triggerNodeChange();\r
-\r
-                               break;\r
-\r
-                       case "mceSelectNodeDepth":\r
-                               var parentNode = this.getFocusElement();\r
-                               for (i=0; parentNode; i++) {\r
-                                       if (parentNode.nodeName.toLowerCase() == "body")\r
-                                               break;\r
-\r
-                                       if (parentNode.nodeName.toLowerCase() == "#text") {\r
-                                               i--;\r
-                                               parentNode = parentNode.parentNode;\r
-                                               continue;\r
-                                       }\r
-\r
-                                       if (i == value) {\r
-                                               this.selection.selectNode(parentNode, false);\r
-                                               tinyMCE.triggerNodeChange();\r
-                                               tinyMCE.selectedNode = parentNode;\r
-                                               return;\r
-                                       }\r
-\r
-                                       parentNode = parentNode.parentNode;\r
-                               }\r
-\r
-                               break;\r
-\r
-                       case "mceSetStyleInfo":\r
-                       case "SetStyleInfo":\r
-                               var rng = this.getRng();\r
-                               var sel = this.getSel();\r
-                               var scmd = value.command;\r
-                               var sname = value.name;\r
-                               var svalue = value.value == null ? '' : value.value;\r
-                               //var svalue = value['value'] == null ? '' : value['value'];\r
-                               var wrapper = value.wrapper ? value.wrapper : "span";\r
-                               var parentElm = null;\r
-                               var invalidRe = new RegExp("^BODY|HTML$", "g");\r
-                               var invalidParentsRe = tinyMCE.settings.merge_styles_invalid_parents !== '' ? new RegExp(tinyMCE.settings.merge_styles_invalid_parents, "gi") : null;\r
-\r
-                               // Whole element selected check\r
-                               if (tinyMCE.isIE) {\r
-                                       // Control range\r
-                                       if (rng.item)\r
-                                               parentElm = rng.item(0);\r
-                                       else {\r
-                                               var pelm = rng.parentElement();\r
-                                               var prng = doc.selection.createRange();\r
-                                               prng.moveToElementText(pelm);\r
-\r
-                                               if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) {\r
-                                                       if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName))\r
-                                                               parentElm = pelm;\r
-                                               }\r
-                                       }\r
-                               } else {\r
-                                       var felm = this.getFocusElement();\r
-                                       if (sel.isCollapsed || (new RegExp('td|tr|tbody|table|img', 'gi').test(felm.nodeName) && sel.anchorNode == felm.parentNode))\r
-                                               parentElm = felm;\r
-                               }\r
-\r
-                               // Whole element selected\r
-                               if (parentElm && !invalidRe.test(parentElm.nodeName)) {\r
-                                       if (scmd == "setstyle")\r
-                                               tinyMCE.setStyleAttrib(parentElm, sname, svalue);\r
-\r
-                                       if (scmd == "setattrib")\r
-                                               tinyMCE.setAttrib(parentElm, sname, svalue);\r
-\r
-                                       if (scmd == "removeformat") {\r
-                                               parentElm.style.cssText = '';\r
-                                               tinyMCE.setAttrib(parentElm, 'class', '');\r
-                                       }\r
-\r
-                                       // Remove style/attribs from all children\r
-                                       var ch = tinyMCE.getNodeTree(parentElm, [], 1);\r
-                                       for (z=0; z<ch.length; z++) {\r
-                                               if (ch[z] == parentElm)\r
-                                                       continue;\r
-\r
-                                               if (scmd == "setstyle")\r
-                                                       tinyMCE.setStyleAttrib(ch[z], sname, '');\r
-\r
-                                               if (scmd == "setattrib")\r
-                                                       tinyMCE.setAttrib(ch[z], sname, '');\r
-\r
-                                               if (scmd == "removeformat") {\r
-                                                       ch[z].style.cssText = '';\r
-                                                       tinyMCE.setAttrib(ch[z], 'class', '');\r
-                                               }\r
-                                       }\r
-                               } else {\r
-                                       this._setUseCSS(false); // Bug in FF when running in fullscreen\r
-                                       doc.execCommand("FontName", false, "#mce_temp_font#");\r
-                                       var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#");\r
-\r
-                                       // Change them all\r
-                                       for (x=0; x<elementArray.length; x++) {\r
-                                               elm = elementArray[x];\r
-                                               if (elm) {\r
-                                                       var spanElm = doc.createElement(wrapper);\r
-\r
-                                                       if (scmd == "setstyle")\r
-                                                               tinyMCE.setStyleAttrib(spanElm, sname, svalue);\r
-\r
-                                                       if (scmd == "setattrib")\r
-                                                               tinyMCE.setAttrib(spanElm, sname, svalue);\r
-\r
-                                                       if (scmd == "removeformat") {\r
-                                                               spanElm.style.cssText = '';\r
-                                                               tinyMCE.setAttrib(spanElm, 'class', '');\r
-                                                       }\r
-\r
-                                                       if (elm.hasChildNodes()) {\r
-                                                               for (i=0; i<elm.childNodes.length; i++)\r
-                                                                       spanElm.appendChild(elm.childNodes[i].cloneNode(true));\r
-                                                       }\r
-\r
-                                                       spanElm.setAttribute("mce_new", "true");\r
-                                                       elm.parentNode.replaceChild(spanElm, elm);\r
-\r
-                                                       // Remove style/attribs from all children\r
-                                                       var ch = tinyMCE.getNodeTree(spanElm, [], 1);\r
-                                                       for (z=0; z<ch.length; z++) {\r
-                                                               if (ch[z] == spanElm)\r
-                                                                       continue;\r
-\r
-                                                               if (scmd == "setstyle")\r
-                                                                       tinyMCE.setStyleAttrib(ch[z], sname, '');\r
-\r
-                                                               if (scmd == "setattrib")\r
-                                                                       tinyMCE.setAttrib(ch[z], sname, '');\r
-\r
-                                                               if (scmd == "removeformat") {\r
-                                                                       ch[z].style.cssText = '';\r
-                                                                       tinyMCE.setAttrib(ch[z], 'class', '');\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                               }\r
-\r
-                               // Cleaup wrappers\r
-                               var nodes = doc.getElementsByTagName(wrapper);\r
-                               for (i=nodes.length-1; i>=0; i--) {\r
-                                       var elm = nodes[i];\r
-                                       var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true";\r
-\r
-                                       elm.removeAttribute("mce_new");\r
-\r
-                                       // Is only child a element\r
-                                       if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {\r
-                                               //tinyMCE.debug("merge1" + isNew);\r
-                                               this._mergeElements(scmd, elm, elm.childNodes[0], isNew);\r
-                                               continue;\r
-                                       }\r
-\r
-                                       // Is I the only child\r
-                                       if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {\r
-                                               //tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);\r
-                                               if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))\r
-                                                       this._mergeElements(scmd, elm.parentNode, elm, false);\r
-                                       }\r
-                               }\r
-\r
-                               // Remove empty wrappers\r
-                               var nodes = doc.getElementsByTagName(wrapper);\r
-                               for (i=nodes.length-1; i>=0; i--) {\r
-                                       var elm = nodes[i], isEmpty = true;\r
-\r
-                                       // Check if it has any attribs\r
-                                       var tmp = doc.createElement("body");\r
-                                       tmp.appendChild(elm.cloneNode(false));\r
-\r
-                                       // Is empty span, remove it\r
-                                       tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), '');\r
-                                       //tinyMCE.debug(tmp.innerHTML);\r
-                                       if (new RegExp('<span>', 'gi').test(tmp.innerHTML)) {\r
-                                               for (x=0; x<elm.childNodes.length; x++) {\r
-                                                       if (elm.parentNode != null)\r
-                                                               elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true), elm);\r
-                                               }\r
-\r
-                                               elm.parentNode.removeChild(elm);\r
-                                       }\r
-                               }\r
-\r
-                               // Re add the visual aids\r
-                               if (scmd == "removeformat")\r
-                                       tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
-\r
-                               tinyMCE.triggerNodeChange();\r
-\r
-                               break;\r
-\r
-                       case "FontName":\r
-                               if (value == null) {\r
-                                       var s = this.getSel();\r
-\r
-                                       // Find font and select it\r
-                                       if (tinyMCE.isGecko && s.isCollapsed) {\r
-                                               var f = tinyMCE.getParentElement(this.getFocusElement(), "font");\r
-\r
-                                               if (f != null)\r
-                                                       this.selection.selectNode(f, false);\r
-                                       }\r
-\r
-                                       // Remove format\r
-                                       this.getDoc().execCommand("RemoveFormat", false, null);\r
-\r
-                                       // Collapse range if font was found\r
-                                       if (f != null && tinyMCE.isGecko) {\r
-                                               var r = this.getRng().cloneRange();\r
-                                               r.collapse(true);\r
-                                               s.removeAllRanges();\r
-                                               s.addRange(r);\r
-                                       }\r
-                               } else\r
-                                       this.getDoc().execCommand('FontName', false, value);\r
-\r
-                               if (tinyMCE.isGecko)\r
-                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
-\r
-                               return;\r
-\r
-                       case "FontSize":\r
-                               this.getDoc().execCommand('FontSize', false, value);\r
-\r
-                               if (tinyMCE.isGecko)\r
-                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
-\r
-                               return;\r
-\r
-                       case "forecolor":\r
-                               value = value == null ? this.foreColor : value;\r
-                               value = tinyMCE.trim(value);\r
-                               value = value.charAt(0) != '#' ? (isNaN('0x' + value) ? value : '#' + value) : value;\r
-\r
-                               this.foreColor = value;\r
-                               this.getDoc().execCommand('forecolor', false, value);\r
-                               break;\r
-\r
-                       case "HiliteColor":\r
-                               value = value == null ? this.backColor : value;\r
-                               value = tinyMCE.trim(value);\r
-                               value = value.charAt(0) != '#' ? (isNaN('0x' + value) ? value : '#' + value) : value;\r
-                               this.backColor = value;\r
-\r
-                               if (tinyMCE.isGecko) {\r
-                                       this._setUseCSS(true);\r
-                                       this.getDoc().execCommand('hilitecolor', false, value);\r
-                                       this._setUseCSS(false);\r
-                               } else\r
-                                       this.getDoc().execCommand('BackColor', false, value);\r
-                               break;\r
-\r
-                       case "Cut":\r
-                       case "Copy":\r
-                       case "Paste":\r
-                               var cmdFailed = false;\r
-\r
-                               // Try executing command\r
-                               eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');\r
-\r
-                               if (tinyMCE.isOpera && cmdFailed)\r
-                                       alert('Currently not supported by your browser, use keyboard shortcuts instead.');\r
-\r
-                               // Alert error in gecko if command failed\r
-                               if (tinyMCE.isGecko && cmdFailed) {\r
-                                       // Confirm more info\r
-                                       if (confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_clipboard_msg'))))\r
-                                               window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal');\r
-\r
-                                       return;\r
-                               } else\r
-                                       tinyMCE.triggerNodeChange();\r
-                       break;\r
-\r
-                       case "mceSetContent":\r
-                               if (!value)\r
-                                       value = "";\r
-\r
-                               // Call custom cleanup code\r
-                               value = tinyMCE.storeAwayURLs(value);\r
-                               value = tinyMCE._customCleanup(this, "insert_to_editor", value);\r
-\r
-                               if (this.getBody().nodeName == 'BODY')\r
-                                       tinyMCE._setHTML(doc, value);\r
-                               else\r
-                                       this.getBody().innerHTML = value;\r
-\r
-                               tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, doc, this.settings, this.getBody(), false, false, false, true));\r
-                               tinyMCE.convertAllRelativeURLs(this.getBody());\r
-\r
-                               // Cleanup any mess left from storyAwayURLs\r
-                               tinyMCE._removeInternal(this.getBody());\r
-\r
-                               // When editing always use fonts internaly\r
-                               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
-                                       tinyMCE.convertSpansToFonts(doc);\r
-\r
-                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
-                               tinyMCE._setEventsEnabled(this.getBody(), false);\r
-                               this._addBogusBR();\r
-\r
-                               return true;\r
-\r
-                       case "mceCleanup":\r
-                               var b = this.selection.getBookmark();\r
-                               tinyMCE._setHTML(this.contentDocument, this.getBody().innerHTML);\r
-                               tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, this.contentDocument, this.settings, this.getBody(), this.visualAid));\r
-                               tinyMCE.convertAllRelativeURLs(doc.body);\r
-\r
-                               // When editing always use fonts internaly\r
-                               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
-                                       tinyMCE.convertSpansToFonts(doc);\r
-\r
-                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
-                               tinyMCE._setEventsEnabled(this.getBody(), false);\r
-                               this._addBogusBR();\r
-                               this.repaint();\r
-                               this.selection.moveToBookmark(b);\r
-                               tinyMCE.triggerNodeChange();\r
-                       break;\r
-\r
-                       case "mceReplaceContent":\r
-                               // Force empty string\r
-                               if (!value)\r
-                                       value = '';\r
-\r
-                               this.getWin().focus();\r
-\r
-                               var selectedText = "";\r
-\r
-                               if (tinyMCE.isIE) {\r
-                                       var rng = doc.selection.createRange();\r
-                                       selectedText = rng.text;\r
-                               } else\r
-                                       selectedText = this.getSel().toString();\r
-\r
-                               if (selectedText.length > 0) {\r
-                                       value = tinyMCE.replaceVar(value, "selection", selectedText);\r
-                                       tinyMCE.execCommand('mceInsertContent', false, value);\r
-                               }\r
-\r
-                               this._addBogusBR();\r
-                               tinyMCE.triggerNodeChange();\r
-                       break;\r
-\r
-                       case "mceSetAttribute":\r
-                               if (typeof(value) == 'object') {\r
-                                       var targetElms = (typeof(value.targets) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value.targets;\r
-                                       var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms);\r
-\r
-                                       if (targetNode) {\r
-                                               targetNode.setAttribute(value.name, value.value);\r
-                                               tinyMCE.triggerNodeChange();\r
-                                       }\r
-                               }\r
-                       break;\r
-\r
-                       case "mceSetCSSClass":\r
-                               this.execCommand("mceSetStyleInfo", false, {command : "setattrib", name : "class", value : value});\r
-                       break;\r
-\r
-                       case "mceInsertRawHTML":\r
-                               var key = 'tiny_mce_marker';\r
-\r
-                               this.execCommand('mceBeginUndoLevel');\r
-\r
-                               // Insert marker key\r
-                               this.execCommand('mceInsertContent', false, key);\r
-\r
-                               // Store away scroll pos\r
-                               var scrollX = this.getBody().scrollLeft + this.getDoc().documentElement.scrollLeft;\r
-                               var scrollY = this.getBody().scrollTop + this.getDoc().documentElement.scrollTop;\r
-\r
-                               // Find marker and replace with RAW HTML\r
-                               var html = this.getBody().innerHTML;\r
-                               if ((pos = html.indexOf(key)) != -1)\r
-                                       tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length));\r
-\r
-                               // Restore scoll pos\r
-                               this.contentWindow.scrollTo(scrollX, scrollY);\r
-\r
-                               this.execCommand('mceEndUndoLevel');\r
-\r
-                               break;\r
-\r
-                       case "mceInsertContent":\r
-                               // Force empty string\r
-                               if (!value)\r
-                                       value = '';\r
-\r
-                               var insertHTMLFailed = false;\r
-\r
-                               // Removed since it produced problems in IE\r
-                               // this.getWin().focus();\r
-\r
-                               if (tinyMCE.isGecko || tinyMCE.isOpera) {\r
-                                       try {\r
-                                               // Is plain text or HTML, &amp;, &nbsp; etc will be encoded wrong in FF\r
-                                               if (value.indexOf('<') == -1 && !value.match(/(&#38;|&#160;|&#60;|&#62;)/g)) {\r
-                                                       var r = this.getRng();\r
-                                                       var n = this.getDoc().createTextNode(tinyMCE.entityDecode(value));\r
-                                                       var s = this.getSel();\r
-                                                       var r2 = r.cloneRange();\r
-\r
-                                                       // Insert text at cursor position\r
-                                                       s.removeAllRanges();\r
-                                                       r.deleteContents();\r
-                                                       r.insertNode(n);\r
-\r
-                                                       // Move the cursor to the end of text\r
-                                                       r2.selectNode(n);\r
-                                                       r2.collapse(false);\r
-                                                       s.removeAllRanges();\r
-                                                       s.addRange(r2);\r
-                                               } else {\r
-                                                       value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value);\r
-                                                       this.getDoc().execCommand('inserthtml', false, value);\r
-                                                       tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);\r
-                                               }\r
-                                       } catch (ex) {\r
-                                               insertHTMLFailed = true;\r
-                                       }\r
-\r
-                                       if (!insertHTMLFailed) {\r
-                                               tinyMCE.triggerNodeChange();\r
-                                               return;\r
-                                       }\r
-                               }\r
-\r
-                               if (!tinyMCE.isIE) {\r
-                                       var isHTML = value.indexOf('<') != -1;\r
-                                       var sel = this.getSel();\r
-                                       var rng = this.getRng();\r
-\r
-                                       if (isHTML) {\r
-                                               if (tinyMCE.isSafari) {\r
-                                                       var tmpRng = this.getDoc().createRange();\r
-\r
-                                                       tmpRng.setStart(this.getBody(), 0);\r
-                                                       tmpRng.setEnd(this.getBody(), 0);\r
-\r
-                                                       value = tmpRng.createContextualFragment(value);\r
-                                               } else\r
-                                                       value = rng.createContextualFragment(value);\r
-                                       } else {\r
-                                               // Setup text node\r
-                                               value = doc.createTextNode(tinyMCE.entityDecode(value));\r
-                                       }\r
-\r
-                                       // Insert plain text in Safari\r
-                                       if (tinyMCE.isSafari && !isHTML) {\r
-                                               this.execCommand('InsertText', false, value.nodeValue);\r
-                                               tinyMCE.triggerNodeChange();\r
-                                               return true;\r
-                                       } else if (tinyMCE.isSafari && isHTML) {\r
-                                               rng.deleteContents();\r
-                                               rng.insertNode(value);\r
-                                               tinyMCE.triggerNodeChange();\r
-                                               return true;\r
-                                       }\r
-\r
-                                       rng.deleteContents();\r
-\r
-                                       // If target node is text do special treatment, (Mozilla 1.3 fix)\r
-                                       if (rng.startContainer.nodeType == 3) {\r
-                                               var node = rng.startContainer.splitText(rng.startOffset);\r
-                                               node.parentNode.insertBefore(value, node); \r
-                                       } else\r
-                                               rng.insertNode(value);\r
-\r
-                                       if (!isHTML) {\r
-                                               // Removes weird selection trails\r
-                                               sel.selectAllChildren(doc.body);\r
-                                               sel.removeAllRanges();\r
-\r
-                                               // Move cursor to end of content\r
-                                               var rng = doc.createRange();\r
-\r
-                                               rng.selectNode(value);\r
-                                               rng.collapse(false);\r
-\r
-                                               sel.addRange(rng);\r
-                                       } else\r
-                                               rng.collapse(false);\r
-\r
-                                       tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);\r
-                               } else {\r
-                                       var rng = doc.selection.createRange(), tmpRng = null;\r
-                                       var c = value.indexOf('<!--') != -1;\r
-\r
-                                       // Fix comment bug, add tag before comments\r
-                                       if (c)\r
-                                               value = tinyMCE.uniqueTag + value;\r
-\r
-                                       //      tmpRng = rng.duplicate(); // Store away range (Fixes Undo bookmark bug in IE)\r
-\r
-                                       if (rng.item)\r
-                                               rng.item(0).outerHTML = value;\r
-                                       else\r
-                                               rng.pasteHTML(value);\r
-\r
-                                       //if (tmpRng)\r
-                                       //      tmpRng.select(); // Restore range  (Fixes Undo bookmark bug in IE)\r
-\r
-                                       // Remove unique tag\r
-                                       if (c) {\r
-                                               var e = this.getDoc().getElementById('mceTMPElement');\r
-                                               e.parentNode.removeChild(e);\r
-                                       }\r
-                               }\r
-\r
-                               tinyMCE.execCommand("mceAddUndoLevel");\r
-                               tinyMCE.triggerNodeChange();\r
-                       break;\r
-\r
-                       case "mceStartTyping":\r
-                               if (tinyMCE.settings.custom_undo_redo && this.undoRedo.typingUndoIndex == -1) {\r
-                                       this.undoRedo.typingUndoIndex = this.undoRedo.undoIndex;\r
-                                       tinyMCE.typingUndoIndex = tinyMCE.undoIndex;\r
-                                       this.execCommand('mceAddUndoLevel');\r
-                               }\r
-                               break;\r
-\r
-                       case "mceEndTyping":\r
-                               if (tinyMCE.settings.custom_undo_redo && this.undoRedo.typingUndoIndex != -1) {\r
-                                       this.execCommand('mceAddUndoLevel');\r
-                                       this.undoRedo.typingUndoIndex = -1;\r
-                               }\r
-\r
-                               tinyMCE.typingUndoIndex = -1;\r
-                               break;\r
-\r
-                       case "mceBeginUndoLevel":\r
-                               this.undoRedoLevel = false;\r
-                               break;\r
-\r
-                       case "mceEndUndoLevel":\r
-                               this.undoRedoLevel = true;\r
-                               this.execCommand('mceAddUndoLevel');\r
-                               break;\r
-\r
-                       case "mceAddUndoLevel":\r
-                               if (tinyMCE.settings.custom_undo_redo && this.undoRedoLevel) {\r
-                                       if (this.undoRedo.add())\r
-                                               tinyMCE.triggerNodeChange(false);\r
-                               }\r
-                               break;\r
-\r
-                       case "Undo":\r
-                               if (tinyMCE.settings.custom_undo_redo) {\r
-                                       tinyMCE.execCommand("mceEndTyping");\r
-                                       this.undoRedo.undo();\r
-                                       tinyMCE.triggerNodeChange();\r
-                               } else\r
-                                       this.getDoc().execCommand(command, user_interface, value);\r
-                               break;\r
-\r
-                       case "Redo":\r
-                               if (tinyMCE.settings.custom_undo_redo) {\r
-                                       tinyMCE.execCommand("mceEndTyping");\r
-                                       this.undoRedo.redo();\r
-                                       tinyMCE.triggerNodeChange();\r
-                               } else\r
-                                       this.getDoc().execCommand(command, user_interface, value);\r
-                               break;\r
-\r
-                       case "mceToggleVisualAid":\r
-                               this.visualAid = !this.visualAid;\r
-                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
-                               tinyMCE.triggerNodeChange();\r
-                               break;\r
-\r
-                       case "Indent":\r
-                               this.getDoc().execCommand(command, user_interface, value);\r
-                               tinyMCE.triggerNodeChange();\r
-\r
-                               if (tinyMCE.isIE) {\r
-                                       var n = tinyMCE.getParentElement(this.getFocusElement(), "blockquote");\r
-                                       do {\r
-                                               if (n && n.nodeName == "BLOCKQUOTE") {\r
-                                                       n.removeAttribute("dir");\r
-                                                       n.removeAttribute("style");\r
-                                               }\r
-                                       } while (n != null && (n = n.parentNode) != null);\r
-                               }\r
-                               break;\r
-\r
-                       case "RemoveFormat":\r
-                       case "removeformat":\r
-                               var text = this.selection.getSelectedText();\r
-\r
-                               if (tinyMCE.isOpera) {\r
-                                       this.getDoc().execCommand("RemoveFormat", false, null);\r
-                                       return;\r
-                               }\r
-\r
-                               if (tinyMCE.isIE) {\r
-                                       try {\r
-                                               var rng = doc.selection.createRange();\r
-                                               rng.execCommand("RemoveFormat", false, null);\r
-                                       } catch (e) {\r
-                                               // Do nothing\r
-                                       }\r
-\r
-                                       this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});\r
-                               } else {\r
-                                       this.getDoc().execCommand(command, user_interface, value);\r
-\r
-                                       this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});\r
-                               }\r
-\r
-                               // Remove class\r
-                               if (text.length == 0)\r
-                                       this.execCommand("mceSetCSSClass", false, "");\r
-\r
-                               tinyMCE.triggerNodeChange();\r
-                               break;\r
-\r
-                       default:\r
-                               this.getDoc().execCommand(command, user_interface, value);\r
-\r
-                               if (tinyMCE.isGecko)\r
-                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
-                               else\r
-                                       tinyMCE.triggerNodeChange();\r
-               }\r
-\r
-               // Add undo level after modification\r
-               if (command != "mceAddUndoLevel" && command != "Undo" && command != "Redo" && command != "mceStartTyping" && command != "mceEndTyping")\r
-                       tinyMCE.execCommand("mceAddUndoLevel");\r
-       },\r
-\r
-       queryCommandValue : function(c) {\r
-               try {\r
-                       return this.getDoc().queryCommandValue(c);\r
-               } catch (e) {\r
-                       return null;\r
-               }\r
-       },\r
-\r
-       queryCommandState : function(c) {\r
-               return this.getDoc().queryCommandState(c);\r
-       },\r
-\r
-       _addBogusBR : function() {\r
-               var b = this.getBody();\r
-\r
-               if (tinyMCE.isGecko && !b.hasChildNodes())\r
-                       b.innerHTML = '<br _moz_editor_bogus_node="TRUE" />';\r
-       },\r
-\r
-       _onAdd : function(replace_element, form_element_name, target_document) {\r
-               var hc, th, tos, editorTemplate, targetDoc, deltaWidth, deltaHeight, html, rng, fragment;\r
-               var dynamicIFrame, tElm, doc, parentElm;\r
-\r
-               th = this.settings.theme;\r
-               tos = tinyMCE.themes[th];\r
-\r
-               targetDoc = target_document ? target_document : document;\r
-\r
-               this.targetDoc = targetDoc;\r
-\r
-               tinyMCE.themeURL = tinyMCE.baseURL + "/themes/" + this.settings.theme;\r
-               this.settings.themeurl = tinyMCE.themeURL;\r
-\r
-               if (!replace_element) {\r
-                       alert("Error: Could not find the target element.");\r
-                       return false;\r
-               }\r
-\r
-               if (tos.getEditorTemplate)\r
-                       editorTemplate = tos.getEditorTemplate(this.settings, this.editorId);\r
-\r
-               deltaWidth = editorTemplate.delta_width ? editorTemplate.delta_width : 0;\r
-               deltaHeight = editorTemplate.delta_height ? editorTemplate.delta_height : 0;\r
-               html = '<span id="' + this.editorId + '_parent" class="mceEditorContainer">' + editorTemplate.html;\r
-\r
-               html = tinyMCE.replaceVar(html, "editor_id", this.editorId);\r
-\r
-               if (!this.settings.default_document)\r
-                       this.settings.default_document = tinyMCE.baseURL + "/blank.htm";\r
-\r
-               this.settings.old_width = this.settings.width;\r
-               this.settings.old_height = this.settings.height;\r
-\r
-               // Set default width, height\r
-               if (this.settings.width == -1)\r
-                       this.settings.width = replace_element.offsetWidth;\r
-\r
-               if (this.settings.height == -1)\r
-                       this.settings.height = replace_element.offsetHeight;\r
-\r
-               // Try the style width\r
-               if (this.settings.width == 0)\r
-                       this.settings.width = replace_element.style.width;\r
-\r
-               // Try the style height\r
-               if (this.settings.height == 0)\r
-                       this.settings.height = replace_element.style.height; \r
-\r
-               // If no width/height then default to 320x240, better than nothing\r
-               if (this.settings.width == 0)\r
-                       this.settings.width = 320;\r
-\r
-               if (this.settings.height == 0)\r
-                       this.settings.height = 240;\r
-\r
-               this.settings.area_width = parseInt(this.settings.width);\r
-               this.settings.area_height = parseInt(this.settings.height);\r
-               this.settings.area_width += deltaWidth;\r
-               this.settings.area_height += deltaHeight;\r
-               this.settings.width_style = "" + this.settings.width;\r
-               this.settings.height_style = "" + this.settings.height;\r
-\r
-               // Special % handling\r
-               if (("" + this.settings.width).indexOf('%') != -1)\r
-                       this.settings.area_width = "100%";\r
-               else\r
-                       this.settings.width_style += 'px';\r
-\r
-               if (("" + this.settings.height).indexOf('%') != -1)\r
-                       this.settings.area_height = "100%";\r
-               else\r
-                       this.settings.height_style += 'px';\r
-\r
-               if (("" + replace_element.style.width).indexOf('%') != -1) {\r
-                       this.settings.width = replace_element.style.width;\r
-                       this.settings.area_width = "100%";\r
-                       this.settings.width_style = "100%";\r
-               }\r
-\r
-               if (("" + replace_element.style.height).indexOf('%') != -1) {\r
-                       this.settings.height = replace_element.style.height;\r
-                       this.settings.area_height = "100%";\r
-                       this.settings.height_style = "100%";\r
-               }\r
-\r
-               html = tinyMCE.applyTemplate(html);\r
-\r
-               this.settings.width = this.settings.old_width;\r
-               this.settings.height = this.settings.old_height;\r
-\r
-               this.visualAid = this.settings.visual;\r
-               this.formTargetElementId = form_element_name;\r
-\r
-               // Get replace_element contents\r
-               if (replace_element.nodeName == "TEXTAREA" || replace_element.nodeName == "INPUT")\r
-                       this.startContent = replace_element.value;\r
-               else\r
-                       this.startContent = replace_element.innerHTML;\r
-\r
-               // If not text area or input\r
-               if (replace_element.nodeName != "TEXTAREA" && replace_element.nodeName != "INPUT") {\r
-                       this.oldTargetElement = replace_element;\r
-\r
-                       // Debug mode\r
-                       hc = '<input type="hidden" id="' + form_element_name + '" name="' + form_element_name + '" />';\r
-                       this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');\r
-                       this.oldTargetElement.style.display = "none";\r
-\r
-                       html += '</span>';\r
-\r
-                       if (tinyMCE.isGecko)\r
-                               html = hc + html;\r
-                       else\r
-                               html += hc;\r
-\r
-                       // Output HTML and set editable\r
-                       if (tinyMCE.isGecko) {\r
-                               rng = replace_element.ownerDocument.createRange();\r
-                               rng.setStartBefore(replace_element);\r
-\r
-                               fragment = rng.createContextualFragment(html);\r
-                               tinyMCE.insertAfter(fragment, replace_element);\r
-                       } else\r
-                               replace_element.insertAdjacentHTML("beforeBegin", html);\r
-               } else {\r
-                       html += '</span>';\r
-\r
-                       // Just hide the textarea element\r
-                       this.oldTargetElement = replace_element;\r
-\r
-                       this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');\r
-                       this.oldTargetElement.style.display = "none";\r
-\r
-                       // Output HTML and set editable\r
-                       if (tinyMCE.isGecko) {\r
-                               rng = replace_element.ownerDocument.createRange();\r
-                               rng.setStartBefore(replace_element);\r
-\r
-                               fragment = rng.createContextualFragment(html);\r
-                               tinyMCE.insertAfter(fragment, replace_element);\r
-                       } else\r
-                               replace_element.insertAdjacentHTML("beforeBegin", html);\r
-               }\r
-\r
-               // Setup iframe\r
-               dynamicIFrame = false;\r
-               tElm = targetDoc.getElementById(this.editorId);\r
-\r
-               if (!tinyMCE.isIE) {\r
-                       // Node case is preserved in XML strict mode\r
-                       if (tElm && (tElm.nodeName == "SPAN" || tElm.nodeName == "span")) {\r
-                               tElm = tinyMCE._createIFrame(tElm, targetDoc);\r
-                               dynamicIFrame = true;\r
-                       }\r
-\r
-                       this.targetElement = tElm;\r
-                       this.iframeElement = tElm;\r
-                       this.contentDocument = tElm.contentDocument;\r
-                       this.contentWindow = tElm.contentWindow;\r
-\r
-                       //this.getDoc().designMode = "on";\r
-               } else {\r
-                       if (tElm && tElm.nodeName == "SPAN")\r
-                               tElm = tinyMCE._createIFrame(tElm, targetDoc, targetDoc.parentWindow);\r
-                       else\r
-                               tElm = targetDoc.frames[this.editorId];\r
-\r
-                       this.targetElement = tElm;\r
-                       this.iframeElement = targetDoc.getElementById(this.editorId);\r
-\r
-                       if (tinyMCE.isOpera) {\r
-                               this.contentDocument = this.iframeElement.contentDocument;\r
-                               this.contentWindow = this.iframeElement.contentWindow;\r
-                               dynamicIFrame = true;\r
-                       } else {\r
-                               this.contentDocument = tElm.window.document;\r
-                               this.contentWindow = tElm.window;\r
-                       }\r
-\r
-                       this.getDoc().designMode = "on";\r
-               }\r
-\r
-               // Setup base HTML\r
-               doc = this.contentDocument;\r
-               if (dynamicIFrame) {\r
-                       html = tinyMCE.getParam('doctype') + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + tinyMCE.settings.base_href + '" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';\r
-\r
-                       try {\r
-                               if (!this.isHidden())\r
-                                       this.getDoc().designMode = "on";\r
-\r
-                               doc.open();\r
-                               doc.write(html);\r
-                               doc.close();\r
-                       } catch (e) {\r
-                               // Failed Mozilla 1.3\r
-                               this.getDoc().location.href = tinyMCE.baseURL + "/blank.htm";\r
-                       }\r
-               }\r
-\r
-               // This timeout is needed in MSIE 5.5 for some odd reason\r
-               // it seems that the document.frames isn't initialized yet?\r
-               if (tinyMCE.isIE)\r
-                       window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\"" + this.editorId + "\"]);", 1);\r
-\r
-               // Setup element references\r
-               parentElm = this.targetDoc.getElementById(this.editorId + '_parent');\r
-               this.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;\r
-\r
-               tinyMCE.setupContent(this.editorId, true);\r
-\r
-               return true;\r
-       },\r
-\r
-       setBaseHREF : function(u) {\r
-               var h, b, d, nl;\r
-\r
-               d = this.getDoc();\r
-               nl = d.getElementsByTagName("base");\r
-               b = nl.length > 0 ? nl[0] : null;\r
-\r
-               if (!b) {\r
-                       nl = d.getElementsByTagName("head");\r
-                       h = nl.length > 0 ? nl[0] : null;\r
-\r
-                       b = d.createElement("base");\r
-                       b.setAttribute('href', u);\r
-                       h.appendChild(b);\r
-               } else {\r
-                       if (u == '' || u == null)\r
-                               b.parentNode.removeChild(b);\r
-                       else\r
-                               b.setAttribute('href', u);\r
-               }\r
-       },\r
-\r
-       getHTML : function(r) {\r
-               var h, d = this.getDoc(), b = this.getBody();\r
-\r
-               if (r)\r
-                       return b.innerHTML;\r
-\r
-               h = tinyMCE._cleanupHTML(this, d, this.settings, b, false, true, false, true);\r
-\r
-               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
-                       tinyMCE.convertSpansToFonts(d);\r
-\r
-               return h;\r
-       },\r
-\r
-       setHTML : function(h) {\r
-               this.execCommand('mceSetContent', false, h);\r
-               this.repaint();\r
-       },\r
-\r
-       getFocusElement : function() {\r
-               return this.selection.getFocusElement();\r
-       },\r
-\r
-       getSel : function() {\r
-               return this.selection.getSel();\r
-       },\r
-\r
-       getRng : function() {\r
-               return this.selection.getRng();\r
-       },\r
-\r
-       triggerSave : function(skip_cleanup, skip_callback) {\r
-               var e, nl = [], i, s, content, htm;\r
-\r
-               if (!this.enabled)\r
-                       return;\r
-\r
-               this.switchSettings();\r
-               s = tinyMCE.settings;\r
-\r
-               // Force hidden tabs visible while serializing\r
-               if (tinyMCE.isRealIE) {\r
-                       e = this.iframeElement;\r
-\r
-                       do {\r
-                               if (e.style && e.style.display == 'none') {\r
-                                       e.style.display = 'block';\r
-                                       nl[nl.length] = {elm : e, type : 'style'};\r
-                               }\r
-\r
-                               if (e.style && s.hidden_tab_class.length > 0 && e.className.indexOf(s.hidden_tab_class) != -1) {\r
-                                       e.className = s.display_tab_class;\r
-                                       nl[nl.length] = {elm : e, type : 'class'};\r
-                               }\r
-                       } while ((e = e.parentNode) != null)\r
-               }\r
-\r
-               tinyMCE.settings.preformatted = false;\r
-\r
-               // Default to false\r
-               if (typeof(skip_cleanup) == "undefined")\r
-                       skip_cleanup = false;\r
-\r
-               // Default to false\r
-               if (typeof(skip_callback) == "undefined")\r
-                       skip_callback = false;\r
-\r
-               tinyMCE._setHTML(this.getDoc(), this.getBody().innerHTML);\r
-\r
-               // Remove visual aids when cleanup is disabled\r
-               if (this.settings.cleanup == false) {\r
-                       tinyMCE.handleVisualAid(this.getBody(), true, false, this);\r
-                       tinyMCE._setEventsEnabled(this.getBody(), true);\r
-               }\r
-\r
-               tinyMCE._customCleanup(this, "submit_content_dom", this.contentWindow.document.body);\r
-               htm = skip_cleanup ? this.getBody().innerHTML : tinyMCE._cleanupHTML(this, this.getDoc(), this.settings, this.getBody(), tinyMCE.visualAid, true, true);\r
-               htm = tinyMCE._customCleanup(this, "submit_content", htm);\r
-\r
-               if (!skip_callback && tinyMCE.settings.save_callback !== '')\r
-                       content = tinyMCE.resolveDots(tinyMCE.settings.save_callback, window)(this.formTargetElementId,htm,this.getBody());\r
-\r
-               // Use callback content if available\r
-               if ((typeof(content) != "undefined") && content != null)\r
-                       htm = content;\r
-\r
-               // Replace some weird entities (Bug: #1056343)\r
-               htm = tinyMCE.regexpReplace(htm, "&#40;", "(", "gi");\r
-               htm = tinyMCE.regexpReplace(htm, "&#41;", ")", "gi");\r
-               htm = tinyMCE.regexpReplace(htm, "&#59;", ";", "gi");\r
-               htm = tinyMCE.regexpReplace(htm, "&#34;", "&quot;", "gi");\r
-               htm = tinyMCE.regexpReplace(htm, "&#94;", "^", "gi");\r
-\r
-               if (this.formElement)\r
-                       this.formElement.value = htm;\r
-\r
-               if (tinyMCE.isSafari && this.formElement)\r
-                       this.formElement.innerText = htm;\r
-\r
-               // Hide them again (tabs in MSIE)\r
-               for (i=0; i<nl.length; i++) {\r
-                       if (nl[i].type == 'style')\r
-                               nl[i].elm.style.display = 'none';\r
-                       else\r
-                               nl[i].elm.className = s.hidden_tab_class;\r
-               }\r
-       }\r
-\r
-       };\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_Cleanup.class.js */\r
-\r
-tinyMCE.add(TinyMCE_Engine, {\r
-       cleanupHTMLCode : function(s) {\r
-               s = s.replace(new RegExp('<p \\/>', 'gi'), '<p>&nbsp;</p>');\r
-               s = s.replace(new RegExp('<p>\\s*<\\/p>', 'gi'), '<p>&nbsp;</p>');\r
-\r
-               // Fix close BR elements\r
-               s = s.replace(new RegExp('<br>\\s*<\\/br>', 'gi'), '<br />');\r
-\r
-               // Open closed tags like <b/> to <b></b>\r
-               s = s.replace(new RegExp('<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>', 'gi'), '<$1$2$3></$1$2>');\r
-\r
-               // Remove trailing space <b > to <b>\r
-               s = s.replace(new RegExp('\\s+></', 'gi'), '></');\r
-\r
-               // Close tags <img></img> to <img/>\r
-               s = s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>', 'gi'), '<$1$2 />');\r
-\r
-               // Weird MSIE bug, <p><hr /></p> breaks runtime?\r
-               if (tinyMCE.isIE)\r
-                       s = s.replace(new RegExp('<p><hr \\/><\\/p>', 'gi'), "<hr>");\r
-\r
-               // Weird tags will make IE error #bug: 1538495\r
-               if (tinyMCE.isIE)\r
-                       s = s.replace(/<!(\s*)\/>/g, '');\r
-\r
-               // Convert relative anchors to absolute URLs ex: #something to file.htm#something\r
-               // Removed: Since local document anchors should never be forced absolute example edit.php?id=something\r
-               //if (tinyMCE.getParam('convert_urls'))\r
-               //      s = s.replace(new RegExp('(href=\"{0,1})(\\s*#)', 'gi'), '$1' + tinyMCE.settings.document_base_url + "#");\r
-\r
-               return s;\r
-       },\r
-\r
-       parseStyle : function(str) {\r
-               var ar = [], st, i, re, pa;\r
-\r
-               if (str == null)\r
-                       return ar;\r
-\r
-               st = str.split(';');\r
-\r
-               tinyMCE.clearArray(ar);\r
-\r
-               for (i=0; i<st.length; i++) {\r
-                       if (st[i] == '')\r
-                               continue;\r
-\r
-                       re = new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');\r
-                       pa = st[i].replace(re, '$1||$2').split('||');\r
-       //tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));\r
-                       if (pa.length == 2)\r
-                               ar[pa[0].toLowerCase()] = pa[1];\r
-               }\r
-\r
-               return ar;\r
-       },\r
-\r
-       compressStyle : function(ar, pr, sf, res) {\r
-               var box = [], i, a;\r
-\r
-               box[0] = ar[pr + '-top' + sf];\r
-               box[1] = ar[pr + '-left' + sf];\r
-               box[2] = ar[pr + '-right' + sf];\r
-               box[3] = ar[pr + '-bottom' + sf];\r
-\r
-               for (i=0; i<box.length; i++) {\r
-                       if (box[i] == null)\r
-                               return;\r
-\r
-                       for (a=0; a<box.length; a++) {\r
-                               if (box[a] != box[i])\r
-                                       return;\r
-                       }\r
-               }\r
-\r
-               // They are all the same\r
-               ar[res] = box[0];\r
-               ar[pr + '-top' + sf] = null;\r
-               ar[pr + '-left' + sf] = null;\r
-               ar[pr + '-right' + sf] = null;\r
-               ar[pr + '-bottom' + sf] = null;\r
-       },\r
-\r
-       serializeStyle : function(ar) {\r
-               var str = "", key, val, m;\r
-\r
-               // Compress box\r
-               tinyMCE.compressStyle(ar, "border", "", "border");\r
-               tinyMCE.compressStyle(ar, "border", "-width", "border-width");\r
-               tinyMCE.compressStyle(ar, "border", "-color", "border-color");\r
-               tinyMCE.compressStyle(ar, "border", "-style", "border-style");\r
-               tinyMCE.compressStyle(ar, "padding", "", "padding");\r
-               tinyMCE.compressStyle(ar, "margin", "", "margin");\r
-\r
-               for (key in ar) {\r
-                       val = ar[key];\r
-\r
-                       if (typeof(val) == 'function')\r
-                               continue;\r
-\r
-                       if (key.indexOf('mso-') == 0)\r
-                               continue;\r
-\r
-                       if (val != null && val !== '') {\r
-                               val = '' + val; // Force string\r
-\r
-                               // Fix style URL\r
-                               val = val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)", 'gi'), "url('$1')");\r
-\r
-                               // Convert URL\r
-                               if (val.indexOf('url(') != -1 && tinyMCE.getParam('convert_urls')) {\r
-                                       m = new RegExp("url\\('(.*?)'\\)").exec(val);\r
-\r
-                                       if (m.length > 1)\r
-                                               val = "url('" + eval(tinyMCE.getParam('urlconverter_callback') + "(m[1], null, true);") + "')";\r
-                               }\r
-\r
-                               // Force HEX colors\r
-                               if (tinyMCE.getParam("force_hex_style_colors"))\r
-                                       val = tinyMCE.convertRGBToHex(val, true);\r
-\r
-                               val = val.replace(/\"/g, '\'');\r
-\r
-                               if (val != "url('')")\r
-                                       str += key.toLowerCase() + ": " + val + "; ";\r
-                       }\r
-               }\r
-\r
-               if (new RegExp('; $').test(str))\r
-                       str = str.substring(0, str.length - 2);\r
-\r
-               return str;\r
-       },\r
-\r
-       convertRGBToHex : function(s, k) {\r
-               var re, rgb;\r
-\r
-               if (s.toLowerCase().indexOf('rgb') != -1) {\r
-                       re = new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)", "gi");\r
-                       rgb = s.replace(re, "$1,$2,$3,$4,$5").split(',');\r
-\r
-                       if (rgb.length == 5) {\r
-                               r = parseInt(rgb[1]).toString(16);\r
-                               g = parseInt(rgb[2]).toString(16);\r
-                               b = parseInt(rgb[3]).toString(16);\r
-\r
-                               r = r.length == 1 ? '0' + r : r;\r
-                               g = g.length == 1 ? '0' + g : g;\r
-                               b = b.length == 1 ? '0' + b : b;\r
-\r
-                               s = "#" + r + g + b;\r
-\r
-                               if (k)\r
-                                       s = rgb[0] + s + rgb[4];\r
-                       }\r
-               }\r
-\r
-               return s;\r
-       },\r
-\r
-       convertHexToRGB : function(s) {\r
-               if (s.indexOf('#') != -1) {\r
-                       s = s.replace(new RegExp('[^0-9A-F]', 'gi'), '');\r
-                       return "rgb(" + parseInt(s.substring(0, 2), 16) + "," + parseInt(s.substring(2, 4), 16) + "," + parseInt(s.substring(4, 6), 16) + ")";\r
-               }\r
-\r
-               return s;\r
-       },\r
-\r
-       convertSpansToFonts : function(doc) {\r
-               var s, i, size, fSize, x, fFace, fColor, sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');\r
-\r
-               s = tinyMCE.selectElements(doc, 'span,font');\r
-               for (i=0; i<s.length; i++) {\r
-                       size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();\r
-                       fSize = 0;\r
-\r
-                       for (x=0; x<sizes.length; x++) {\r
-                               if (sizes[x] == size) {\r
-                                       fSize = x + 1;\r
-                                       break;\r
-                               }\r
-                       }\r
-\r
-                       if (fSize > 0) {\r
-                               tinyMCE.setAttrib(s[i], 'size', fSize);\r
-                               s[i].style.fontSize = '';\r
-                       }\r
-\r
-                       fFace = s[i].style.fontFamily;\r
-                       if (fFace != null && fFace !== '') {\r
-                               tinyMCE.setAttrib(s[i], 'face', fFace);\r
-                               s[i].style.fontFamily = '';\r
-                       }\r
-\r
-                       fColor = s[i].style.color;\r
-                       if (fColor != null && fColor !== '') {\r
-                               tinyMCE.setAttrib(s[i], 'color', tinyMCE.convertRGBToHex(fColor));\r
-                               s[i].style.color = '';\r
-                       }\r
-               }\r
-       },\r
-\r
-       convertFontsToSpans : function(doc) {\r
-               var fsClasses, s, i, fSize, fFace, fColor, sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');\r
-\r
-               fsClasses = tinyMCE.getParam('font_size_classes');\r
-               if (fsClasses !== '')\r
-                       fsClasses = fsClasses.replace(/\s+/, '').split(',');\r
-               else\r
-                       fsClasses = null;\r
-\r
-               s = tinyMCE.selectElements(doc, 'span,font');\r
-               for (i=0; i<s.length; i++) {\r
-                       fSize = tinyMCE.getAttrib(s[i], 'size');\r
-                       fFace = tinyMCE.getAttrib(s[i], 'face');\r
-                       fColor = tinyMCE.getAttrib(s[i], 'color');\r
-\r
-                       if (fSize !== '') {\r
-                               fSize = parseInt(fSize);\r
-\r
-                               if (fSize > 0 && fSize < 8) {\r
-                                       if (fsClasses != null)\r
-                                               tinyMCE.setAttrib(s[i], 'class', fsClasses[fSize-1]);\r
-                                       else\r
-                                               s[i].style.fontSize = sizes[fSize-1];\r
-                               }\r
-\r
-                               s[i].removeAttribute('size');\r
-                       }\r
-\r
-                       if (fFace !== '') {\r
-                               s[i].style.fontFamily = fFace;\r
-                               s[i].removeAttribute('face');\r
-                       }\r
-\r
-                       if (fColor !== '') {\r
-                               s[i].style.color = fColor;\r
-                               s[i].removeAttribute('color');\r
-                       }\r
-               }\r
-       },\r
-\r
-       cleanupAnchors : function(doc) {\r
-               var i, cn, x, an = doc.getElementsByTagName("a");\r
-\r
-               // Loops backwards due to bug #1467987\r
-               for (i=an.length-1; i>=0; i--) {\r
-                       if (tinyMCE.getAttrib(an[i], "name") !== '' && tinyMCE.getAttrib(an[i], "href") == '') {\r
-                               cn = an[i].childNodes;\r
-\r
-                               for (x=cn.length-1; x>=0; x--)\r
-                                       tinyMCE.insertAfter(cn[x], an[i]);\r
-                       }\r
-               }\r
-       },\r
-\r
-       getContent : function(editor_id) {\r
-               if (typeof(editor_id) != "undefined")\r
-                        tinyMCE.getInstanceById(editor_id).select();\r
-\r
-               if (tinyMCE.selectedInstance)\r
-                       return tinyMCE.selectedInstance.getHTML();\r
-\r
-               return null;\r
-       },\r
-\r
-       _fixListElements : function(d) {\r
-               var nl, x, a = ['ol', 'ul'], i, n, p, r = new RegExp('^(OL|UL)$'), np;\r
-\r
-               for (x=0; x<a.length; x++) {\r
-                       nl = d.getElementsByTagName(a[x]);\r
-\r
-                       for (i=0; i<nl.length; i++) {\r
-                               n = nl[i];\r
-                               p = n.parentNode;\r
-\r
-                               if (r.test(p.nodeName)) {\r
-                                       np = tinyMCE.prevNode(n, 'LI');\r
-\r
-                                       if (!np) {\r
-                                               np = d.createElement('li');\r
-                                               np.innerHTML = '&nbsp;';\r
-                                               np.appendChild(n);\r
-                                               p.insertBefore(np, p.firstChild);\r
-                                       } else\r
-                                               np.appendChild(n);\r
-                               }\r
-                       }\r
-               }\r
-       },\r
-\r
-       _fixTables : function(d) {\r
-               var nl, i, n, p, np, x, t;\r
-\r
-               nl = d.getElementsByTagName('table');\r
-               for (i=0; i<nl.length; i++) {\r
-                       n = nl[i];\r
-\r
-                       if ((p = tinyMCE.getParentElement(n, 'p,h1,h2,h3,h4,h5,h6')) != null) {\r
-                               np = p.cloneNode(false);\r
-                               np.removeAttribute('id');\r
-\r
-                               t = n;\r
-\r
-                               while ((n = n.nextSibling))\r
-                                       np.appendChild(n);\r
-\r
-                               tinyMCE.insertAfter(np, p);\r
-                               tinyMCE.insertAfter(t, p);\r
-                       }\r
-               }\r
-       },\r
-\r
-       _cleanupHTML : function(inst, doc, config, elm, visual, on_save, on_submit, inn) {\r
-               var h, d, t1, t2, t3, t4, t5, c, s, nb;\r
-\r
-               if (!tinyMCE.getParam('cleanup'))\r
-                       return elm.innerHTML;\r
-\r
-               on_save = typeof(on_save) == 'undefined' ? false : on_save;\r
-\r
-               c = inst.cleanup;\r
-               s = inst.settings;\r
-               d = c.settings.debug;\r
-\r
-               if (d)\r
-                       t1 = new Date().getTime();\r
-\r
-               inst._fixRootBlocks();\r
-\r
-               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
-                       tinyMCE.convertFontsToSpans(doc);\r
-\r
-               if (tinyMCE.getParam("fix_list_elements"))\r
-                       tinyMCE._fixListElements(doc);\r
-\r
-               if (tinyMCE.getParam("fix_table_elements"))\r
-                       tinyMCE._fixTables(doc);\r
-\r
-               // Call custom cleanup code\r
-               tinyMCE._customCleanup(inst, on_save ? "get_from_editor_dom" : "insert_to_editor_dom", doc.body);\r
-\r
-               if (d)\r
-                       t2 = new Date().getTime();\r
-\r
-               c.settings.on_save = on_save;\r
-\r
-               c.idCount = 0;\r
-               c.serializationId = new Date().getTime().toString(32); // Unique ID needed for the content duplication bug\r
-               c.serializedNodes = [];\r
-               c.sourceIndex = -1;\r
-\r
-               if (s.cleanup_serializer == "xml")\r
-                       h = c.serializeNodeAsXML(elm, inn);\r
-               else\r
-                       h = c.serializeNodeAsHTML(elm, inn);\r
-\r
-               if (d)\r
-                       t3 = new Date().getTime();\r
-\r
-               // Post processing\r
-               nb = tinyMCE.getParam('entity_encoding') == 'numeric' ? '&#160;' : '&nbsp;';\r
-               h = h.replace(/<\/?(body|head|html)[^>]*>/gi, '');\r
-               h = h.replace(new RegExp(' (rowspan="1"|colspan="1")', 'g'), '');\r
-               h = h.replace(/<p><hr \/><\/p>/g, '<hr />');\r
-               h = h.replace(/<p>(&nbsp;|&#160;)<\/p><hr \/><p>(&nbsp;|&#160;)<\/p>/g, '<hr />');\r
-               h = h.replace(/<td>\s*<br \/>\s*<\/td>/g, '<td>' + nb + '</td>');\r
-               h = h.replace(/<p>\s*<br \/>\s*<\/p>/g, '<p>' + nb + '</p>');\r
-               h = h.replace(/<br \/>$/, ''); // Remove last BR for Gecko\r
-               h = h.replace(/<br \/><\/p>/g, '</p>'); // Remove last BR in P tags for Gecko\r
-               h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g, '<p>' + nb + '</p>');\r
-               h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g, '<p>' + nb + '</p>');\r
-               h = h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g, '<p>' + nb + '</p>');\r
-               h = h.replace(new RegExp('<a>(.*?)<\\/a>', 'g'), '$1');\r
-               h = h.replace(/<p([^>]*)>\s*<\/p>/g, '<p$1>' + nb + '</p>');\r
-\r
-               // Clean body\r
-               if (/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))\r
-                       h = '';\r
-\r
-               // If preformatted\r
-               if (s.preformatted) {\r
-                       h = h.replace(/^<pre>/, '');\r
-                       h = h.replace(/<\/pre>$/, '');\r
-                       h = '<pre>' + h + '</pre>';\r
-               }\r
-\r
-               // Gecko specific processing\r
-               if (tinyMCE.isGecko) {\r
-                       // Makes no sence but FF generates it!!\r
-                       h = h.replace(/<br \/>\s*<\/li>/g, '</li>');\r
-                       h = h.replace(/&nbsp;\s*<\/(dd|dt)>/g, '</$1>');\r
-                       h = h.replace(/<o:p _moz-userdefined="" \/>/g, '');\r
-                       h = h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g, '<td$1>' + nb + '</td>');\r
-               }\r
-\r
-               if (s.force_br_newlines)\r
-                       h = h.replace(/<p>(&nbsp;|&#160;)<\/p>/g, '<br />');\r
-\r
-               // Call custom cleanup code\r
-               h = tinyMCE._customCleanup(inst, on_save ? "get_from_editor" : "insert_to_editor", h);\r
-\r
-               // Remove internal classes\r
-               if (on_save) {\r
-                       h = h.replace(new RegExp(' ?(mceItem[a-zA-Z0-9]*|' + s.visual_table_class + ')', 'g'), '');\r
-                       h = h.replace(new RegExp(' ?class=""', 'g'), '');\r
-               }\r
-\r
-               if (s.remove_linebreaks && !c.settings.indent)\r
-                       h = h.replace(/\n|\r/g, ' ');\r
-\r
-               if (d)\r
-                       t4 = new Date().getTime();\r
-\r
-               if (on_save && c.settings.indent)\r
-                       h = c.formatHTML(h);\r
-\r
-               // If encoding (not recommended option)\r
-               if (on_submit && (s.encoding == "xml" || s.encoding == "html"))\r
-                       h = c.xmlEncode(h);\r
-\r
-               if (d)\r
-                       t5 = new Date().getTime();\r
-\r
-               if (c.settings.debug)\r
-                       tinyMCE.debug("Cleanup in ms: Pre=" + (t2-t1) + ", Serialize: " + (t3-t2) + ", Post: " + (t4-t3) + ", Format: " + (t5-t4) + ", Sum: " + (t5-t1) + ".");\r
-\r
-               return h;\r
-       }\r
-});\r
-\r
-function TinyMCE_Cleanup() {\r
-       this.isIE = (navigator.appName == "Microsoft Internet Explorer");\r
-       this.rules = tinyMCE.clearArray([]);\r
-\r
-       // Default config\r
-       this.settings = {\r
-               indent_elements : 'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object',\r
-               newline_before_elements : 'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td',\r
-               newline_after_elements : 'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script',\r
-               newline_before_after_elements : 'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div',\r
-               indent_char : '\t',\r
-               indent_levels : 1,\r
-               entity_encoding : 'raw',\r
-               valid_elements : '*[*]',\r
-               entities : '',\r
-               url_converter : '',\r
-               invalid_elements : '',\r
-               verify_html : false\r
-       };\r
-\r
-       this.vElements = tinyMCE.clearArray([]);\r
-       this.vElementsRe = '';\r
-       this.closeElementsRe = /^(IMG|BR|HR|LINK|META|BASE|INPUT|AREA)$/;\r
-       this.codeElementsRe = /^(SCRIPT|STYLE)$/;\r
-       this.serializationId = 0;\r
-       this.mceAttribs = {\r
-               href : 'mce_href',\r
-               src : 'mce_src',\r
-               type : 'mce_type'\r
-       };\r
-}\r
-\r
-TinyMCE_Cleanup.prototype = {\r
-       init : function(s) {\r
-               var n, a, i, ir, or, st;\r
-\r
-               for (n in s)\r
-                       this.settings[n] = s[n];\r
-\r
-               // Setup code formating\r
-               s = this.settings;\r
-\r
-               // Setup regexps\r
-               this.inRe = this._arrayToRe(s.indent_elements.split(','), '', '^<(', ')[^>]*');\r
-               this.ouRe = this._arrayToRe(s.indent_elements.split(','), '', '^<\\/(', ')[^>]*');\r
-               this.nlBeforeRe = this._arrayToRe(s.newline_before_elements.split(','), 'gi', '<(',  ')([^>]*)>');\r
-               this.nlAfterRe = this._arrayToRe(s.newline_after_elements.split(','), 'gi', '<(',  ')([^>]*)>');\r
-               this.nlBeforeAfterRe = this._arrayToRe(s.newline_before_after_elements.split(','), 'gi', '<(\\/?)(', ')([^>]*)>');\r
-               this.serializedNodes = [];\r
-\r
-               if (s.invalid_elements !== '')\r
-                       this.iveRe = this._arrayToRe(s.invalid_elements.toUpperCase().split(','), 'g', '^(', ')$');\r
-               else\r
-                       this.iveRe = null;\r
-\r
-               // Setup separator\r
-               st = '';\r
-               for (i=0; i<s.indent_levels; i++)\r
-                       st += s.indent_char;\r
-\r
-               this.inStr = st;\r
-\r
-               // If verify_html if false force *[*]\r
-               if (!s.verify_html) {\r
-                       s.valid_elements = '*[*]';\r
-                       s.extended_valid_elements = '';\r
-               }\r
-\r
-               this.fillStr = s.entity_encoding == "named" ? "&nbsp;" : "&#160;";\r
-               this.idCount = 0;\r
-               this.xmlEncodeRe = new RegExp('[\u007F-\uFFFF<>&"]', 'g');\r
-       },\r
-\r
-       addRuleStr : function(s) {\r
-               var r = this.parseRuleStr(s), n;\r
-\r
-               for (n in r) {\r
-                       if (r[n])\r
-                               this.rules[n] = r[n];\r
-               }\r
-\r
-               this.vElements = tinyMCE.clearArray([]);\r
-\r
-               for (n in this.rules) {\r
-                       if (this.rules[n])\r
-                               this.vElements[this.vElements.length] = this.rules[n].tag;\r
-               }\r
-\r
-               this.vElementsRe = this._arrayToRe(this.vElements, '');\r
-       },\r
-\r
-       isValid : function(n) {\r
-               if (!this.rulesDone)\r
-                       this._setupRules(); // Will initialize cleanup rules\r
-\r
-               // Empty is true since it removes formatting\r
-               if (!n)\r
-                       return true;\r
-\r
-               // Clean the name up a bit\r
-               n = n.replace(/[^a-z0-9]+/gi, '').toUpperCase();\r
-\r
-               return !tinyMCE.getParam('cleanup') || this.vElementsRe.test(n);\r
-       },\r
-\r
-       addChildRemoveRuleStr : function(s) {\r
-               var x, y, p, i, t, tn, ta, cl, r;\r
-\r
-               if (!s)\r
-                       return;\r
-\r
-               ta = s.split(',');\r
-               for (x=0; x<ta.length; x++) {\r
-                       s = ta[x];\r
-\r
-                       // Split tag/children\r
-                       p = this.split(/\[|\]/, s);\r
-                       if (p == null || p.length < 1)\r
-                               t = s.toUpperCase();\r
-                       else\r
-                               t = p[0].toUpperCase();\r
-\r
-                       // Handle all tag names\r
-                       tn = this.split('/', t);\r
-                       for (y=0; y<tn.length; y++) {\r
-                               r = "^(";\r
-\r
-                               // Build regex\r
-                               cl = this.split(/\|/, p[1]);\r
-                               for (i=0; i<cl.length; i++) {\r
-                                       if (cl[i] == '%istrict')\r
-                                               r += tinyMCE.inlineStrict;\r
-                                       else if (cl[i] == '%itrans')\r
-                                               r += tinyMCE.inlineTransitional;\r
-                                       else if (cl[i] == '%istrict_na')\r
-                                               r += tinyMCE.inlineStrict.substring(2);\r
-                                       else if (cl[i] == '%itrans_na')\r
-                                               r += tinyMCE.inlineTransitional.substring(2);\r
-                                       else if (cl[i] == '%btrans')\r
-                                               r += tinyMCE.blockElms;\r
-                                       else if (cl[i] == '%strict')\r
-                                               r += tinyMCE.blockStrict;\r
-                                       else\r
-                                               r += (cl[i].charAt(0) != '#' ? cl[i].toUpperCase() : cl[i]);\r
-\r
-                                       r += (i != cl.length - 1 ? '|' : '');\r
-                               }\r
-\r
-                               r += ')$';\r
-\r
-                               if (this.childRules == null)\r
-                                       this.childRules = tinyMCE.clearArray([]);\r
-\r
-                               this.childRules[tn[y]] = new RegExp(r);\r
-\r
-                               if (p.length > 1)\r
-                                       this.childRules[tn[y]].wrapTag = p[2];\r
-                       }\r
-               }\r
-       },\r
-\r
-       parseRuleStr : function(s) {\r
-               var ta, p, r, a, i, x, px, t, tn, y, av, or = tinyMCE.clearArray([]), dv;\r
-\r
-               if (s == null || s.length == 0)\r
-                       return or;\r
-\r
-               ta = s.split(',');\r
-               for (x=0; x<ta.length; x++) {\r
-                       s = ta[x];\r
-                       if (s.length == 0)\r
-                               continue;\r
-\r
-                       // Split tag/attrs\r
-                       p = this.split(/\[|\]/, s);\r
-                       if (p == null || p.length < 1)\r
-                               t = s.toUpperCase();\r
-                       else\r
-                               t = p[0].toUpperCase();\r
-\r
-                       // Handle all tag names\r
-                       tn = this.split('/', t);\r
-                       for (y=0; y<tn.length; y++) {\r
-                               r = {};\r
-\r
-                               r.tag = tn[y];\r
-                               r.forceAttribs = null;\r
-                               r.defaultAttribs = null;\r
-                               r.validAttribValues = null;\r
-\r
-                               // Handle prefixes\r
-                               px = r.tag.charAt(0);\r
-                               r.forceOpen = px == '+';\r
-                               r.removeEmpty = px == '-';\r
-                               r.fill = px == '#';\r
-                               r.tag = r.tag.replace(/\+|-|#/g, '');\r
-                               r.oTagName = tn[0].replace(/\+|-|#/g, '').toLowerCase();\r
-                               r.isWild = new RegExp('\\*|\\?|\\+', 'g').test(r.tag);\r
-                               r.validRe = new RegExp(this._wildcardToRe('^' + r.tag + '$'));\r
-\r
-                               // Setup valid attributes\r
-                               if (p.length > 1) {\r
-                                       r.vAttribsRe = '^(';\r
-                                       a = this.split(/\|/, p[1]);\r
-\r
-                                       for (i=0; i<a.length; i++) {\r
-                                               t = a[i];\r
-\r
-                                               if (t.charAt(0) == '!') {\r
-                                                       a[i] = t = t.substring(1);\r
-\r
-                                                       if (!r.reqAttribsRe)\r
-                                                               r.reqAttribsRe = '\\s+(' + t;\r
-                                                       else\r
-                                                               r.reqAttribsRe += '|' + t;\r
-                                               }\r
-\r
-                                               av = new RegExp('(=|:|<)(.*?)$').exec(t);\r
-                                               t = t.replace(new RegExp('(=|:|<).*?$'), '');\r
-                                               if (av && av.length > 0) {\r
-                                                       if (av[0].charAt(0) == ':') {\r
-                                                               if (!r.forceAttribs)\r
-                                                                       r.forceAttribs = tinyMCE.clearArray([]);\r
-\r
-                                                               r.forceAttribs[t.toLowerCase()] = av[0].substring(1);\r
-                                                       } else if (av[0].charAt(0) == '=') {\r
-                                                               if (!r.defaultAttribs)\r
-                                                                       r.defaultAttribs = tinyMCE.clearArray([]);\r
-\r
-                                                               dv = av[0].substring(1);\r
-\r
-                                                               r.defaultAttribs[t.toLowerCase()] = dv == '' ? "mce_empty" : dv;\r
-                                                       } else if (av[0].charAt(0) == '<') {\r
-                                                               if (!r.validAttribValues)\r
-                                                                       r.validAttribValues = tinyMCE.clearArray([]);\r
-\r
-                                                               r.validAttribValues[t.toLowerCase()] = this._arrayToRe(this.split('?', av[0].substring(1)), 'i');\r
-                                                       }\r
-                                               }\r
-\r
-                                               r.vAttribsRe += '' + t.toLowerCase() + (i != a.length - 1 ? '|' : '');\r
-\r
-                                               a[i] = t.toLowerCase();\r
-                                       }\r
-\r
-                                       if (r.reqAttribsRe)\r
-                                               r.reqAttribsRe = new RegExp(r.reqAttribsRe + ')=\"', 'g');\r
-\r
-                                       r.vAttribsRe += ')$';\r
-                                       r.vAttribsRe = this._wildcardToRe(r.vAttribsRe);\r
-                                       r.vAttribsReIsWild = new RegExp('\\*|\\?|\\+', 'g').test(r.vAttribsRe);\r
-                                       r.vAttribsRe = new RegExp(r.vAttribsRe);\r
-                                       r.vAttribs = a.reverse();\r
-\r
-                                       //tinyMCE.debug(r.tag, r.oTagName, r.vAttribsRe, r.vAttribsReWC);\r
-                               } else {\r
-                                       r.vAttribsRe = '';\r
-                                       r.vAttribs = tinyMCE.clearArray([]);\r
-                                       r.vAttribsReIsWild = false;\r
-                               }\r
-\r
-                               or[r.tag] = r;\r
-                       }\r
-               }\r
-\r
-               return or;\r
-       },\r
-\r
-       serializeNodeAsXML : function(n) {\r
-               var s, b;\r
-\r
-               if (!this.xmlDoc) {\r
-                       if (this.isIE) {\r
-                               try {this.xmlDoc = new ActiveXObject('MSXML2.DOMDocument');} catch (e) {}\r
-\r
-                               if (!this.xmlDoc)\r
-                                       try {this.xmlDoc = new ActiveXObject('Microsoft.XmlDom');} catch (e) {}\r
-                       } else\r
-                               this.xmlDoc = document.implementation.createDocument('', '', null);\r
-\r
-                       if (!this.xmlDoc)\r
-                               alert("Error XML Parser could not be found.");\r
-               }\r
-\r
-               if (this.xmlDoc.firstChild)\r
-                       this.xmlDoc.removeChild(this.xmlDoc.firstChild);\r
-\r
-               b = this.xmlDoc.createElement("html");\r
-               b = this.xmlDoc.appendChild(b);\r
-\r
-               this._convertToXML(n, b);\r
-\r
-               if (this.isIE)\r
-                       return this.xmlDoc.xml;\r
-               else\r
-                       return new XMLSerializer().serializeToString(this.xmlDoc);\r
-       },\r
-\r
-       _convertToXML : function(n, xn) {\r
-               var xd, el, i, l, cn, at, no, hc = false;\r
-\r
-               if (tinyMCE.isRealIE && this._isDuplicate(n))\r
-                       return;\r
-\r
-               xd = this.xmlDoc;\r
-\r
-               switch (n.nodeType) {\r
-                       case 1: // Element\r
-                               hc = n.hasChildNodes();\r
-\r
-                               el = xd.createElement(n.nodeName.toLowerCase());\r
-\r
-                               at = n.attributes;\r
-                               for (i=at.length-1; i>-1; i--) {\r
-                                       no = at[i];\r
-\r
-                                       if (no.specified && no.nodeValue)\r
-                                               el.setAttribute(no.nodeName.toLowerCase(), no.nodeValue);\r
-                               }\r
-\r
-                               if (!hc && !this.closeElementsRe.test(n.nodeName))\r
-                                       el.appendChild(xd.createTextNode(""));\r
-\r
-                               xn = xn.appendChild(el);\r
-                               break;\r
-\r
-                       case 3: // Text\r
-                               xn.appendChild(xd.createTextNode(n.nodeValue));\r
-                               return;\r
-\r
-                       case 8: // Comment\r
-                               xn.appendChild(xd.createComment(n.nodeValue));\r
-                               return;\r
-               }\r
-\r
-               if (hc) {\r
-                       cn = n.childNodes;\r
-\r
-                       for (i=0, l=cn.length; i<l; i++)\r
-                               this._convertToXML(cn[i], xn);\r
-               }\r
-       },\r
-\r
-       serializeNodeAsHTML : function(n, inn) {\r
-               var en, no, h = '', i, l, t, st, r, cn, va = false, f = false, at, hc, cr, nn;\r
-\r
-               if (!this.rulesDone)\r
-                       this._setupRules(); // Will initialize cleanup rules\r
-\r
-               if (tinyMCE.isRealIE && this._isDuplicate(n))\r
-                       return '';\r
-\r
-               // Skip non valid child elements\r
-               if (n.parentNode && this.childRules != null) {\r
-                       cr = this.childRules[n.parentNode.nodeName];\r
-\r
-                       if (typeof(cr) != "undefined" && !cr.test(n.nodeName)) {\r
-                               st = true;\r
-                               t = null;\r
-                       }\r
-               }\r
-\r
-               switch (n.nodeType) {\r
-                       case 1: // Element\r
-                               hc = n.hasChildNodes();\r
-\r
-                               if (st)\r
-                                       break;\r
-\r
-                               nn = n.nodeName;\r
-\r
-                               if (tinyMCE.isRealIE) {\r
-                                       // MSIE sometimes produces <//tag>\r
-                                       if (n.nodeName.indexOf('/') != -1)\r
-                                               break;\r
-\r
-                                       // MSIE has it's NS in a separate attrib\r
-                                       if (n.scopeName && n.scopeName != 'HTML')\r
-                                               nn = n.scopeName.toUpperCase() + ':' + nn.toUpperCase();\r
-                               } else if (tinyMCE.isOpera && nn.indexOf(':') > 0)\r
-                                       nn = nn.toUpperCase();\r
-\r
-                               // Convert fonts to spans\r
-                               if (this.settings.convert_fonts_to_spans) {\r
-                                       // On get content FONT -> SPAN\r
-                                       if (this.settings.on_save && nn == 'FONT')\r
-                                               nn = 'SPAN';\r
-\r
-                                       // On insert content SPAN -> FONT\r
-                                       if (!this.settings.on_save && nn == 'SPAN')\r
-                                               nn = 'FONT';\r
-                               }\r
-\r
-                               if (this.vElementsRe.test(nn) && (!this.iveRe || !this.iveRe.test(nn)) && !inn) {\r
-                                       va = true;\r
-\r
-                                       r = this.rules[nn];\r
-                                       if (!r) {\r
-                                               at = this.rules;\r
-                                               for (no in at) {\r
-                                                       if (at[no] && at[no].validRe.test(nn)) {\r
-                                                               r = at[no];\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-\r
-                                       en = r.isWild ? nn.toLowerCase() : r.oTagName;\r
-                                       f = r.fill;\r
-\r
-                                       if (r.removeEmpty && !hc)\r
-                                               return "";\r
-\r
-                                       t = '<' + en;\r
-\r
-                                       if (r.vAttribsReIsWild) {\r
-                                               // Serialize wildcard attributes\r
-                                               at = n.attributes;\r
-                                               for (i=at.length-1; i>-1; i--) {\r
-                                                       no = at[i];\r
-                                                       if (no.specified && r.vAttribsRe.test(no.nodeName))\r
-                                                               t += this._serializeAttribute(n, r, no.nodeName);\r
-                                               }\r
-                                       } else {\r
-                                               // Serialize specific attributes\r
-                                               for (i=r.vAttribs.length-1; i>-1; i--)\r
-                                                       t += this._serializeAttribute(n, r, r.vAttribs[i]);\r
-                                       }\r
-\r
-                                       // Serialize mce_ atts\r
-                                       if (!this.settings.on_save) {\r
-                                               at = this.mceAttribs;\r
-\r
-                                               for (no in at) {\r
-                                                       if (at[no])\r
-                                                               t += this._serializeAttribute(n, r, at[no]);\r
-                                               }\r
-                                       }\r
-\r
-                                       // Check for required attribs\r
-                                       if (r.reqAttribsRe && !t.match(r.reqAttribsRe))\r
-                                               t = null;\r
-\r
-                                       // Close these\r
-                                       if (t != null && this.closeElementsRe.test(nn))\r
-                                               return t + ' />';\r
-\r
-                                       if (t != null)\r
-                                               h += t + '>';\r
-\r
-                                       if (this.isIE && this.codeElementsRe.test(nn))\r
-                                               h += n.innerHTML;\r
-                               }\r
-                       break;\r
-\r
-                       case 3: // Text\r
-                               if (st)\r
-                                       break;\r
-\r
-                               if (n.parentNode && this.codeElementsRe.test(n.parentNode.nodeName))\r
-                                       return this.isIE ? '' : n.nodeValue;\r
-\r
-                               return this.xmlEncode(n.nodeValue);\r
-\r
-                       case 8: // Comment\r
-                               if (st)\r
-                                       break;\r
-\r
-                               return "<!--" + this._trimComment(n.nodeValue) + "-->";\r
-               }\r
-\r
-               if (hc) {\r
-                       cn = n.childNodes;\r
-\r
-                       for (i=0, l=cn.length; i<l; i++)\r
-                               h += this.serializeNodeAsHTML(cn[i]);\r
-               }\r
-\r
-               // Fill empty nodes\r
-               if (f && !hc)\r
-                       h += this.fillStr;\r
-\r
-               // End element\r
-               if (t != null && va)\r
-                       h += '</' + en + '>';\r
-\r
-               return h;\r
-       },\r
-\r
-       _serializeAttribute : function(n, r, an) {\r
-               var av = '', t, os = this.settings.on_save;\r
-\r
-               if (os && (an.indexOf('mce_') == 0 || an.indexOf('_moz') == 0))\r
-                       return '';\r
-\r
-               if (os && this.mceAttribs[an])\r
-                       av = this._getAttrib(n, this.mceAttribs[an]);\r
-\r
-               if (av.length == 0)\r
-                       av = this._getAttrib(n, an);\r
-\r
-               if (av.length == 0 && r.defaultAttribs && (t = r.defaultAttribs[an])) {\r
-                       av = t;\r
-\r
-                       if (av == "mce_empty")\r
-                               return " " + an + '=""';\r
-               }\r
-\r
-               if (r.forceAttribs && (t = r.forceAttribs[an]))\r
-                       av = t;\r
-\r
-               if (os && av.length != 0 && /^(src|href|longdesc)$/.test(an))\r
-                       av = this._urlConverter(this, n, av);\r
-\r
-               if (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av))\r
-                       return "";\r
-\r
-               if (av.length != 0 && av == "{$uid}")\r
-                       av = "uid_" + (this.idCount++);\r
-\r
-               if (av.length != 0) {\r
-                       if (an.indexOf('on') != 0)\r
-                               av = this.xmlEncode(av, 1);\r
-\r
-                       return " " + an + "=" + '"' + av + '"';\r
-               }\r
-\r
-               return "";\r
-       },\r
-\r
-       formatHTML : function(h) {\r
-               var s = this.settings, p = '', i = 0, li = 0, o = '', l;\r
-\r
-               // Replace BR in pre elements to \n\r
-               h = h.replace(/<pre([^>]*)>(.*?)<\/pre>/gi, function (a, b, c) {\r
-                       c = c.replace(/<br\s*\/>/gi, '\n');\r
-                       return '<pre' + b + '>' + c + '</pre>';\r
-               });\r
-\r
-               h = h.replace(/\r/g, ''); // Windows sux, isn't carriage return a thing of the past :)\r
-               h = '\n' + h;\r
-               h = h.replace(new RegExp('\\n\\s+', 'gi'), '\n'); // Remove previous formatting\r
-               h = h.replace(this.nlBeforeRe, '\n<$1$2>');\r
-               h = h.replace(this.nlAfterRe, '<$1$2>\n');\r
-               h = h.replace(this.nlBeforeAfterRe, '\n<$1$2$3>\n');\r
-               h += '\n';\r
-\r
-               //tinyMCE.debug(h);\r
-\r
-               while ((i = h.indexOf('\n', i + 1)) != -1) {\r
-                       if ((l = h.substring(li + 1, i)).length != 0) {\r
-                               if (this.ouRe.test(l) && p.length >= s.indent_levels)\r
-                                       p = p.substring(s.indent_levels);\r
-\r
-                               o += p + l + '\n';\r
-       \r
-                               if (this.inRe.test(l))\r
-                                       p += this.inStr;\r
-                       }\r
-\r
-                       li = i;\r
-               }\r
-\r
-               //tinyMCE.debug(h);\r
-\r
-               return o;\r
-       },\r
-\r
-       xmlEncode : function(s) {\r
-               var cl = this, re = this.xmlEncodeRe;\r
-\r
-               if (!this.entitiesDone)\r
-                       this._setupEntities(); // Will intialize lookup table\r
-\r
-               switch (this.settings.entity_encoding) {\r
-                       case "raw":\r
-                               return tinyMCE.xmlEncode(s);\r
-\r
-                       case "named":\r
-                               return s.replace(re, function (c) {\r
-                                       var b = cl.entities[c.charCodeAt(0)];\r
-\r
-                                       return b ? '&' + b + ';' : c;\r
-                               });\r
-\r
-                       case "numeric":\r
-                               return s.replace(re, function (c) {\r
-                                       return '&#' + c.charCodeAt(0) + ';';\r
-                               });\r
-               }\r
-\r
-               return s;\r
-       },\r
-\r
-       split : function(re, s) {\r
-               var i, l, o = [], c = s.split(re);\r
-\r
-               for (i=0, l=c.length; i<l; i++) {\r
-                       if (c[i] !== '')\r
-                               o[i] = c[i];\r
-               }\r
-\r
-               return o;\r
-       },\r
-\r
-       _trimComment : function(s) {\r
-               // Remove mce_src, mce_href\r
-               s = s.replace(new RegExp('\\smce_src=\"[^\"]*\"', 'gi'), "");\r
-               s = s.replace(new RegExp('\\smce_href=\"[^\"]*\"', 'gi'), "");\r
-\r
-               return s;\r
-       },\r
-\r
-       _getAttrib : function(e, n, d) {\r
-               var v, ex, nn;\r
-\r
-               if (typeof(d) == "undefined")\r
-                       d = "";\r
-\r
-               if (!e || e.nodeType != 1)\r
-                       return d;\r
-\r
-               try {\r
-                       v = e.getAttribute(n, 0);\r
-               } catch (ex) {\r
-                       // IE 7 may cast exception on invalid attributes\r
-                       v = e.getAttribute(n, 2);\r
-               }\r
-\r
-               if (n == "class" && !v)\r
-                       v = e.className;\r
-\r
-               if (this.isIE) {\r
-                       if (n == "http-equiv")\r
-                               v = e.httpEquiv;\r
-\r
-                       nn = e.nodeName;\r
-\r
-                       // Skip the default values that IE returns\r
-                       if (nn == "FORM" && n == "enctype" && v == "application/x-www-form-urlencoded")\r
-                               v = "";\r
-\r
-                       if (nn == "INPUT" && n == "size" && v == "20")\r
-                               v = "";\r
-\r
-                       if (nn == "INPUT" && n == "maxlength" && v == "2147483647")\r
-                               v = "";\r
-\r
-                       // Images\r
-                       if (n == "width" || n == "height")\r
-                               v = e.getAttribute(n, 2);\r
-               }\r
-\r
-               if (n == 'style' && v) {\r
-                       if (!tinyMCE.isOpera)\r
-                               v = e.style.cssText;\r
-\r
-                       v = tinyMCE.serializeStyle(tinyMCE.parseStyle(v));\r
-               }\r
-\r
-               if (this.settings.on_save && n.indexOf('on') != -1 && this.settings.on_save && v && v !== '')\r
-                       v = tinyMCE.cleanupEventStr(v);\r
-\r
-               return (v && v !== '') ? '' + v : d;\r
-       },\r
-\r
-       _urlConverter : function(c, n, v) {\r
-               if (!c.settings.on_save)\r
-                       return tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, v);\r
-               else if (tinyMCE.getParam('convert_urls')) {\r
-                       if (!this.urlConverter)\r
-                               this.urlConverter = eval(tinyMCE.settings.urlconverter_callback);\r
-\r
-                       return this.urlConverter(v, n, true);\r
-               }\r
-\r
-               return v;\r
-       },\r
-\r
-       _arrayToRe : function(a, op, be, af) {\r
-               var i, r;\r
-\r
-               op = typeof(op) == "undefined" ? "gi" : op;\r
-               be = typeof(be) == "undefined" ? "^(" : be;\r
-               af = typeof(af) == "undefined" ? ")$" : af;\r
-\r
-               r = be;\r
-\r
-               for (i=0; i<a.length; i++)\r
-                       r += this._wildcardToRe(a[i]) + (i != a.length-1 ? "|" : "");\r
-\r
-               r += af;\r
-\r
-               return new RegExp(r, op);\r
-       },\r
-\r
-       _wildcardToRe : function(s) {\r
-               s = s.replace(/\?/g, '(\\S?)');\r
-               s = s.replace(/\+/g, '(\\S+)');\r
-               s = s.replace(/\*/g, '(\\S*)');\r
-\r
-               return s;\r
-       },\r
-\r
-       _setupEntities : function() {\r
-               var n, a, i, s = this.settings;\r
-\r
-               // Setup entities\r
-               if (s.entity_encoding == "named") {\r
-                       n = tinyMCE.clearArray([]);\r
-                       a = this.split(',', s.entities);\r
-                       for (i=0; i<a.length; i+=2)\r
-                               n[a[i]] = a[i+1];\r
-\r
-                       this.entities = n;\r
-               }\r
-\r
-               this.entitiesDone = true;\r
-       },\r
-\r
-       _setupRules : function() {\r
-               var s = this.settings;\r
-\r
-               // Setup default rule\r
-               this.addRuleStr(s.valid_elements);\r
-               this.addRuleStr(s.extended_valid_elements);\r
-               this.addChildRemoveRuleStr(s.valid_child_elements);\r
-\r
-               this.rulesDone = true;\r
-       },\r
-\r
-       _isDuplicate : function(n) {\r
-               var i, l, sn;\r
-\r
-               if (!this.settings.fix_content_duplication)\r
-                       return false;\r
-\r
-               if (tinyMCE.isRealIE && n.nodeType == 1) {\r
-                       // Mark elements\r
-                       if (n.mce_serialized == this.serializationId)\r
-                               return true;\r
-\r
-                       n.setAttribute('mce_serialized', this.serializationId);\r
-               } else {\r
-                       sn = this.serializedNodes;\r
-\r
-                       // Search lookup table for text nodes  and comments\r
-                       for (i=0, l = sn.length; i<l; i++) {\r
-                               if (sn[i] == n)\r
-                                       return true;\r
-                       }\r
-\r
-                       sn.push(n);\r
-               }\r
-\r
-               return false;\r
-       }\r
-\r
-       };\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_DOMUtils.class.js */\r
-\r
-tinyMCE.add(TinyMCE_Engine, {\r
-       createTagHTML : function(tn, a, h) {\r
-               var o = '', f = tinyMCE.xmlEncode, n;\r
-\r
-               o = '<' + tn;\r
-\r
-               if (a) {\r
-                       for (n in a) {\r
-                               if (typeof(a[n]) != 'function' && a[n] != null)\r
-                                       o += ' ' + f(n) + '="' + f('' + a[n]) + '"';\r
-                       }\r
-               }\r
-\r
-               o += !h ? ' />' : '>' + h + '</' + tn + '>';\r
-\r
-               return o;\r
-       },\r
-\r
-       createTag : function(d, tn, a, h) {\r
-               var o = d.createElement(tn), n;\r
-\r
-               if (a) {\r
-                       for (n in a) {\r
-                               if (typeof(a[n]) != 'function' && a[n] != null)\r
-                                       tinyMCE.setAttrib(o, n, a[n]);\r
-                       }\r
-               }\r
-\r
-               if (h)\r
-                       o.innerHTML = h;\r
-\r
-               return o;\r
-       },\r
-\r
-       getElementByAttributeValue : function(n, e, a, v) {\r
-               return (n = this.getElementsByAttributeValue(n, e, a, v)).length == 0 ? null : n[0];\r
-       },\r
-\r
-       getElementsByAttributeValue : function(n, e, a, v) {\r
-               var i, nl = n.getElementsByTagName(e), o = [];\r
-\r
-               for (i=0; i<nl.length; i++) {\r
-                       if (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)\r
-                               o[o.length] = nl[i];\r
-               }\r
-\r
-               return o;\r
-       },\r
-\r
-       isBlockElement : function(n) {\r
-               return n != null && n.nodeType == 1 && this.blockRegExp.test(n.nodeName);\r
-       },\r
-\r
-       getParentBlockElement : function(n, r) {\r
-               return this.getParentNode(n, function(n) {\r
-                       return tinyMCE.isBlockElement(n);\r
-               }, r);\r
-\r
-               return null;\r
-       },\r
-\r
-       insertAfter : function(n, r){\r
-               if (r.nextSibling)\r
-                       r.parentNode.insertBefore(n, r.nextSibling);\r
-               else\r
-                       r.parentNode.appendChild(n);\r
-       },\r
-\r
-       setInnerHTML : function(e, h) {\r
-               var i, nl, n;\r
-\r
-               // Convert all strong/em to b/i in Gecko\r
-               if (tinyMCE.isGecko) {\r
-                       h = h.replace(/<embed([^>]*)>/gi, '<tmpembed$1>');\r
-                       h = h.replace(/<em([^>]*)>/gi, '<i$1>');\r
-                       h = h.replace(/<tmpembed([^>]*)>/gi, '<embed$1>');\r
-                       h = h.replace(/<strong([^>]*)>/gi, '<b$1>');\r
-                       h = h.replace(/<\/strong>/gi, '</b>');\r
-                       h = h.replace(/<\/em>/gi, '</i>');\r
-               }\r
-\r
-               if (tinyMCE.isRealIE) {\r
-                       // Since MSIE handles invalid HTML better that valid XHTML we\r
-                       // need to make some things invalid. <hr /> gets converted to <hr>.\r
-                       h = h.replace(/\s\/>/g, '>');\r
-\r
-                       // Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones\r
-                       h = h.replace(/<p([^>]*)>\u00A0?<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs\r
-                       h = h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs\r
-                       h = h.replace(/<p([^>]*)>\s+<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs\r
-\r
-                       // Remove first comment\r
-                       e.innerHTML = tinyMCE.uniqueTag + h;\r
-                       e.firstChild.removeNode(true);\r
-\r
-                       // Remove weird auto generated empty paragraphs unless it's supposed to be there\r
-                       nl = e.getElementsByTagName("p");\r
-                       for (i=nl.length-1; i>=0; i--) {\r
-                               n = nl[i];\r
-\r
-                               if (n.nodeName == 'P' && !n.hasChildNodes() && !n.mce_keep)\r
-                                       n.parentNode.removeChild(n);\r
-                       }\r
-               } else {\r
-                       h = this.fixGeckoBaseHREFBug(1, e, h);\r
-                       e.innerHTML = h;\r
-                       this.fixGeckoBaseHREFBug(2, e, h);\r
-               }\r
-       },\r
-\r
-       getOuterHTML : function(e) {\r
-               var d;\r
-\r
-               if (tinyMCE.isIE)\r
-                       return e.outerHTML;\r
-\r
-               d = e.ownerDocument.createElement("body");\r
-               d.appendChild(e.cloneNode(true));\r
-\r
-               return d.innerHTML;\r
-       },\r
-\r
-       setOuterHTML : function(e, h, d) {\r
-               var d = typeof(d) == "undefined" ? e.ownerDocument : d, i, nl, t;\r
-\r
-               if (tinyMCE.isIE && e.nodeType == 1)\r
-                       e.outerHTML = h;\r
-               else {\r
-                       t = d.createElement("body");\r
-                       t.innerHTML = h;\r
-\r
-                       for (i=0, nl=t.childNodes; i<nl.length; i++)\r
-                               e.parentNode.insertBefore(nl[i].cloneNode(true), e);\r
-\r
-                       e.parentNode.removeChild(e);\r
-               }\r
-       },\r
-\r
-       _getElementById : function(id, d) {\r
-               var e, i, j, f;\r
-\r
-               if (typeof(d) == "undefined")\r
-                       d = document;\r
-\r
-               e = d.getElementById(id);\r
-               if (!e) {\r
-                       f = d.forms;\r
-\r
-                       for (i=0; i<f.length; i++) {\r
-                               for (j=0; j<f[i].elements.length; j++) {\r
-                                       if (f[i].elements[j].name == id) {\r
-                                               e = f[i].elements[j];\r
-                                               break;\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-\r
-               return e;\r
-       },\r
-\r
-       getNodeTree : function(n, na, t, nn) {\r
-               return this.selectNodes(n, function(n) {\r
-                       return (!t || n.nodeType == t) && (!nn || n.nodeName == nn);\r
-               }, na ? na : []);\r
-       },\r
-\r
-       getParentElement : function(n, na, f, r) {\r
-               var re = na ? new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$') : 0, v;\r
-\r
-               // Compatiblity with old scripts where f param was a attribute string\r
-               if (f && typeof(f) == 'string')\r
-                       return this.getParentElement(n, na, function(no) {return tinyMCE.getAttrib(no, f) !== '';});\r
-\r
-               return this.getParentNode(n, function(n) {\r
-                       return ((n.nodeType == 1 && !re) || (re && re.test(n.nodeName))) && (!f || f(n));\r
-               }, r);\r
-       },\r
-\r
-       getParentNode : function(n, f, r) {\r
-               while (n) {\r
-                       if (n == r)\r
-                               return null;\r
-\r
-                       if (f(n))\r
-                               return n;\r
-\r
-                       n = n.parentNode;\r
-               }\r
-\r
-               return null;\r
-       },\r
-\r
-       getAttrib : function(elm, name, dv) {\r
-               var v;\r
-\r
-               if (typeof(dv) == "undefined")\r
-                       dv = "";\r
-\r
-               // Not a element\r
-               if (!elm || elm.nodeType != 1)\r
-                       return dv;\r
-\r
-               try {\r
-                       v = elm.getAttribute(name, 0);\r
-               } catch (ex) {\r
-                       // IE 7 may cast exception on invalid attributes\r
-                       v = elm.getAttribute(name, 2);\r
-               }\r
-\r
-               // Try className for class attrib\r
-               if (name == "class" && !v)\r
-                       v = elm.className;\r
-\r
-               // Workaround for a issue with Firefox 1.5rc2+\r
-               if (tinyMCE.isGecko) {\r
-                       if (name == "src" && elm.src != null && elm.src !== '')\r
-                               v = elm.src;\r
-\r
-                       // Workaround for a issue with Firefox 1.5rc2+\r
-                       if (name == "href" && elm.href != null && elm.href !== '')\r
-                               v = elm.href;\r
-               } else if (tinyMCE.isIE) {\r
-                       switch (name) {\r
-                               case "http-equiv":\r
-                                       v = elm.httpEquiv;\r
-                                       break;\r
-\r
-                               case "width":\r
-                               case "height":\r
-                                       v = elm.getAttribute(name, 2);\r
-                                       break;\r
-                       }\r
-               }\r
-\r
-               if (name == "style" && !tinyMCE.isOpera)\r
-                       v = elm.style.cssText;\r
-\r
-               return (v && v !== '') ? v : dv;\r
-       },\r
-\r
-       setAttrib : function(el, name, va, fix) {\r
-               if (typeof(va) == "number" && va != null)\r
-                       va = "" + va;\r
-\r
-               if (fix) {\r
-                       if (va == null)\r
-                               va = "";\r
-\r
-                       va = va.replace(/[^0-9%]/g, '');\r
-               }\r
-\r
-               if (name == "style")\r
-                       el.style.cssText = va;\r
-\r
-               if (name == "class")\r
-                       el.className = va;\r
-\r
-               if (va != null && va !== '' && va != -1)\r
-                       el.setAttribute(name, va);\r
-               else\r
-                       el.removeAttribute(name);\r
-       },\r
-\r
-       setStyleAttrib : function(e, n, v) {\r
-               e.style[n] = v;\r
-\r
-               // Style attrib deleted in IE\r
-               if (tinyMCE.isIE && v == null || v == '') {\r
-                       v = tinyMCE.serializeStyle(tinyMCE.parseStyle(e.style.cssText));\r
-                       e.style.cssText = v;\r
-                       e.setAttribute("style", v);\r
-               }\r
-       },\r
-\r
-       switchClass : function(ei, c) {\r
-               var e;\r
-\r
-               if (tinyMCE.switchClassCache[ei])\r
-                       e = tinyMCE.switchClassCache[ei];\r
-               else\r
-                       e = tinyMCE.switchClassCache[ei] = document.getElementById(ei);\r
-\r
-               if (e) {\r
-                       // Keep tile mode\r
-                       if (tinyMCE.settings.button_tile_map && e.className && e.className.indexOf('mceTiledButton') == 0)\r
-                               c = 'mceTiledButton ' + c;\r
-\r
-                       e.className = c;\r
-               }\r
-       },\r
-\r
-       getAbsPosition : function(n, cn) {\r
-               var l = 0, t = 0;\r
-\r
-               while (n && n != cn) {\r
-                       l += n.offsetLeft;\r
-                       t += n.offsetTop;\r
-                       n = n.offsetParent;\r
-               }\r
-\r
-               return {absLeft : l, absTop : t};\r
-       },\r
-\r
-       prevNode : function(e, n) {\r
-               var a = n.split(','), i;\r
-\r
-               while ((e = e.previousSibling) != null) {\r
-                       for (i=0; i<a.length; i++) {\r
-                               if (e.nodeName == a[i])\r
-                                       return e;\r
-                       }\r
-               }\r
-\r
-               return null;\r
-       },\r
-\r
-       nextNode : function(e, n) {\r
-               var a = n.split(','), i;\r
-\r
-               while ((e = e.nextSibling) != null) {\r
-                       for (i=0; i<a.length; i++) {\r
-                               if (e.nodeName == a[i])\r
-                                       return e;\r
-                       }\r
-               }\r
-\r
-               return null;\r
-       },\r
-\r
-       selectElements : function(n, na, f) {\r
-               var i, a = [], nl, x;\r
-\r
-               for (x=0, na = na.split(','); x<na.length; x++)\r
-                       for (i=0, nl = n.getElementsByTagName(na[x]); i<nl.length; i++)\r
-                               (!f || f(nl[i])) && a.push(nl[i]);\r
-\r
-               return a;\r
-       },\r
-\r
-       selectNodes : function(n, f, a) {\r
-               var i;\r
-\r
-               if (!a)\r
-                       a = [];\r
-\r
-               if (f(n))\r
-                       a[a.length] = n;\r
-\r
-               if (n.hasChildNodes()) {\r
-                       for (i=0; i<n.childNodes.length; i++)\r
-                               tinyMCE.selectNodes(n.childNodes[i], f, a);\r
-               }\r
-\r
-               return a;\r
-       },\r
-\r
-       addCSSClass : function(e, c, b) {\r
-               var o = this.removeCSSClass(e, c);\r
-               return e.className = b ? c + (o !== '' ? (' ' + o) : '') : (o !== '' ? (o + ' ') : '') + c;\r
-       },\r
-\r
-       removeCSSClass : function(e, c) {\r
-               c = e.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');\r
-               return e.className = c != ' ' ? c : '';\r
-       },\r
-\r
-       hasCSSClass : function(n, c) {\r
-               return new RegExp('\\b' + c + '\\b', 'g').test(n.className);\r
-       },\r
-\r
-       renameElement : function(e, n, d) {\r
-               var ne, i, ar;\r
-\r
-               d = typeof(d) == "undefined" ? tinyMCE.selectedInstance.getDoc() : d;\r
-\r
-               if (e) {\r
-                       ne = d.createElement(n);\r
-\r
-                       ar = e.attributes;\r
-                       for (i=ar.length-1; i>-1; i--) {\r
-                               if (ar[i].specified && ar[i].nodeValue)\r
-                                       ne.setAttribute(ar[i].nodeName.toLowerCase(), ar[i].nodeValue);\r
-                       }\r
-\r
-                       ar = e.childNodes;\r
-                       for (i=0; i<ar.length; i++)\r
-                               ne.appendChild(ar[i].cloneNode(true));\r
-\r
-                       e.parentNode.replaceChild(ne, e);\r
-               }\r
-       },\r
-\r
-       getViewPort : function(w) {\r
-               var d = w.document, m = d.compatMode == 'CSS1Compat', b = d.body, de = d.documentElement;\r
-\r
-               return {\r
-                       left : w.pageXOffset || (m ? de.scrollLeft : b.scrollLeft),\r
-                       top : w.pageYOffset || (m ? de.scrollTop : b.scrollTop),\r
-                       width : w.innerWidth || (m ? de.clientWidth : b.clientWidth),\r
-                       height : w.innerHeight || (m ? de.clientHeight : b.clientHeight)\r
-               };\r
-       },\r
-\r
-       getStyle : function(n, na, d) {\r
-               if (!n)\r
-                       return false;\r
-\r
-               // Gecko\r
-               if (tinyMCE.isGecko && n.ownerDocument.defaultView) {\r
-                       try {\r
-                               return n.ownerDocument.defaultView.getComputedStyle(n, null).getPropertyValue(na);\r
-                       } catch (n) {\r
-                               // Old safari might fail\r
-                               return null;\r
-                       }\r
-               }\r
-\r
-               // Camelcase it, if needed\r
-               na = na.replace(/-(\D)/g, function(a, b){\r
-                       return b.toUpperCase();\r
-               });\r
-\r
-               // IE & Opera\r
-               if (n.currentStyle)\r
-                       return n.currentStyle[na];\r
-\r
-               return false;\r
-       }\r
-\r
-       });\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_URL.class.js */\r
-\r
-tinyMCE.add(TinyMCE_Engine, {\r
-       parseURL : function(url_str) {\r
-               var urlParts = [], i, pos, lastPos, chr;\r
-\r
-               if (url_str) {\r
-                       // Parse protocol part\r
-                       pos = url_str.indexOf('://');\r
-                       if (pos != -1) {\r
-                               urlParts.protocol = url_str.substring(0, pos);\r
-                               lastPos = pos + 3;\r
-                       }\r
-\r
-                       // Find port or path start\r
-                       for (i=lastPos; i<url_str.length; i++) {\r
-                               chr = url_str.charAt(i);\r
-\r
-                               if (chr == ':')\r
-                                       break;\r
-\r
-                               if (chr == '/')\r
-                                       break;\r
-                       }\r
-                       pos = i;\r
-\r
-                       // Get host\r
-                       urlParts.host = url_str.substring(lastPos, pos);\r
-\r
-                       // Get port\r
-                       urlParts.port = "";\r
-                       lastPos = pos;\r
-                       if (url_str.charAt(pos) == ':') {\r
-                               pos = url_str.indexOf('/', lastPos);\r
-                               urlParts.port = url_str.substring(lastPos+1, pos);\r
-                       }\r
-\r
-                       // Get path\r
-                       lastPos = pos;\r
-                       pos = url_str.indexOf('?', lastPos);\r
-\r
-                       if (pos == -1)\r
-                               pos = url_str.indexOf('#', lastPos);\r
-\r
-                       if (pos == -1)\r
-                               pos = url_str.length;\r
-\r
-                       urlParts.path = url_str.substring(lastPos, pos);\r
-\r
-                       // Get query\r
-                       lastPos = pos;\r
-                       if (url_str.charAt(pos) == '?') {\r
-                               pos = url_str.indexOf('#');\r
-                               pos = (pos == -1) ? url_str.length : pos;\r
-                               urlParts.query = url_str.substring(lastPos+1, pos);\r
-                       }\r
-\r
-                       // Get anchor\r
-                       lastPos = pos;\r
-                       if (url_str.charAt(pos) == '#') {\r
-                               pos = url_str.length;\r
-                               urlParts.anchor = url_str.substring(lastPos+1, pos);\r
-                       }\r
-               }\r
-\r
-               return urlParts;\r
-       },\r
-\r
-       serializeURL : function(up) {\r
-               var o = "";\r
-\r
-               if (up.protocol)\r
-                       o += up.protocol + "://";\r
-\r
-               if (up.host)\r
-                       o += up.host;\r
-\r
-               if (up.port)\r
-                       o += ":" + up.port;\r
-\r
-               if (up.path)\r
-                       o += up.path;\r
-\r
-               if (up.query)\r
-                       o += "?" + up.query;\r
-\r
-               if (up.anchor)\r
-                       o += "#" + up.anchor;\r
-\r
-               return o;\r
-       },\r
-\r
-       convertAbsoluteURLToRelativeURL : function(base_url, url_to_relative) {\r
-               var baseURL = this.parseURL(base_url), targetURL = this.parseURL(url_to_relative);\r
-               var i, strTok1, strTok2, breakPoint = 0, outPath = "", forceSlash = false;\r
-               var fileName, pos;\r
-\r
-               if (targetURL.path == '')\r
-                       targetURL.path = "/";\r
-               else\r
-                       forceSlash = true;\r
-\r
-               // Crop away last path part\r
-               base_url = baseURL.path.substring(0, baseURL.path.lastIndexOf('/'));\r
-               strTok1 = base_url.split('/');\r
-               strTok2 = targetURL.path.split('/');\r
-\r
-               if (strTok1.length >= strTok2.length) {\r
-                       for (i=0; i<strTok1.length; i++) {\r
-                               if (i >= strTok2.length || strTok1[i] != strTok2[i]) {\r
-                                       breakPoint = i + 1;\r
-                                       break;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               if (strTok1.length < strTok2.length) {\r
-                       for (i=0; i<strTok2.length; i++) {\r
-                               if (i >= strTok1.length || strTok1[i] != strTok2[i]) {\r
-                                       breakPoint = i + 1;\r
-                                       break;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               if (breakPoint == 1)\r
-                       return targetURL.path;\r
-\r
-               for (i=0; i<(strTok1.length-(breakPoint-1)); i++)\r
-                       outPath += "../";\r
-\r
-               for (i=breakPoint-1; i<strTok2.length; i++) {\r
-                       if (i != (breakPoint-1))\r
-                               outPath += "/" + strTok2[i];\r
-                       else\r
-                               outPath += strTok2[i];\r
-               }\r
-\r
-               targetURL.protocol = null;\r
-               targetURL.host = null;\r
-               targetURL.port = null;\r
-               targetURL.path = outPath == '' && forceSlash ? "/" : outPath;\r
-\r
-               // Remove document prefix from local anchors\r
-               fileName = baseURL.path;\r
-\r
-               if ((pos = fileName.lastIndexOf('/')) != -1)\r
-                       fileName = fileName.substring(pos + 1);\r
-\r
-               // Is local anchor\r
-               if (fileName == targetURL.path && targetURL.anchor !== '')\r
-                       targetURL.path = "";\r
-\r
-               // If empty and not local anchor force filename or slash\r
-               if (targetURL.path == '' && !targetURL.anchor)\r
-                       targetURL.path = fileName !== '' ? fileName : "/";\r
-\r
-               return this.serializeURL(targetURL);\r
-       },\r
-\r
-       convertRelativeToAbsoluteURL : function(base_url, relative_url) {\r
-               var baseURL = this.parseURL(base_url), baseURLParts, relURLParts, newRelURLParts, numBack, relURL = this.parseURL(relative_url), i;\r
-               var len, absPath, start, end, newBaseURLParts;\r
-\r
-               if (relative_url == '' || relative_url.indexOf('://') != -1 || /^(mailto:|javascript:|#|\/)/.test(relative_url))\r
-                       return relative_url;\r
-\r
-               // Split parts\r
-               baseURLParts = baseURL.path.split('/');\r
-               relURLParts = relURL.path.split('/');\r
-\r
-               // Remove empty chunks\r
-               newBaseURLParts = [];\r
-               for (i=baseURLParts.length-1; i>=0; i--) {\r
-                       if (baseURLParts[i].length == 0)\r
-                               continue;\r
-\r
-                       newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];\r
-               }\r
-               baseURLParts = newBaseURLParts.reverse();\r
-\r
-               // Merge relURLParts chunks\r
-               newRelURLParts = [];\r
-               numBack = 0;\r
-               for (i=relURLParts.length-1; i>=0; i--) {\r
-                       if (relURLParts[i].length == 0 || relURLParts[i] == ".")\r
-                               continue;\r
-\r
-                       if (relURLParts[i] == '..') {\r
-                               numBack++;\r
-                               continue;\r
-                       }\r
-\r
-                       if (numBack > 0) {\r
-                               numBack--;\r
-                               continue;\r
-                       }\r
-\r
-                       newRelURLParts[newRelURLParts.length] = relURLParts[i];\r
-               }\r
-\r
-               relURLParts = newRelURLParts.reverse();\r
-\r
-               // Remove end from absolute path\r
-               len = baseURLParts.length-numBack;\r
-               absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/');\r
-               start = "";\r
-               end = "";\r
-\r
-               // Build output URL\r
-               relURL.protocol = baseURL.protocol;\r
-               relURL.host = baseURL.host;\r
-               relURL.port = baseURL.port;\r
-\r
-               // Re-add trailing slash if it's removed\r
-               if (relURL.path.charAt(relURL.path.length-1) == "/")\r
-                       absPath += "/";\r
-\r
-               relURL.path = absPath;\r
-\r
-               return this.serializeURL(relURL);\r
-       },\r
-\r
-       convertURL : function(url, node, on_save) {\r
-               var dl = document.location, start, portPart, urlParts, baseUrlParts, tmpUrlParts, curl;\r
-               var prot = dl.protocol, host = dl.hostname, port = dl.port;\r
-\r
-               // Pass through file protocol\r
-               if (prot == "file:")\r
-                       return url;\r
-\r
-               // Something is wrong, remove weirdness\r
-               url = tinyMCE.regexpReplace(url, '(http|https):///', '/');\r
-\r
-               // Mailto link or anchor (Pass through)\r
-               if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || /^[ \t\r\n\+]*[#\?]/.test(url))\r
-                       return url;\r
-\r
-               // Fix relative/Mozilla\r
-               if (!tinyMCE.isIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/')\r
-                       return tinyMCE.settings.base_href + url;\r
-\r
-               // Handle relative URLs\r
-               if (on_save && tinyMCE.getParam('relative_urls')) {\r
-                       curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, url);\r
-                       if (curl.charAt(0) == '/')\r
-                               curl = tinyMCE.settings.document_base_prefix + curl;\r
-\r
-                       urlParts = tinyMCE.parseURL(curl);\r
-                       tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings.document_base_url);\r
-\r
-                       // Force relative\r
-                       if (urlParts.host == tmpUrlParts.host && (urlParts.port == tmpUrlParts.port))\r
-                               return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings.document_base_url, curl);\r
-               }\r
-\r
-               // Handle absolute URLs\r
-               if (!tinyMCE.getParam('relative_urls')) {\r
-                       urlParts = tinyMCE.parseURL(url);\r
-                       baseUrlParts = tinyMCE.parseURL(tinyMCE.settings.base_href);\r
-\r
-                       // Force absolute URLs from relative URLs\r
-                       url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, url);\r
-\r
-                       // If anchor and path is the same page\r
-                       if (urlParts.anchor && urlParts.path == baseUrlParts.path)\r
-                               return "#" + urlParts.anchor;\r
-               }\r
-\r
-               // Remove current domain\r
-               if (tinyMCE.getParam('remove_script_host')) {\r
-                       start = "";\r
-                       portPart = "";\r
-\r
-                       if (port !== '')\r
-                               portPart = ":" + port;\r
-\r
-                       start = prot + "//" + host + portPart + "/";\r
-\r
-                       if (url.indexOf(start) == 0)\r
-                               url = url.substring(start.length-1);\r
-               }\r
-\r
-               return url;\r
-       },\r
-\r
-       convertAllRelativeURLs : function(body) {\r
-               var i, elms, src, href, mhref, msrc;\r
-\r
-               // Convert all image URL:s to absolute URL\r
-               elms = body.getElementsByTagName("img");\r
-               for (i=0; i<elms.length; i++) {\r
-                       src = tinyMCE.getAttrib(elms[i], 'src');\r
-\r
-                       msrc = tinyMCE.getAttrib(elms[i], 'mce_src');\r
-                       if (msrc !== '')\r
-                               src = msrc;\r
-\r
-                       if (src !== '') {\r
-                               src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, src);\r
-                               elms[i].setAttribute("src", src);\r
-                       }\r
-               }\r
-\r
-               // Convert all link URL:s to absolute URL\r
-               elms = body.getElementsByTagName("a");\r
-               for (i=0; i<elms.length; i++) {\r
-                       href = tinyMCE.getAttrib(elms[i], 'href');\r
-\r
-                       mhref = tinyMCE.getAttrib(elms[i], 'mce_href');\r
-                       if (mhref !== '')\r
-                               href = mhref;\r
-\r
-                       if (href && href !== '') {\r
-                               href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, href);\r
-                               elms[i].setAttribute("href", href);\r
-                       }\r
-               }\r
-       }\r
-\r
-       });\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_Array.class.js */\r
-\r
-tinyMCE.add(TinyMCE_Engine, {\r
-       clearArray : function(a) {\r
-               var n;\r
-\r
-               for (n in a)\r
-                       a[n] = null;\r
-\r
-               return a;\r
-       },\r
-\r
-       explode : function(d, s) {\r
-               var ar = s.split(d), oar = [], i;\r
-\r
-               for (i = 0; i<ar.length; i++) {\r
-                       if (ar[i] !== '')\r
-                               oar[oar.length] = ar[i];\r
-               }\r
-\r
-               return oar;\r
-       }\r
-});\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_Event.class.js */\r
-\r
-tinyMCE.add(TinyMCE_Engine, {\r
-       _setEventsEnabled : function(node, state) {\r
-               var evs, x, y, elms, i, event;\r
-               var events = ['onfocus','onblur','onclick','ondblclick',\r
-                                       'onmousedown','onmouseup','onmouseover','onmousemove',\r
-                                       'onmouseout','onkeypress','onkeydown','onkeydown','onkeyup'];\r
-\r
-               evs = tinyMCE.settings.event_elements.split(',');\r
-               for (y=0; y<evs.length; y++){\r
-                       elms = node.getElementsByTagName(evs[y]);\r
-                       for (i=0; i<elms.length; i++) {\r
-                               event = "";\r
-\r
-                               for (x=0; x<events.length; x++) {\r
-                                       if ((event = tinyMCE.getAttrib(elms[i], events[x])) !== '') {\r
-                                               event = tinyMCE.cleanupEventStr("" + event);\r
-\r
-                                               if (!state)\r
-                                                       event = "return true;" + event;\r
-                                               else\r
-                                                       event = event.replace(/^return true;/gi, '');\r
-\r
-                                               elms[i].removeAttribute(events[x]);\r
-                                               elms[i].setAttribute(events[x], event);\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       },\r
-\r
-       _eventPatch : function(editor_id) {\r
-               var n, inst, win, e;\r
-\r
-               // Remove odd, error\r
-               if (typeof(tinyMCE) == "undefined")\r
-                       return true;\r
-\r
-               try {\r
-                       // Try selected instance first\r
-                       if (tinyMCE.selectedInstance) {\r
-                               win = tinyMCE.selectedInstance.getWin();\r
-\r
-                               if (win && win.event) {\r
-                                       e = win.event;\r
-\r
-                                       if (!e.target)\r
-                                               e.target = e.srcElement;\r
-\r
-                                       TinyMCE_Engine.prototype.handleEvent(e);\r
-                                       return;\r
-                               }\r
-                       }\r
-\r
-                       // Search for it\r
-                       for (n in tinyMCE.instances) {\r
-                               inst = tinyMCE.instances[n];\r
-\r
-                               if (!tinyMCE.isInstance(inst))\r
-                                       continue;\r
-\r
-                               inst.select();\r
-                               win = inst.getWin();\r
-\r
-                               if (win && win.event) {\r
-                                       e = win.event;\r
-\r
-                                       if (!e.target)\r
-                                               e.target = e.srcElement;\r
-\r
-                                       TinyMCE_Engine.prototype.handleEvent(e);\r
-                                       return;\r
-                               }\r
-                       }\r
-               } catch (ex) {\r
-                       // Ignore error if iframe is pointing to external URL\r
-               }\r
-       },\r
-\r
-       findEvent : function(e) {\r
-               var n, inst;\r
-\r
-               if (e)\r
-                       return e;\r
-\r
-               for (n in tinyMCE.instances) {\r
-                       inst = tinyMCE.instances[n];\r
-\r
-                       if (tinyMCE.isInstance(inst) && inst.getWin().event)\r
-                               return inst.getWin().event;\r
-               }\r
-\r
-               return null;\r
-       },\r
-\r
-       unloadHandler : function() {\r
-               tinyMCE.triggerSave(true, true);\r
-       },\r
-\r
-       addEventHandlers : function(inst) {\r
-               this.setEventHandlers(inst, 1);\r
-       },\r
-\r
-       setEventHandlers : function(inst, s) {\r
-               var doc = inst.getDoc(), ie, ot, i, f = s ? tinyMCE.addEvent : tinyMCE.removeEvent;\r
-\r
-               ie = ['keypress', 'keyup', 'keydown', 'click', 'mouseup', 'mousedown', 'controlselect', 'dblclick'];\r
-               ot = ['keypress', 'keyup', 'keydown', 'click', 'mouseup', 'mousedown', 'focus', 'blur', 'dragdrop'];\r
-\r
-               inst.switchSettings();\r
-\r
-               if (tinyMCE.isIE) {\r
-                       for (i=0; i<ie.length; i++)\r
-                               f(doc, ie[i], TinyMCE_Engine.prototype._eventPatch);\r
-               } else {\r
-                       for (i=0; i<ot.length; i++)\r
-                               f(doc, ot[i], tinyMCE.handleEvent);\r
-\r
-                       // Force designmode\r
-                       try {\r
-                               doc.designMode = "On";\r
-                       } catch (e) {\r
-                               // Ignore\r
-                       }\r
-               }\r
-       },\r
-\r
-       onMouseMove : function() {\r
-               var inst, lh;\r
-\r
-               // Fix for IE7 bug where it's not restoring hover on anchors correctly\r
-               if (tinyMCE.lastHover) {\r
-                       lh = tinyMCE.lastHover;\r
-\r
-                       // Call out on menus and refresh class on normal buttons\r
-                       if (lh.className.indexOf('mceMenu') != -1)\r
-                               tinyMCE._menuButtonEvent('out', lh);\r
-                       else\r
-                               lh.className = lh.className;\r
-\r
-                       tinyMCE.lastHover = null;\r
-               }\r
-\r
-               if (!tinyMCE.hasMouseMoved) {\r
-                       inst = tinyMCE.selectedInstance;\r
-\r
-                       // Workaround for bug #1437457 (Odd MSIE bug)\r
-                       if (inst.isFocused) {\r
-                               inst.undoBookmark = inst.selection.getBookmark();\r
-                               tinyMCE.hasMouseMoved = true;\r
-                       }\r
-               }\r
-\r
-       //      tinyMCE.cancelEvent(inst.getWin().event);\r
-       //      return false;\r
-       },\r
-\r
-       cancelEvent : function(e) {\r
-               if (!e)\r
-                       return false;\r
-\r
-               if (tinyMCE.isIE) {\r
-                       e.returnValue = false;\r
-                       e.cancelBubble = true;\r
-               } else {\r
-                       e.preventDefault();\r
-                       e.stopPropagation && e.stopPropagation();\r
-               }\r
-\r
-               return false;\r
-       },\r
-\r
-       addEvent : function(o, n, h) {\r
-               // Add cleanup for all non unload events\r
-               if (n != 'unload') {\r
-                       function clean() {\r
-                               var ex;\r
-\r
-                               try {\r
-                                       tinyMCE.removeEvent(o, n, h);\r
-                                       tinyMCE.removeEvent(window, 'unload', clean);\r
-                                       o = n = h = null;\r
-                               } catch (ex) {\r
-                                       // IE may produce access denied exception on unload\r
-                               }\r
-                       }\r
-\r
-                       // Add memory cleaner\r
-                       tinyMCE.addEvent(window, 'unload', clean);\r
-               }\r
-\r
-               if (o.attachEvent)\r
-                       o.attachEvent("on" + n, h);\r
-               else\r
-                       o.addEventListener(n, h, false);\r
-       },\r
-\r
-       removeEvent : function(o, n, h) {\r
-               if (o.detachEvent)\r
-                       o.detachEvent("on" + n, h);\r
-               else\r
-                       o.removeEventListener(n, h, false);\r
-       },\r
-\r
-       addSelectAccessibility : function(e, s, w) {\r
-               // Add event handlers \r
-               if (!s._isAccessible) {\r
-                       s.onkeydown = tinyMCE.accessibleEventHandler;\r
-                       s.onblur = tinyMCE.accessibleEventHandler;\r
-                       s._isAccessible = true;\r
-                       s._win = w;\r
-               }\r
-\r
-               return false;\r
-       },\r
-\r
-       accessibleEventHandler : function(e) {\r
-               var elm, win = this._win;\r
-\r
-               e = tinyMCE.isIE ? win.event : e;\r
-               elm = tinyMCE.isIE ? e.srcElement : e.target;\r
-\r
-               // Unpiggyback onchange on blur\r
-               if (e.type == "blur") {\r
-                       if (elm.oldonchange) {\r
-                               elm.onchange = elm.oldonchange;\r
-                               elm.oldonchange = null;\r
-                       }\r
-\r
-                       return true;\r
-               }\r
-\r
-               // Piggyback onchange\r
-               if (elm.nodeName == "SELECT" && !elm.oldonchange) {\r
-                       elm.oldonchange = elm.onchange;\r
-                       elm.onchange = null;\r
-               }\r
-\r
-               // Execute onchange and remove piggyback\r
-               if (e.keyCode == 13 || e.keyCode == 32) {\r
-                       elm.onchange = elm.oldonchange;\r
-                       elm.onchange();\r
-                       elm.oldonchange = null;\r
-\r
-                       tinyMCE.cancelEvent(e);\r
-                       return false;\r
-               }\r
-\r
-               return true;\r
-       },\r
-\r
-       _resetIframeHeight : function() {\r
-               var ife;\r
-\r
-               if (tinyMCE.isRealIE) {\r
-                       ife = tinyMCE.selectedInstance.iframeElement;\r
-\r
-       /*              if (ife._oldWidth) {\r
-                               ife.style.width = ife._oldWidth;\r
-                               ife.width = ife._oldWidth;\r
-                       }*/\r
-\r
-                       if (ife._oldHeight) {\r
-                               ife.style.height = ife._oldHeight;\r
-                               ife.height = ife._oldHeight;\r
-                       }\r
-               }\r
-       }\r
-\r
-       });\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_Selection.class.js */\r
-\r
-function TinyMCE_Selection(inst) {\r
-       this.instance = inst;\r
-};\r
-\r
-TinyMCE_Selection.prototype = {\r
-       getSelectedHTML : function() {\r
-               var inst = this.instance, e, r = this.getRng(), h;\r
-\r
-               if (!r)\r
-                       return null;\r
-\r
-               e = document.createElement("body");\r
-\r
-               if (r.cloneContents)\r
-                       e.appendChild(r.cloneContents());\r
-               else if (typeof(r.item) != 'undefined' || typeof(r.htmlText) != 'undefined')\r
-                       e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;\r
-               else\r
-                       e.innerHTML = r.toString(); // Failed, use text for now\r
-\r
-               h = tinyMCE._cleanupHTML(inst, inst.contentDocument, inst.settings, e, e, false, true, false);\r
-\r
-               // When editing always use fonts internaly\r
-               //if (tinyMCE.getParam("convert_fonts_to_spans"))\r
-               //      tinyMCE.convertSpansToFonts(inst.getDoc());\r
-\r
-               return h;\r
-       },\r
-\r
-       getSelectedText : function() {\r
-               var inst = this.instance, d, r, s, t;\r
-\r
-               if (tinyMCE.isIE) {\r
-                       d = inst.getDoc();\r
-\r
-                       if (d.selection.type == "Text") {\r
-                               r = d.selection.createRange();\r
-                               t = r.text;\r
-                       } else\r
-                               t = '';\r
-               } else {\r
-                       s = this.getSel();\r
-\r
-                       if (s && s.toString)\r
-                               t = s.toString();\r
-                       else\r
-                               t = '';\r
-               }\r
-\r
-               return t;\r
-       },\r
-\r
-       getBookmark : function(simple) {\r
-               var inst = this.instance, rng = this.getRng(), doc = inst.getDoc(), b = inst.getBody();\r
-               var trng, sx, sy, xx = -999999999, vp = inst.getViewPort();\r
-               var sp, le, s, e, nl, i, si, ei, w;\r
-\r
-               sx = vp.left;\r
-               sy = vp.top;\r
-\r
-               if (simple)\r
-                       return {rng : rng, scrollX : sx, scrollY : sy};\r
-\r
-               if (tinyMCE.isRealIE) {\r
-                       if (rng.item) {\r
-                               e = rng.item(0);\r
-\r
-                               nl = b.getElementsByTagName(e.nodeName);\r
-                               for (i=0; i<nl.length; i++) {\r
-                                       if (e == nl[i]) {\r
-                                               sp = i;\r
-                                               break;\r
-                                       }\r
-                               }\r
-\r
-                               return {\r
-                                       tag : e.nodeName,\r
-                                       index : sp,\r
-                                       scrollX : sx,\r
-                                       scrollY : sy\r
-                               };\r
-                       } else {\r
-                               trng = doc.body.createTextRange();\r
-                               trng.moveToElementText(inst.getBody());\r
-                               trng.collapse(true);\r
-                               bp = Math.abs(trng.move('character', xx));\r
-\r
-                               trng = rng.duplicate();\r
-                               trng.collapse(true);\r
-                               sp = Math.abs(trng.move('character', xx));\r
-\r
-                               trng = rng.duplicate();\r
-                               trng.collapse(false);\r
-                               le = Math.abs(trng.move('character', xx)) - sp;\r
-\r
-                               return {\r
-                                       start : sp - bp,\r
-                                       length : le,\r
-                                       scrollX : sx,\r
-                                       scrollY : sy\r
-                               };\r
-                       }\r
-               } else {\r
-                       s = this.getSel();\r
-                       e = this.getFocusElement();\r
-\r
-                       if (!s)\r
-                               return null;\r
-\r
-                       if (e && e.nodeName == 'IMG') {\r
-                               /*nl = b.getElementsByTagName('IMG');\r
-                               for (i=0; i<nl.length; i++) {\r
-                                       if (e == nl[i]) {\r
-                                               sp = i;\r
-                                               break;\r
-                                       }\r
-                               }*/\r
-\r
-                               return {\r
-                                       start : -1,\r
-                                       end : -1,\r
-                                       index : sp,\r
-                                       scrollX : sx,\r
-                                       scrollY : sy\r
-                               };\r
-                       }\r
-\r
-                       // Caret or selection\r
-                       if (s.anchorNode == s.focusNode && s.anchorOffset == s.focusOffset) {\r
-                               e = this._getPosText(b, s.anchorNode, s.focusNode);\r
-\r
-                               if (!e)\r
-                                       return {scrollX : sx, scrollY : sy};\r
-\r
-                               return {\r
-                                       start : e.start + s.anchorOffset,\r
-                                       end : e.end + s.focusOffset,\r
-                                       scrollX : sx,\r
-                                       scrollY : sy\r
-                               };\r
-                       } else {\r
-                               e = this._getPosText(b, rng.startContainer, rng.endContainer);\r
-\r
-                               if (!e)\r
-                                       return {scrollX : sx, scrollY : sy};\r
-\r
-                               return {\r
-                                       start : e.start + rng.startOffset,\r
-                                       end : e.end + rng.endOffset,\r
-                                       scrollX : sx,\r
-                                       scrollY : sy\r
-                               };\r
-                       }\r
-               }\r
-\r
-               return null;\r
-       },\r
-\r
-       moveToBookmark : function(bookmark) {\r
-               var inst = this.instance, rng, nl, i, ex, b = inst.getBody(), sd;\r
-               var doc = inst.getDoc(), win = inst.getWin(), sel = this.getSel();\r
-\r
-               if (!bookmark)\r
-                       return false;\r
-\r
-               if (tinyMCE.isSafari && bookmark.rng) {\r
-                       sel.setBaseAndExtent(bookmark.rng.startContainer, bookmark.rng.startOffset, bookmark.rng.endContainer, bookmark.rng.endOffset);\r
-                       return true;\r
-               }\r
-\r
-               if (tinyMCE.isRealIE) {\r
-                       if (bookmark.rng) {\r
-                               try {\r
-                                       bookmark.rng.select();\r
-                               } catch (ex) {\r
-                                       // Ignore\r
-                               }\r
-\r
-                               return true;\r
-                       }\r
-\r
-                       win.focus();\r
-\r
-                       if (bookmark.tag) {\r
-                               rng = b.createControlRange();\r
-\r
-                               nl = b.getElementsByTagName(bookmark.tag);\r
-\r
-                               if (nl.length > bookmark.index) {\r
-                                       try {\r
-                                               rng.addElement(nl[bookmark.index]);\r
-                                       } catch (ex) {\r
-                                               // Might be thrown if the node no longer exists\r
-                                       }\r
-                               }\r
-                       } else {\r
-                               // Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs\r
-                               try {\r
-                                       // Incorrect bookmark\r
-                                       if (bookmark.start < 0)\r
-                                               return true;\r
-\r
-                                       rng = inst.getSel().createRange();\r
-                                       rng.moveToElementText(inst.getBody());\r
-                                       rng.collapse(true);\r
-                                       rng.moveStart('character', bookmark.start);\r
-                                       rng.moveEnd('character', bookmark.length);\r
-                               } catch (ex) {\r
-                                       return true;\r
-                               }\r
-                       }\r
-\r
-                       rng.select();\r
-\r
-                       win.scrollTo(bookmark.scrollX, bookmark.scrollY);\r
-                       return true;\r
-               }\r
-\r
-               if (tinyMCE.isGecko || tinyMCE.isOpera) {\r
-                       if (!sel)\r
-                               return false;\r
-\r
-                       if (bookmark.rng) {\r
-                               sel.removeAllRanges();\r
-                               sel.addRange(bookmark.rng);\r
-                       }\r
-\r
-                       if (bookmark.start != -1 && bookmark.end != -1) {\r
-                               try {\r
-                                       sd = this._getTextPos(b, bookmark.start, bookmark.end);\r
-                                       rng = doc.createRange();\r
-                                       rng.setStart(sd.startNode, sd.startOffset);\r
-                                       rng.setEnd(sd.endNode, sd.endOffset);\r
-                                       sel.removeAllRanges();\r
-                                       sel.addRange(rng);\r
-\r
-                                       if (!tinyMCE.isOpera)\r
-                                               win.focus();\r
-                               } catch (ex) {\r
-                                       // Ignore\r
-                               }\r
-                       }\r
-\r
-                       /*\r
-                       if (typeof(bookmark.index) != 'undefined') {\r
-                               tinyMCE.selectElements(b, 'IMG', function (n) {\r
-                                       if (bookmark.index-- == 0) {\r
-                                               // Select image in Gecko here\r
-                                       }\r
-\r
-                                       return false;\r
-                               });\r
-                       }\r
-                       */\r
-\r
-                       win.scrollTo(bookmark.scrollX, bookmark.scrollY);\r
-                       return true;\r
-               }\r
-\r
-               return false;\r
-       },\r
-\r
-       _getPosText : function(r, sn, en) {\r
-               var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};\r
-\r
-               while ((n = w.nextNode()) != null) {\r
-                       if (n == sn)\r
-                               d.start = p;\r
-\r
-                       if (n == en) {\r
-                               d.end = p;\r
-                               return d;\r
-                       }\r
-\r
-                       p += n.nodeValue ? n.nodeValue.length : 0;\r
-               }\r
-\r
-               return null;\r
-       },\r
-\r
-       _getTextPos : function(r, sp, ep) {\r
-               var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};\r
-\r
-               while ((n = w.nextNode()) != null) {\r
-                       p += n.nodeValue ? n.nodeValue.length : 0;\r
-\r
-                       if (p >= sp && !d.startNode) {\r
-                               d.startNode = n;\r
-                               d.startOffset = sp - (p - n.nodeValue.length);\r
-                       }\r
-\r
-                       if (p >= ep) {\r
-                               d.endNode = n;\r
-                               d.endOffset = ep - (p - n.nodeValue.length);\r
-\r
-                               return d;\r
-                       }\r
-               }\r
-\r
-               return null;\r
-       },\r
-\r
-       selectNode : function(node, collapse, select_text_node, to_start) {\r
-               var inst = this.instance, sel, rng, nodes;\r
-\r
-               if (!node)\r
-                       return;\r
-\r
-               if (typeof(collapse) == "undefined")\r
-                       collapse = true;\r
-\r
-               if (typeof(select_text_node) == "undefined")\r
-                       select_text_node = false;\r
-\r
-               if (typeof(to_start) == "undefined")\r
-                       to_start = true;\r
-\r
-               if (inst.settings.auto_resize)\r
-                       inst.resizeToContent();\r
-\r
-               if (tinyMCE.isRealIE) {\r
-                       rng = inst.getDoc().body.createTextRange();\r
-\r
-                       try {\r
-                               rng.moveToElementText(node);\r
-\r
-                               if (collapse)\r
-                                       rng.collapse(to_start);\r
-\r
-                               rng.select();\r
-                       } catch (e) {\r
-                               // Throws illigal agrument in MSIE some times\r
-                       }\r
-               } else {\r
-                       sel = this.getSel();\r
-\r
-                       if (!sel)\r
-                               return;\r
-\r
-                       if (tinyMCE.isSafari) {\r
-                               sel.setBaseAndExtent(node, 0, node, node.innerText.length);\r
-\r
-                               if (collapse) {\r
-                                       if (to_start)\r
-                                               sel.collapseToStart();\r
-                                       else\r
-                                               sel.collapseToEnd();\r
-                               }\r
-\r
-                               this.scrollToNode(node);\r
-\r
-                               return;\r
-                       }\r
-\r
-                       rng = inst.getDoc().createRange();\r
-\r
-                       if (select_text_node) {\r
-                               // Find first textnode in tree\r
-                               nodes = tinyMCE.getNodeTree(node, [], 3);\r
-                               if (nodes.length > 0)\r
-                                       rng.selectNodeContents(nodes[0]);\r
-                               else\r
-                                       rng.selectNodeContents(node);\r
-                       } else\r
-                               rng.selectNode(node);\r
-\r
-                       if (collapse) {\r
-                               // Special treatment of textnode collapse\r
-                               if (!to_start && node.nodeType == 3) {\r
-                                       rng.setStart(node, node.nodeValue.length);\r
-                                       rng.setEnd(node, node.nodeValue.length);\r
-                               } else\r
-                                       rng.collapse(to_start);\r
-                       }\r
-\r
-                       sel.removeAllRanges();\r
-                       sel.addRange(rng);\r
-               }\r
-\r
-               this.scrollToNode(node);\r
-\r
-               // Set selected element\r
-               tinyMCE.selectedElement = null;\r
-               if (node.nodeType == 1)\r
-                       tinyMCE.selectedElement = node;\r
-       },\r
-\r
-       scrollToNode : function(node) {\r
-               var inst = this.instance, w = inst.getWin(), vp = inst.getViewPort(), pos = tinyMCE.getAbsPosition(node), cvp, p, cwin;\r
-\r
-               // Only scroll if out of visible area\r
-               if (pos.absLeft < vp.left || pos.absLeft > vp.left + vp.width || pos.absTop < vp.top || pos.absTop > vp.top + (vp.height-25))\r
-                       w.scrollTo(pos.absLeft, pos.absTop - vp.height + 25);\r
-\r
-               // Scroll container window\r
-               if (inst.settings.auto_resize) {\r
-                       cwin = inst.getContainerWin();\r
-                       cvp = tinyMCE.getViewPort(cwin);\r
-                       p = this.getAbsPosition(node);\r
-\r
-                       if (p.absLeft < cvp.left || p.absLeft > cvp.left + cvp.width || p.absTop < cvp.top || p.absTop > cvp.top + cvp.height)\r
-                               cwin.scrollTo(p.absLeft, p.absTop - cvp.height + 25);\r
-               }\r
-       },\r
-\r
-       getAbsPosition : function(n) {\r
-               var pos = tinyMCE.getAbsPosition(n), ipos = tinyMCE.getAbsPosition(this.instance.iframeElement);\r
-\r
-               return {\r
-                       absLeft : ipos.absLeft + pos.absLeft,\r
-                       absTop : ipos.absTop + pos.absTop\r
-               };\r
-       },\r
-\r
-       getSel : function() {\r
-               var inst = this.instance;\r
-\r
-               if (tinyMCE.isRealIE)\r
-                       return inst.getDoc().selection;\r
-\r
-               return inst.contentWindow.getSelection();\r
-       },\r
-\r
-       getRng : function() {\r
-               var s = this.getSel();\r
-\r
-               if (s == null)\r
-                       return null;\r
-\r
-               if (tinyMCE.isRealIE)\r
-                       return s.createRange();\r
-\r
-               if (tinyMCE.isSafari && !s.getRangeAt)\r
-                       return '' + window.getSelection();\r
-\r
-               if (s.rangeCount > 0)\r
-                       return s.getRangeAt(0);\r
-\r
-               return null;\r
-       },\r
-\r
-       isCollapsed : function() {\r
-               var r = this.getRng();\r
-\r
-               if (r.item)\r
-                       return false;\r
-\r
-               return r.boundingWidth == 0 || this.getSel().isCollapsed;\r
-       },\r
-\r
-       collapse : function(b) {\r
-               var r = this.getRng(), s = this.getSel();\r
-\r
-               if (r.select) {\r
-                       r.collapse(b);\r
-                       r.select();\r
-               } else {\r
-                       if (b)\r
-                               s.collapseToStart();\r
-                       else\r
-                               s.collapseToEnd();\r
-               }\r
-       },\r
-\r
-       getFocusElement : function() {\r
-               var inst = this.instance, doc, rng, sel, elm;\r
-\r
-               if (tinyMCE.isRealIE) {\r
-                       doc = inst.getDoc();\r
-                       rng = doc.selection.createRange();\r
-\r
-       //              if (rng.collapse)\r
-       //                      rng.collapse(true);\r
-\r
-                       elm = rng.item ? rng.item(0) : rng.parentElement();\r
-               } else {\r
-                       if (!tinyMCE.isSafari && inst.isHidden())\r
-                               return inst.getBody();\r
-\r
-                       sel = this.getSel();\r
-                       rng = this.getRng();\r
-\r
-                       if (!sel || !rng)\r
-                               return null;\r
-\r
-                       elm = rng.commonAncestorContainer;\r
-                       //elm = (sel && sel.anchorNode) ? sel.anchorNode : null;\r
-\r
-                       // Handle selection a image or other control like element such as anchors\r
-                       if (!rng.collapsed) {\r
-                               // Is selection small\r
-                               if (rng.startContainer == rng.endContainer) {\r
-                                       if (rng.startOffset - rng.endOffset < 2) {\r
-                                               if (rng.startContainer.hasChildNodes())\r
-                                                       elm = rng.startContainer.childNodes[rng.startOffset];\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       // Get the element parent of the node\r
-                       elm = tinyMCE.getParentElement(elm);\r
-\r
-                       //if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")\r
-                       //      elm = tinyMCE.selectedElement;\r
-               }\r
-\r
-               return elm;\r
-       }\r
-\r
-       };\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_UndoRedo.class.js */\r
-\r
-function TinyMCE_UndoRedo(inst) {\r
-       this.instance = inst;\r
-       this.undoLevels = [];\r
-       this.undoIndex = 0;\r
-       this.typingUndoIndex = -1;\r
-       this.undoRedo = true;\r
-};\r
-\r
-TinyMCE_UndoRedo.prototype = {\r
-       add : function(l) {\r
-               var b, customUndoLevels, newHTML, inst = this.instance, i, ul, ur;\r
-\r
-               if (l) {\r
-                       this.undoLevels[this.undoLevels.length] = l;\r
-                       return true;\r
-               }\r
-\r
-               if (this.typingUndoIndex != -1) {\r
-                       this.undoIndex = this.typingUndoIndex;\r
-\r
-                       if (tinyMCE.typingUndoIndex != -1)\r
-                               tinyMCE.undoIndex = tinyMCE.typingUndoIndex;\r
-               }\r
-\r
-               newHTML = tinyMCE.trim(inst.getBody().innerHTML);\r
-               if (this.undoLevels[this.undoIndex] && newHTML != this.undoLevels[this.undoIndex].content) {\r
-                       //tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex].content);\r
-\r
-                       // Is dirty again\r
-                       inst.isNotDirty = false;\r
-\r
-                       tinyMCE.dispatchCallback(inst, 'onchange_callback', 'onChange', inst);\r
-\r
-                       // Time to compress\r
-                       customUndoLevels = tinyMCE.settings.custom_undo_redo_levels;\r
-                       if (customUndoLevels != -1 && this.undoLevels.length > customUndoLevels) {\r
-                               for (i=0; i<this.undoLevels.length-1; i++)\r
-                                       this.undoLevels[i] = this.undoLevels[i+1];\r
-\r
-                               this.undoLevels.length--;\r
-                               this.undoIndex--;\r
-\r
-                               // Todo: Implement global undo/redo logic here\r
-                       }\r
-\r
-                       b = inst.undoBookmark;\r
-\r
-                       if (!b)\r
-                               b = inst.selection.getBookmark();\r
-\r
-                       this.undoIndex++;\r
-                       this.undoLevels[this.undoIndex] = {\r
-                               content : newHTML,\r
-                               bookmark : b\r
-                       };\r
-\r
-                       // Remove all above from global undo/redo\r
-                       ul = tinyMCE.undoLevels;\r
-                       for (i=tinyMCE.undoIndex + 1; i<ul.length; i++) {\r
-                               ur = ul[i].undoRedo;\r
-\r
-                               if (ur.undoIndex == ur.undoLevels.length -1)\r
-                                       ur.undoIndex--;\r
-\r
-                               ur.undoLevels.length--;\r
-                       }\r
-\r
-                       // Add global undo level\r
-                       tinyMCE.undoLevels[tinyMCE.undoIndex++] = inst;\r
-                       tinyMCE.undoLevels.length = tinyMCE.undoIndex;\r
-\r
-                       this.undoLevels.length = this.undoIndex + 1;\r
-\r
-                       return true;\r
-               }\r
-\r
-               return false;\r
-       },\r
-\r
-       undo : function() {\r
-               var inst = this.instance;\r
-\r
-               // Do undo\r
-               if (this.undoIndex > 0) {\r
-                       this.undoIndex--;\r
-\r
-                       tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content);\r
-                       inst.repaint();\r
-\r
-                       if (inst.settings.custom_undo_redo_restore_selection)\r
-                               inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);\r
-               }\r
-       },\r
-\r
-       redo : function() {\r
-               var inst = this.instance;\r
-\r
-               tinyMCE.execCommand("mceEndTyping");\r
-\r
-               if (this.undoIndex < (this.undoLevels.length-1)) {\r
-                       this.undoIndex++;\r
-\r
-                       tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content);\r
-                       inst.repaint();\r
-\r
-                       if (inst.settings.custom_undo_redo_restore_selection)\r
-                               inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);\r
-               }\r
-\r
-               tinyMCE.triggerNodeChange();\r
-       }\r
-\r
-       };\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_ForceParagraphs.class.js */\r
-\r
-var TinyMCE_ForceParagraphs = {\r
-       _insertPara : function(inst, e) {\r
-               var doc = inst.getDoc(), sel = inst.getSel(), body = inst.getBody(), win = inst.contentWindow, rng = sel.getRangeAt(0);\r
-               var rootElm = doc.documentElement, blockName = "P", startNode, endNode, startBlock, endBlock;\r
-               var rngBefore, rngAfter, direct, startNode, startOffset, endNode, endOffset, b = tinyMCE.isOpera ? inst.selection.getBookmark() : null;\r
-               var paraBefore, paraAfter, startChop, endChop, contents, i;\r
-\r
-               function isEmpty(para) {\r
-                       var nodes;\r
-\r
-                       function isEmptyHTML(html) {\r
-                               return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == '';\r
-                       }\r
-\r
-                       // Check for images\r
-                       if (para.getElementsByTagName("img").length > 0)\r
-                               return false;\r
-\r
-                       // Check for tables\r
-                       if (para.getElementsByTagName("table").length > 0)\r
-                               return false;\r
-\r
-                       // Check for HRs\r
-                       if (para.getElementsByTagName("hr").length > 0)\r
-                               return false;\r
-\r
-                       // Check all textnodes\r
-                       nodes = tinyMCE.getNodeTree(para, [], 3);\r
-                       for (i=0; i<nodes.length; i++) {\r
-                               if (!isEmptyHTML(nodes[i].nodeValue))\r
-                                       return false;\r
-                       }\r
-\r
-                       // No images, no tables, no hrs, no text content then it's empty\r
-                       return true;\r
-               }\r
-\r
-       //      tinyMCE.debug(body.innerHTML);\r
-\r
-       //      debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());\r
-\r
-               // Setup before range\r
-               rngBefore = doc.createRange();\r
-               rngBefore.setStart(sel.anchorNode, sel.anchorOffset);\r
-               rngBefore.collapse(true);\r
-\r
-               // Setup after range\r
-               rngAfter = doc.createRange();\r
-               rngAfter.setStart(sel.focusNode, sel.focusOffset);\r
-               rngAfter.collapse(true);\r
-\r
-               // Setup start/end points\r
-               direct = rngBefore.compareBoundaryPoints(rngBefore.START_TO_END, rngAfter) < 0;\r
-               startNode = direct ? sel.anchorNode : sel.focusNode;\r
-               startOffset = direct ? sel.anchorOffset : sel.focusOffset;\r
-               endNode = direct ? sel.focusNode : sel.anchorNode;\r
-               endOffset = direct ? sel.focusOffset : sel.anchorOffset;\r
-\r
-               startNode = startNode.nodeName == "BODY" ? startNode.firstChild : startNode;\r
-               endNode = endNode.nodeName == "BODY" ? endNode.firstChild : endNode;\r
-\r
-               // Get block elements\r
-               startBlock = inst.getParentBlockElement(startNode);\r
-               endBlock = inst.getParentBlockElement(endNode);\r
-\r
-               // If absolute force paragraph generation within\r
-               if (startBlock && (startBlock.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(startBlock.style.position)))\r
-                       startBlock = null;\r
-\r
-               if (endBlock && (endBlock.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(endBlock.style.position)))\r
-                       endBlock = null;\r
-\r
-               // Use current block name\r
-               if (startBlock != null) {\r
-                       blockName = startBlock.nodeName;\r
-\r
-                       // Use P instead\r
-                       if (/(TD|TABLE|TH|CAPTION)/.test(blockName) || (blockName == "DIV" && /left|right/gi.test(startBlock.style.cssFloat)))\r
-                               blockName = "P";\r
-               }\r
-\r
-               // Within a list use normal behaviour\r
-               if (tinyMCE.getParentElement(startBlock, "OL,UL", null, body) != null)\r
-                       return false;\r
-\r
-               // Within a table create new paragraphs\r
-               if ((startBlock != null && startBlock.nodeName == "TABLE") || (endBlock != null && endBlock.nodeName == "TABLE"))\r
-                       startBlock = endBlock = null;\r
-\r
-               // Setup new paragraphs\r
-               paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);\r
-               paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);\r
-\r
-               // Is header, then force paragraph under\r
-               if (/^(H[1-6])$/.test(blockName))\r
-                       paraAfter = doc.createElement("p");\r
-\r
-               // Setup chop nodes\r
-               startChop = startNode;\r
-               endChop = endNode;\r
-\r
-               // Get startChop node\r
-               node = startChop;\r
-               do {\r
-                       if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))\r
-                               break;\r
-\r
-                       startChop = node;\r
-               } while ((node = node.previousSibling ? node.previousSibling : node.parentNode));\r
-\r
-               // Get endChop node\r
-               node = endChop;\r
-               do {\r
-                       if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))\r
-                               break;\r
-\r
-                       endChop = node;\r
-               } while ((node = node.nextSibling ? node.nextSibling : node.parentNode));\r
-\r
-               // Fix when only a image is within the TD\r
-               if (startChop.nodeName == "TD")\r
-                       startChop = startChop.firstChild;\r
-\r
-               if (endChop.nodeName == "TD")\r
-                       endChop = endChop.lastChild;\r
-\r
-               // If not in a block element\r
-               if (startBlock == null) {\r
-                       // Delete selection\r
-                       rng.deleteContents();\r
-\r
-                       if (!tinyMCE.isSafari)\r
-                               sel.removeAllRanges();\r
-\r
-                       if (startChop != rootElm && endChop != rootElm) {\r
-                               // Insert paragraph before\r
-                               rngBefore = rng.cloneRange();\r
-\r
-                               if (startChop == body)\r
-                                       rngBefore.setStart(startChop, 0);\r
-                               else\r
-                                       rngBefore.setStartBefore(startChop);\r
-\r
-                               paraBefore.appendChild(rngBefore.cloneContents());\r
-\r
-                               // Insert paragraph after\r
-                               if (endChop.parentNode.nodeName == blockName)\r
-                                       endChop = endChop.parentNode;\r
-\r
-                               // If not after image\r
-                               //if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")\r
-                                       rng.setEndAfter(endChop);\r
-\r
-                               if (endChop.nodeName != "#text" && endChop.nodeName != "BODY")\r
-                                       rngBefore.setEndAfter(endChop);\r
-\r
-                               contents = rng.cloneContents();\r
-                               if (contents.firstChild && (contents.firstChild.nodeName == blockName || contents.firstChild.nodeName == "BODY"))\r
-                                       paraAfter.innerHTML = contents.firstChild.innerHTML;\r
-                               else\r
-                                       paraAfter.appendChild(contents);\r
-\r
-                               // Check if it's a empty paragraph\r
-                               if (isEmpty(paraBefore))\r
-                                       paraBefore.innerHTML = "&nbsp;";\r
-\r
-                               // Check if it's a empty paragraph\r
-                               if (isEmpty(paraAfter))\r
-                                       paraAfter.innerHTML = "&nbsp;";\r
-\r
-                               // Delete old contents\r
-                               rng.deleteContents();\r
-                               rngAfter.deleteContents();\r
-                               rngBefore.deleteContents();\r
-\r
-                               // Insert new paragraphs\r
-                               if (tinyMCE.isOpera) {\r
-                                       paraBefore.normalize();\r
-                                       rngBefore.insertNode(paraBefore);\r
-                                       paraAfter.normalize();\r
-                                       rngBefore.insertNode(paraAfter);\r
-                               } else {\r
-                                       paraAfter.normalize();\r
-                                       rngBefore.insertNode(paraAfter);\r
-                                       paraBefore.normalize();\r
-                                       rngBefore.insertNode(paraBefore);\r
-                               }\r
-\r
-                               //tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);\r
-                       } else {\r
-                               body.innerHTML = "<" + blockName + ">&nbsp;</" + blockName + "><" + blockName + ">&nbsp;</" + blockName + ">";\r
-                               paraAfter = body.childNodes[1];\r
-                       }\r
-\r
-                       inst.selection.moveToBookmark(b);\r
-                       inst.selection.selectNode(paraAfter, true, true);\r
-\r
-                       return true;\r
-               }\r
-\r
-               // Place first part within new paragraph\r
-               if (startChop.nodeName == blockName)\r
-                       rngBefore.setStart(startChop, 0);\r
-               else\r
-                       rngBefore.setStartBefore(startChop);\r
-\r
-               rngBefore.setEnd(startNode, startOffset);\r
-               paraBefore.appendChild(rngBefore.cloneContents());\r
-\r
-               // Place secound part within new paragraph\r
-               rngAfter.setEndAfter(endChop);\r
-               rngAfter.setStart(endNode, endOffset);\r
-               contents = rngAfter.cloneContents();\r
-\r
-               if (contents.firstChild && contents.firstChild.nodeName == blockName) {\r
-       /*              var nodes = contents.firstChild.childNodes;\r
-                       for (i=0; i<nodes.length; i++) {\r
-                               //tinyMCE.debug(nodes[i].nodeName);\r
-                               if (nodes[i].nodeName != "BODY")\r
-                                       paraAfter.appendChild(nodes[i]);\r
-                       }\r
-       */\r
-                       paraAfter.innerHTML = contents.firstChild.innerHTML;\r
-               } else\r
-                       paraAfter.appendChild(contents);\r
-\r
-               // Check if it's a empty paragraph\r
-               if (isEmpty(paraBefore))\r
-                       paraBefore.innerHTML = "&nbsp;";\r
-\r
-               // Check if it's a empty paragraph\r
-               if (isEmpty(paraAfter))\r
-                       paraAfter.innerHTML = "&nbsp;";\r
-\r
-               // Create a range around everything\r
-               rng = doc.createRange();\r
-\r
-               if (!startChop.previousSibling && startChop.parentNode.nodeName.toUpperCase() == blockName) {\r
-                       rng.setStartBefore(startChop.parentNode);\r
-               } else {\r
-                       if (rngBefore.startContainer.nodeName.toUpperCase() == blockName && rngBefore.startOffset == 0)\r
-                               rng.setStartBefore(rngBefore.startContainer);\r
-                       else\r
-                               rng.setStart(rngBefore.startContainer, rngBefore.startOffset);\r
-               }\r
-\r
-               if (!endChop.nextSibling && endChop.parentNode.nodeName.toUpperCase() == blockName)\r
-                       rng.setEndAfter(endChop.parentNode);\r
-               else\r
-                       rng.setEnd(rngAfter.endContainer, rngAfter.endOffset);\r
-\r
-               // Delete all contents and insert new paragraphs\r
-               rng.deleteContents();\r
-\r
-               if (tinyMCE.isOpera) {\r
-                       rng.insertNode(paraBefore);\r
-                       rng.insertNode(paraAfter);\r
-               } else {\r
-                       rng.insertNode(paraAfter);\r
-                       rng.insertNode(paraBefore);\r
-               }\r
-\r
-               //tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);\r
-\r
-               // Normalize\r
-               paraAfter.normalize();\r
-               paraBefore.normalize();\r
-\r
-               inst.selection.moveToBookmark(b);\r
-               inst.selection.selectNode(paraAfter, true, true);\r
-\r
-               return true;\r
-       },\r
-\r
-       _handleBackSpace : function(inst) {\r
-               var r = inst.getRng(), sn = r.startContainer, nv, s = false;\r
-\r
-               // Added body check for bug #1527787\r
-               if (sn && sn.nextSibling && sn.nextSibling.nodeName == "BR" && sn.parentNode.nodeName != "BODY") {\r
-                       nv = sn.nodeValue;\r
-\r
-                       // Handle if a backspace is pressed after a space character #bug 1466054 removed since fix for #1527787\r
-                       /*if (nv != null && nv.length >= r.startOffset && nv.charAt(r.startOffset - 1) == ' ')\r
-                               s = true;*/\r
-\r
-                       // Only remove BRs if we are at the end of line #bug 1464152\r
-                       if (nv != null && r.startOffset == nv.length)\r
-                               sn.nextSibling.parentNode.removeChild(sn.nextSibling);\r
-               }\r
-\r
-               if (inst.settings.auto_resize)\r
-                       inst.resizeToContent();\r
-\r
-               return s;\r
-       }\r
-\r
-       };\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_Layer.class.js */\r
-\r
-function TinyMCE_Layer(id, bm) {\r
-       this.id = id;\r
-       this.blockerElement = null;\r
-       this.events = false;\r
-       this.element = null;\r
-       this.blockMode = typeof(bm) != 'undefined' ? bm : true;\r
-       this.doc = document;\r
-};\r
-\r
-TinyMCE_Layer.prototype = {\r
-       moveRelativeTo : function(re, p) {\r
-               var rep = this.getAbsPosition(re), e = this.getElement(), x, y;\r
-               var w = parseInt(re.offsetWidth), h = parseInt(re.offsetHeight);\r
-               var ew = parseInt(e.offsetWidth), eh = parseInt(e.offsetHeight);\r
-\r
-               switch (p) {\r
-                       case "tl":\r
-                               x = rep.absLeft;\r
-                               y = rep.absTop;\r
-                               break;\r
-\r
-                       case "tr":\r
-                               x = rep.absLeft + w;\r
-                               y = rep.absTop;\r
-                               break;\r
-\r
-                       case "bl":\r
-                               x = rep.absLeft;\r
-                               y = rep.absTop + h;\r
-                               break;\r
-\r
-                       case "br":\r
-                               x = rep.absLeft + w;\r
-                               y = rep.absTop + h;\r
-                               break;\r
-\r
-                       case "cc":\r
-                               x = rep.absLeft + (w / 2) - (ew / 2);\r
-                               y = rep.absTop + (h / 2) - (eh / 2);\r
-                               break;\r
-               }\r
-\r
-               this.moveTo(x, y);\r
-       },\r
-\r
-       moveBy : function(x, y) {\r
-               var e = this.getElement();\r
-               this.moveTo(parseInt(e.style.left) + x, parseInt(e.style.top) + y);\r
-       },\r
-\r
-       moveTo : function(x, y) {\r
-               var e = this.getElement();\r
-\r
-               e.style.left = x + "px";\r
-               e.style.top = y + "px";\r
-\r
-               this.updateBlocker();\r
-       },\r
-\r
-       resizeBy : function(w, h) {\r
-               var e = this.getElement();\r
-               this.resizeTo(parseInt(e.style.width) + w, parseInt(e.style.height) + h);\r
-       },\r
-\r
-       resizeTo : function(w, h) {\r
-               var e = this.getElement();\r
-\r
-               if (w != null)\r
-                       e.style.width = w + "px";\r
-\r
-               if (h != null)\r
-                       e.style.height = h + "px";\r
-\r
-               this.updateBlocker();\r
-       },\r
-\r
-       show : function() {\r
-               var el = this.getElement();\r
-\r
-               if (el) {\r
-                       el.style.display = 'block';\r
-                       this.updateBlocker();\r
-               }\r
-       },\r
-\r
-       hide : function() {\r
-               var el = this.getElement();\r
-\r
-               if (el) {\r
-                       el.style.display = 'none';\r
-                       this.updateBlocker();\r
-               }\r
-       },\r
-\r
-       isVisible : function() {\r
-               return this.getElement().style.display == 'block';\r
-       },\r
-\r
-       getElement : function() {\r
-               if (!this.element)\r
-                       this.element = this.doc.getElementById(this.id);\r
-\r
-               return this.element;\r
-       },\r
-\r
-       setBlockMode : function(s) {\r
-               this.blockMode = s;\r
-       },\r
-\r
-       updateBlocker : function() {\r
-               var e, b, x, y, w, h;\r
-\r
-               b = this.getBlocker();\r
-               if (b) {\r
-                       if (this.blockMode) {\r
-                               e = this.getElement();\r
-                               x = this.parseInt(e.style.left);\r
-                               y = this.parseInt(e.style.top);\r
-                               w = this.parseInt(e.offsetWidth);\r
-                               h = this.parseInt(e.offsetHeight);\r
-\r
-                               b.style.left = x + 'px';\r
-                               b.style.top = y + 'px';\r
-                               b.style.width = w + 'px';\r
-                               b.style.height = h + 'px';\r
-                               b.style.display = e.style.display;\r
-                       } else\r
-                               b.style.display = 'none';\r
-               }\r
-       },\r
-\r
-       getBlocker : function() {\r
-               var d, b;\r
-\r
-               if (!this.blockerElement && this.blockMode) {\r
-                       d = this.doc;\r
-                       b = d.getElementById(this.id + "_blocker");\r
-\r
-                       if (!b) {\r
-                               b = d.createElement("iframe");\r
-\r
-                               b.setAttribute('id', this.id + "_blocker");\r
-                               b.style.cssText = 'display: none; position: absolute; left: 0; top: 0';\r
-                               b.src = 'javascript:false;';\r
-                               b.frameBorder = '0';\r
-                               b.scrolling = 'no';\r
-       \r
-                               d.body.appendChild(b);\r
-                       }\r
-\r
-                       this.blockerElement = b;\r
-               }\r
-\r
-               return this.blockerElement;\r
-       },\r
-\r
-       getAbsPosition : function(n) {\r
-               var p = {absLeft : 0, absTop : 0};\r
-\r
-               while (n) {\r
-                       p.absLeft += n.offsetLeft;\r
-                       p.absTop += n.offsetTop;\r
-                       n = n.offsetParent;\r
-               }\r
-\r
-               return p;\r
-       },\r
-\r
-       create : function(n, c, p, h) {\r
-               var d = this.doc, e = d.createElement(n);\r
-\r
-               e.setAttribute('id', this.id);\r
-\r
-               if (c)\r
-                       e.className = c;\r
-\r
-               if (!p)\r
-                       p = d.body;\r
-\r
-               if (h)\r
-                       e.innerHTML = h;\r
-\r
-               p.appendChild(e);\r
-\r
-               return this.element = e;\r
-       },\r
-\r
-       exists : function() {\r
-               return this.doc.getElementById(this.id) != null;\r
-       },\r
-\r
-       parseInt : function(s) {\r
-               if (s == null || s == '')\r
-                       return 0;\r
-\r
-               return parseInt(s);\r
-       },\r
-\r
-       remove : function() {\r
-               var e = this.getElement(), b = this.getBlocker();\r
-\r
-               if (e)\r
-                       e.parentNode.removeChild(e);\r
-\r
-               if (b)\r
-                       b.parentNode.removeChild(b);\r
-       }\r
-\r
-       };\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_Menu.class.js */\r
-\r
-function TinyMCE_Menu() {\r
-       var id;\r
-\r
-       if (typeof(tinyMCE.menuCounter) == "undefined")\r
-               tinyMCE.menuCounter = 0;\r
-\r
-       id = "mc_menu_" + tinyMCE.menuCounter++;\r
-\r
-       TinyMCE_Layer.call(this, id, true);\r
-\r
-       this.id = id;\r
-       this.items = [];\r
-       this.needsUpdate = true;\r
-};\r
-\r
-TinyMCE_Menu.prototype = tinyMCE.extend(TinyMCE_Layer.prototype, {\r
-       init : function(s) {\r
-               var n;\r
-\r
-               // Default params\r
-               this.settings = {\r
-                       separator_class : 'mceMenuSeparator',\r
-                       title_class : 'mceMenuTitle',\r
-                       disabled_class : 'mceMenuDisabled',\r
-                       menu_class : 'mceMenu',\r
-                       drop_menu : true\r
-               };\r
-\r
-               for (n in s)\r
-                       this.settings[n] = s[n];\r
-\r
-               this.create('div', this.settings.menu_class);\r
-       },\r
-\r
-       clear : function() {\r
-               this.items = [];\r
-       },\r
-\r
-       addTitle : function(t) {\r
-               this.add({type : 'title', text : t});\r
-       },\r
-\r
-       addDisabled : function(t) {\r
-               this.add({type : 'disabled', text : t});\r
-       },\r
-\r
-       addSeparator : function() {\r
-               this.add({type : 'separator'});\r
-       },\r
-\r
-       addItem : function(t, js) {\r
-               this.add({text : t, js : js});\r
-       },\r
-\r
-       add : function(mi) {\r
-               this.items[this.items.length] = mi;\r
-               this.needsUpdate = true;\r
-       },\r
-\r
-       update : function() {\r
-               var e = this.getElement(), h = '', i, t, m = this.items, s = this.settings;\r
-\r
-               if (this.settings.drop_menu)\r
-                       h += '<span class="mceMenuLine"></span>';\r
-\r
-               h += '<table border="0" cellpadding="0" cellspacing="0">';\r
-\r
-               for (i=0; i<m.length; i++) {\r
-                       t = tinyMCE.xmlEncode(m[i].text);\r
-                       c = m[i].class_name ? ' class="' + m[i].class_name + '"' : '';\r
-\r
-                       switch (m[i].type) {\r
-                               case 'separator':\r
-                                       h += '<tr class="' + s.separator_class + '"><td>';\r
-                                       break;\r
-\r
-                               case 'title':\r
-                                       h += '<tr class="' + s.title_class + '"><td><span' + c +'>' + t + '</span>';\r
-                                       break;\r
-\r
-                               case 'disabled':\r
-                                       h += '<tr class="' + s.disabled_class + '"><td><span' + c +'>' + t + '</span>';\r
-                                       break;\r
-\r
-                               default:\r
-                                       h += '<tr><td><a href="' + tinyMCE.xmlEncode(m[i].js) + '" onmousedown="' + tinyMCE.xmlEncode(m[i].js) + ';return tinyMCE.cancelEvent(event);" onclick="return tinyMCE.cancelEvent(event);" onmouseup="return tinyMCE.cancelEvent(event);"><span' + c +'>' + t + '</span></a>';\r
-                       }\r
-\r
-                       h += '</td></tr>';\r
-               }\r
-\r
-               h += '</table>';\r
-\r
-               e.innerHTML = h;\r
-\r
-               this.needsUpdate = false;\r
-               this.updateBlocker();\r
-       },\r
-\r
-       show : function() {\r
-               var nl, i;\r
-\r
-               if (tinyMCE.lastMenu == this)\r
-                       return;\r
-\r
-               if (this.needsUpdate)\r
-                       this.update();\r
-\r
-               if (tinyMCE.lastMenu && tinyMCE.lastMenu != this)\r
-                       tinyMCE.lastMenu.hide();\r
-\r
-               TinyMCE_Layer.prototype.show.call(this);\r
-\r
-               if (!tinyMCE.isOpera) {\r
-                       // Accessibility stuff\r
-/*                     nl = this.getElement().getElementsByTagName("a");\r
-                       if (nl.length > 0)\r
-                               nl[0].focus();*/\r
-               }\r
-\r
-               tinyMCE.lastMenu = this;\r
-       }\r
-\r
-       });\r
-\r
-/* file:jscripts/tiny_mce/classes/TinyMCE_Debug.class.js */\r
-\r
-tinyMCE.add(TinyMCE_Engine, {\r
-       debug : function() {\r
-               var m = "", a, i, l = tinyMCE.log.length;\r
-\r
-               for (i=0, a = this.debug.arguments; i<a.length; i++) {\r
-                       m += a[i];\r
-\r
-                       if (i<a.length-1)\r
-                               m += ', ';\r
-               }\r
-\r
-               if (l < 1000)\r
-                       tinyMCE.log[l] = "[debug] " + m;\r
-       }\r
-\r
-       });\r
-\r
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Engine.class.js */
+
+function TinyMCE_Engine() {
+       var ua;
+
+       this.majorVersion = "2";
+       this.minorVersion = "1.3";
+       this.releaseDate = "2007-11-27";
+
+       this.instances = [];
+       this.switchClassCache = [];
+       this.windowArgs = [];
+       this.loadedFiles = [];
+       this.pendingFiles = [];
+       this.loadingIndex = 0;
+       this.configs = [];
+       this.currentConfig = 0;
+       this.eventHandlers = [];
+       this.log = [];
+       this.undoLevels = [];
+       this.undoIndex = 0;
+       this.typingUndoIndex = -1;
+       this.settings = [];
+
+       // Browser check
+       ua = navigator.userAgent;
+       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");
+       this.isMSIE5 = this.isMSIE && (ua.indexOf('MSIE 5') != -1);
+       this.isMSIE5_0 = this.isMSIE && (ua.indexOf('MSIE 5.0') != -1);
+       this.isMSIE7 = this.isMSIE && (ua.indexOf('MSIE 7') != -1);
+       this.isGecko = ua.indexOf('Gecko') != -1; // Will also be true on Safari
+       this.isSafari = ua.indexOf('Safari') != -1;
+       this.isOpera = window['opera'] && opera.buildNumber ? true : false;
+       this.isMac = ua.indexOf('Mac') != -1;
+       this.isNS7 = ua.indexOf('Netscape/7') != -1;
+       this.isNS71 = ua.indexOf('Netscape/7.1') != -1;
+       this.dialogCounter = 0;
+       this.plugins = [];
+       this.themes = [];
+       this.menus = [];
+       this.loadedPlugins = [];
+       this.buttonMap = [];
+       this.isLoaded = false;
+
+       // Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those
+       if (this.isOpera) {
+               this.isMSIE = true;
+               this.isGecko = false;
+               this.isSafari =  false;
+       }
+
+       this.isIE = this.isMSIE;
+       this.isRealIE = this.isMSIE && !this.isOpera;
+
+       // TinyMCE editor id instance counter
+       this.idCounter = 0;
+};
+
+TinyMCE_Engine.prototype = {
+       init : function(settings) {
+               var theme, nl, baseHREF = "", i, cssPath, entities, h, p, src, elements = [], head;
+
+               // IE 5.0x is no longer supported since 5.5, 6.0 and 7.0 now exists. We can't support old browsers forever, sorry.
+               if (this.isMSIE5_0)
+                       return;
+
+               this.settings = settings;
+
+               // Check if valid browser has execcommand support
+               if (typeof(document.execCommand) == 'undefined')
+                       return;
+
+               // Get script base path
+               if (!tinyMCE.baseURL) {
+                       // Search through head
+                       head = document.getElementsByTagName('head')[0];
+
+                       if (head) {
+                               for (i=0, nl = head.getElementsByTagName('script'); i<nl.length; i++)
+                                       elements.push(nl[i]);
+                       }
+
+                       // Search through rest of document
+                       for (i=0, nl = document.getElementsByTagName('script'); i<nl.length; i++)
+                               elements.push(nl[i]);
+
+                       // If base element found, add that infront of baseURL
+                       nl = document.getElementsByTagName('base');
+                       for (i=0; i<nl.length; i++) {
+                               if (nl[i].href)
+                                       baseHREF = nl[i].href;
+                       }
+
+                       for (i=0; i<elements.length; i++) {
+                               if (elements[i].src && (elements[i].src.indexOf("tiny_mce.js") != -1 || elements[i].src.indexOf("tiny_mce_dev.js") != -1 || elements[i].src.indexOf("tiny_mce_src.js") != -1 || elements[i].src.indexOf("tiny_mce_gzip") != -1)) {
+                                       src = elements[i].src;
+
+                                       tinyMCE.srcMode = (src.indexOf('_src') != -1 || src.indexOf('_dev') != -1) ? '_src' : '';
+                                       tinyMCE.gzipMode = src.indexOf('_gzip') != -1;
+                                       src = src.substring(0, src.lastIndexOf('/'));
+
+                                       if (settings.exec_mode == "src" || settings.exec_mode == "normal")
+                                               tinyMCE.srcMode = settings.exec_mode == "src" ? '_src' : '';
+
+                                       // Force it absolute if page has a base href
+                                       if (baseHREF !== '' && src.indexOf('://') == -1)
+                                               tinyMCE.baseURL = baseHREF + src;
+                                       else
+                                               tinyMCE.baseURL = src;
+
+                                       break;
+                               }
+                       }
+               }
+
+               // Get document base path
+               this.documentBasePath = document.location.href;
+               if (this.documentBasePath.indexOf('?') != -1)
+                       this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.indexOf('?'));
+               this.documentURL = this.documentBasePath;
+               this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.lastIndexOf('/'));
+
+               // If not HTTP absolute
+               if (tinyMCE.baseURL.indexOf('://') == -1 && tinyMCE.baseURL.charAt(0) != '/') {
+                       // If site absolute
+                       tinyMCE.baseURL = this.documentBasePath + "/" + tinyMCE.baseURL;
+               }
+
+               // Set default values on settings
+               this._def("mode", "none");
+               this._def("theme", "advanced");
+               this._def("plugins", "", true);
+               this._def("language", "en");
+               this._def("docs_language", this.settings.language);
+               this._def("elements", "");
+               this._def("textarea_trigger", "mce_editable");
+               this._def("editor_selector", "");
+               this._def("editor_deselector", "mceNoEditor");
+               this._def("valid_elements", "+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],cite[title|id|class|style|dir|lang],abbr[title|id|class|style|dir|lang],acronym[title|id|class|style|dir|lang],del[title|id|class|style|dir|lang|datetime|cite],ins[title|id|class|style|dir|lang|datetime|cite]");
+               this._def("extended_valid_elements", "");
+               this._def("invalid_elements", "");
+               this._def("encoding", "");
+               this._def("urlconverter_callback", tinyMCE.getParam("urlconvertor_callback", "TinyMCE_Engine.prototype.convertURL"));
+               this._def("save_callback", "");
+               this._def("force_br_newlines", false);
+               this._def("force_p_newlines", true);
+               this._def("add_form_submit_trigger", true);
+               this._def("relative_urls", true);
+               this._def("remove_script_host", true);
+               this._def("focus_alert", true);
+               this._def("document_base_url", this.documentURL);
+               this._def("visual", true);
+               this._def("visual_table_class", "mceVisualAid");
+               this._def("setupcontent_callback", "");
+               this._def("fix_content_duplication", true);
+               this._def("custom_undo_redo", true);
+               this._def("custom_undo_redo_levels", -1);
+               this._def("custom_undo_redo_keyboard_shortcuts", true);
+               this._def("custom_undo_redo_restore_selection", true);
+               this._def("custom_undo_redo_global", false);
+               this._def("verify_html", true);
+               this._def("apply_source_formatting", false);
+               this._def("directionality", "ltr");
+               this._def("cleanup_on_startup", false);
+               this._def("inline_styles", false);
+               this._def("convert_newlines_to_brs", false);
+               this._def("auto_reset_designmode", true);
+               this._def("entities", "39,#39,160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,34,quot,38,amp,60,lt,62,gt,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro", true);
+               this._def("entity_encoding", "named");
+               this._def("cleanup_callback", "");
+               this._def("add_unload_trigger", true);
+               this._def("ask", false);
+               this._def("nowrap", false);
+               this._def("auto_resize", false);
+               this._def("auto_focus", false);
+               this._def("cleanup", true);
+               this._def("remove_linebreaks", true);
+               this._def("button_tile_map", false);
+               this._def("submit_patch", true);
+               this._def("browsers", "msie,safari,gecko,opera", true);
+               this._def("dialog_type", "window");
+               this._def("accessibility_warnings", true);
+               this._def("accessibility_focus", true);
+               this._def("merge_styles_invalid_parents", "");
+               this._def("force_hex_style_colors", true);
+               this._def("trim_span_elements", true);
+               this._def("convert_fonts_to_spans", false);
+               this._def("doctype", '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');
+               this._def("font_size_classes", '');
+               this._def("font_size_style_values", 'xx-small,x-small,small,medium,large,x-large,xx-large', true);
+               this._def("event_elements", 'a,img', true);
+               this._def("convert_urls", true);
+               this._def("table_inline_editing", false);
+               this._def("object_resizing", true);
+               this._def("custom_shortcuts", true);
+               this._def("convert_on_click", false);
+               this._def("content_css", '');
+               this._def("fix_list_elements", true);
+               this._def("fix_table_elements", false);
+               this._def("strict_loading_mode", document.contentType == 'application/xhtml+xml');
+               this._def("hidden_tab_class", '');
+               this._def("display_tab_class", '');
+               this._def("gecko_spellcheck", false);
+               this._def("hide_selects_on_submit", true);
+               this._def("forced_root_block", false);
+               this._def("remove_trailing_nbsp", false);
+               this._def("save_on_tinymce_forms", false);
+
+               // Force strict loading mode to false on non Gecko browsers
+               if (this.isMSIE && !this.isOpera)
+                       this.settings.strict_loading_mode = false;
+
+               // Browser check IE
+               if (this.isMSIE && this.settings.browsers.indexOf('msie') == -1)
+                       return;
+
+               // Browser check Gecko
+               if (this.isGecko && this.settings.browsers.indexOf('gecko') == -1)
+                       return;
+
+               // Browser check Safari
+               if (this.isSafari && this.settings.browsers.indexOf('safari') == -1)
+                       return;
+
+               // Browser check Opera
+               if (this.isOpera && this.settings.browsers.indexOf('opera') == -1)
+                       return;
+
+               // If not super absolute make it so
+               baseHREF = tinyMCE.settings.document_base_url;
+               h = document.location.href;
+               p = h.indexOf('://');
+               if (p > 0 && document.location.protocol != "file:") {
+                       p = h.indexOf('/', p + 3);
+                       h = h.substring(0, p);
+
+                       if (baseHREF.indexOf('://') == -1)
+                               baseHREF = h + baseHREF;
+
+                       tinyMCE.settings.document_base_url = baseHREF;
+                       tinyMCE.settings.document_base_prefix = h;
+               }
+
+               // Trim away query part
+               if (baseHREF.indexOf('?') != -1)
+                       baseHREF = baseHREF.substring(0, baseHREF.indexOf('?'));
+
+               this.settings.base_href = baseHREF.substring(0, baseHREF.lastIndexOf('/')) + "/";
+
+               theme = this.settings.theme;
+               this.inlineStrict = 'A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';
+               this.inlineTransitional = 'A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';
+               this.blockElms = 'H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';
+               this.blockRegExp = new RegExp("^(" + this.blockElms + ")$", "i");
+               this.posKeyCodes = [13,45,36,35,33,34,37,38,39,40];
+               this.uniqueURL = 'javascript:void(091039730);'; // Make unique URL non real URL
+               this.uniqueTag = '<div id="mceTMPElement" style="display: none">TMP</div>';
+               this.callbacks = ['onInit', 'getInfo', 'getEditorTemplate', 'setupContent', 'onChange', 'onPageLoad', 'handleNodeChange', 'initInstance', 'execCommand', 'getControlHTML', 'handleEvent', 'cleanup', 'removeInstance'];
+
+               // Theme url
+               this.settings.theme_href = tinyMCE.baseURL + "/themes/" + theme;
+
+               if (!tinyMCE.isIE || tinyMCE.isOpera)
+                       this.settings.force_br_newlines = false;
+
+               if (tinyMCE.getParam("popups_css", false)) {
+                       cssPath = tinyMCE.getParam("popups_css", "");
+
+                       // Is relative
+                       if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')
+                               this.settings.popups_css = this.documentBasePath + "/" + cssPath;
+                       else
+                               this.settings.popups_css = cssPath;
+               } else
+                       this.settings.popups_css = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_popup.css";
+
+               if (tinyMCE.getParam("editor_css", false)) {
+                       cssPath = tinyMCE.getParam("editor_css", "");
+
+                       // Is relative
+                       if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')
+                               this.settings.editor_css = this.documentBasePath + "/" + cssPath;
+                       else
+                               this.settings.editor_css = cssPath;
+               } else {
+                       if (this.settings.editor_css !== '')
+                               this.settings.editor_css = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_ui.css";
+               }
+
+               // Only do this once
+               if (this.configs.length == 0) {
+                       if (typeof(TinyMCECompressed) == "undefined") {
+                               tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCE_Engine.prototype.onLoad);
+
+                               if (tinyMCE.isRealIE) {
+                                       if (document.body)
+                                               tinyMCE.addEvent(document.body, "readystatechange", TinyMCE_Engine.prototype.onLoad);
+                                       else
+                                               tinyMCE.addEvent(document, "readystatechange", TinyMCE_Engine.prototype.onLoad);
+                               }
+
+                               tinyMCE.addEvent(window, "load", TinyMCE_Engine.prototype.onLoad);
+                               tinyMCE._addUnloadEvents();
+                       }
+               }
+
+               this.loadScript(tinyMCE.baseURL + '/themes/' + this.settings.theme + '/editor_template' + tinyMCE.srcMode + '.js');
+               this.loadScript(tinyMCE.baseURL + '/langs/' + this.settings.language +  '.js');
+               this.loadCSS(this.settings.editor_css);
+
+               // Add plugins
+               p = tinyMCE.getParam('plugins', '', true, ',');
+               if (p.length > 0) {
+                       for (i=0; i<p.length; i++) {
+                               if (p[i].charAt(0) != '-')
+                                       this.loadScript(tinyMCE.baseURL + '/plugins/' + p[i] + '/editor_plugin' + tinyMCE.srcMode + '.js');
+                       }
+               }
+
+               // Setup entities
+               if (tinyMCE.getParam('entity_encoding') == 'named') {
+                       settings.cleanup_entities = [];
+                       entities = tinyMCE.getParam('entities', '', true, ',');
+                       for (i=0; i<entities.length; i+=2)
+                               settings.cleanup_entities['c' + entities[i]] = entities[i+1];
+               }
+
+               // Save away this config
+               settings.index = this.configs.length;
+               this.configs[this.configs.length] = settings;
+
+               // Start loading first one in chain
+               this.loadNextScript();
+
+               // Force flicker free CSS backgrounds in IE
+               if (this.isIE && !this.isOpera) {
+                       try {
+                               document.execCommand('BackgroundImageCache', false, true);
+                       } catch (e) {
+                               // Ignore
+                       }
+               }
+
+               // Setup XML encoding regexps
+               this.xmlEncodeRe = new RegExp('[<>&"]', 'g');
+       },
+
+       _addUnloadEvents : function() {
+               var st = tinyMCE.settings.add_unload_trigger;
+
+               if (tinyMCE.isIE) {
+                       if (st) {
+                               tinyMCE.addEvent(window, "unload", TinyMCE_Engine.prototype.unloadHandler);
+                               tinyMCE.addEvent(window.document, "beforeunload", TinyMCE_Engine.prototype.unloadHandler);
+                       }
+               } else {
+                       if (st)
+                               tinyMCE.addEvent(window, "unload", function () {tinyMCE.triggerSave(true, true);});
+               }
+       },
+
+       _def : function(key, def_val, t) {
+               var v = tinyMCE.getParam(key, def_val);
+
+               v = t ? v.replace(/\s+/g, "") : v;
+
+               this.settings[key] = v;
+       },
+
+       hasPlugin : function(n) {
+               return typeof(this.plugins[n]) != "undefined" && this.plugins[n] != null;
+       },
+
+       addPlugin : function(n, p) {
+               var op = this.plugins[n];
+
+               // Use the previous plugin object base URL used when loading external plugins
+               p.baseURL = op ? op.baseURL : tinyMCE.baseURL + "/plugins/" + n;
+               this.plugins[n] = p;
+
+               this.loadNextScript();
+       },
+
+       setPluginBaseURL : function(n, u) {
+               var op = this.plugins[n];
+
+               if (op)
+                       op.baseURL = u;
+               else
+                       this.plugins[n] = {baseURL : u};
+       },
+
+       loadPlugin : function(n, u) {
+               u = u.indexOf('.js') != -1 ? u.substring(0, u.lastIndexOf('/')) : u;
+               u = u.charAt(u.length-1) == '/' ? u.substring(0, u.length-1) : u;
+               this.plugins[n] = {baseURL : u};
+               this.loadScript(u + "/editor_plugin" + (tinyMCE.srcMode ? '_src' : '') + ".js");
+       },
+
+       hasTheme : function(n) {
+               return typeof(this.themes[n]) != "undefined" && this.themes[n] != null;
+       },
+
+       addTheme : function(n, t) {
+               this.themes[n] = t;
+
+               this.loadNextScript();
+       },
+
+       addMenu : function(n, m) {
+               this.menus[n] = m;
+       },
+
+       hasMenu : function(n) {
+               return typeof(this.plugins[n]) != "undefined" && this.plugins[n] != null;
+       },
+
+       loadScript : function(url) {
+               var i;
+
+               for (i=0; i<this.loadedFiles.length; i++) {
+                       if (this.loadedFiles[i] == url)
+                               return;
+               }
+
+               if (tinyMCE.settings.strict_loading_mode)
+                       this.pendingFiles[this.pendingFiles.length] = url;
+               else
+                       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></script>');
+
+               this.loadedFiles[this.loadedFiles.length] = url;
+       },
+
+       loadNextScript : function() {
+               var d = document, se;
+
+               if (!tinyMCE.settings.strict_loading_mode)
+                       return;
+
+               if (this.loadingIndex < this.pendingFiles.length) {
+                       se = d.createElementNS('http://www.w3.org/1999/xhtml', 'script');
+                       se.setAttribute('language', 'javascript');
+                       se.setAttribute('type', 'text/javascript');
+                       se.setAttribute('src', this.pendingFiles[this.loadingIndex++]);
+
+                       d.getElementsByTagName("head")[0].appendChild(se);
+               } else
+                       this.loadingIndex = -1; // Done with loading
+       },
+
+       loadCSS : function(url) {
+               var ar = url.replace(/\s+/, '').split(',');
+               var lflen = 0, csslen = 0, skip = false;
+               var x = 0, i = 0, nl, le;
+
+               for (x = 0,csslen = ar.length; x<csslen; x++) {
+                       if (ar[x] != null && ar[x] != 'null' && ar[x].length > 0) {
+                               /* Make sure it doesn't exist. */
+                               for (i=0, lflen=this.loadedFiles.length; i<lflen; i++) {
+                                       if (this.loadedFiles[i] == ar[x]) {
+                                               skip = true;
+                                               break;
+                                       }
+                               }
+
+                               if (!skip) {
+                                       if (tinyMCE.settings.strict_loading_mode) {
+                                               nl = document.getElementsByTagName("head");
+
+                                               le = document.createElement('link');
+                                               le.setAttribute('href', ar[x]);
+                                               le.setAttribute('rel', 'stylesheet');
+                                               le.setAttribute('type', 'text/css');
+
+                                               nl[0].appendChild(le);                  
+                                       } else
+                                               document.write('<link href="' + ar[x] + '" rel="stylesheet" type="text/css" />');
+
+                                       this.loadedFiles[this.loadedFiles.length] = ar[x];
+                               }
+                       }
+               }
+       },
+
+       importCSS : function(doc, css) {
+               var css_ary = css.replace(/\s+/, '').split(',');
+               var csslen, elm, headArr, x, css_file;
+
+               for (x = 0, csslen = css_ary.length; x<csslen; x++) {
+                       css_file = css_ary[x];
+
+                       if (css_file != null && css_file != 'null' && css_file.length > 0) {
+                               // Is relative, make absolute
+                               if (css_file.indexOf('://') == -1 && css_file.charAt(0) != '/')
+                                       css_file = this.documentBasePath + "/" + css_file;
+
+                               if (typeof(doc.createStyleSheet) == "undefined") {
+                                       elm = doc.createElement("link");
+
+                                       elm.rel = "stylesheet";
+                                       elm.href = css_file;
+
+                                       if ((headArr = doc.getElementsByTagName("head")) != null && headArr.length > 0)
+                                               headArr[0].appendChild(elm);
+                               } else
+                                       doc.createStyleSheet(css_file);
+                       }
+               }
+       },
+
+       confirmAdd : function(e, settings) {
+               var elm = tinyMCE.isIE ? event.srcElement : e.target;
+               var elementId = elm.name ? elm.name : elm.id;
+
+               tinyMCE.settings = settings;
+
+               if (tinyMCE.settings.convert_on_click || (!elm.getAttribute('mce_noask') && confirm(tinyMCELang.lang_edit_confirm)))
+                       tinyMCE.addMCEControl(elm, elementId);
+
+               elm.setAttribute('mce_noask', 'true');
+       },
+
+       updateContent : function(form_element_name) {
+               var formElement, n, inst, doc;
+
+               // Find MCE instance linked to given form element and copy it's value
+               formElement = document.getElementById(form_element_name);
+               for (n in tinyMCE.instances) {
+                       inst = tinyMCE.instances[n];
+
+                       if (!tinyMCE.isInstance(inst))
+                               continue;
+
+                       inst.switchSettings();
+
+                       if (inst.formElement == formElement) {
+                               doc = inst.getDoc();
+
+                               tinyMCE._setHTML(doc, inst.formElement.value);
+
+                               if (!tinyMCE.isIE)
+                                       doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, this.settings, doc.body, inst.visualAid);
+                       }
+               }
+       },
+
+       addMCEControl : function(replace_element, form_element_name, target_document) {
+               var id = "mce_editor_" + tinyMCE.idCounter++;
+               var inst = new TinyMCE_Control(tinyMCE.settings);
+
+               inst.editorId = id;
+               this.instances[id] = inst;
+
+               inst._onAdd(replace_element, form_element_name, target_document);
+       },
+
+       removeInstance : function(ti) {
+               var t = [], n, i;
+
+               // Remove from instances
+               for (n in tinyMCE.instances) {
+                       i = tinyMCE.instances[n];
+
+                       if (tinyMCE.isInstance(i) && ti != i)
+                                       t[n] = i;
+               }
+
+               tinyMCE.instances = t;
+
+               // Remove from global undo/redo
+               n = [];
+               t = tinyMCE.undoLevels;
+
+               for (i=0; i<t.length; i++) {
+                       if (t[i] != ti)
+                               n.push(t[i]);
+               }
+
+               tinyMCE.undoLevels = n;
+               tinyMCE.undoIndex = n.length;
+
+               // Dispatch remove instance call
+               tinyMCE.dispatchCallback(ti, 'remove_instance_callback', 'removeInstance', ti);
+
+               return ti;
+       },
+
+       removeMCEControl : function(editor_id) {
+               var inst = tinyMCE.getInstanceById(editor_id), h, re, ot, tn, n;
+
+               if (inst) {
+                       inst.switchSettings();
+
+                       editor_id = inst.editorId;
+                       h = tinyMCE.getContent(editor_id);
+
+                       this.removeInstance(inst);
+
+                       tinyMCE.selectedElement = null;
+                       tinyMCE.selectedInstance = null;
+
+                       tinyMCE.selectedElement = null;
+                       tinyMCE.selectedInstance = null;
+
+                       // Try finding an instance
+                       for (n in tinyMCE.instances) {
+                               if (!tinyMCE.isInstance(tinyMCE.instances[n]))
+                                       continue;
+
+                               tinyMCE.selectedInstance = tinyMCE.instances[n];
+                               break;
+                       }
+
+                       // Remove element
+                       re = document.getElementById(editor_id + "_parent");
+                       ot = inst.oldTargetElement;
+                       tn = ot.nodeName.toLowerCase();
+
+                       if (tn == "textarea" || tn == "input") {
+                               re.parentNode.removeChild(re);
+                               ot.style.display = "inline";
+                               ot.value = h;
+                       } else {
+                               ot.innerHTML = h;
+                               ot.style.display = 'block';
+                               re.parentNode.insertBefore(ot, re);
+                               re.parentNode.removeChild(re);
+                       }
+               }
+       },
+
+       triggerSave : function(skip_cleanup, skip_callback) {
+               var inst, n;
+
+               // Default to false
+               if (typeof(skip_cleanup) == "undefined")
+                       skip_cleanup = false;
+
+               // Default to false
+               if (typeof(skip_callback) == "undefined")
+                       skip_callback = false;
+
+               // Cleanup and set all form fields
+               for (n in tinyMCE.instances) {
+                       inst = tinyMCE.instances[n];
+
+                       if (!tinyMCE.isInstance(inst))
+                               continue;
+
+                       inst.triggerSave(skip_cleanup, skip_callback);
+               }
+       },
+
+       resetForm : function(form_index) {
+               var i, inst, n, formObj = document.forms[form_index];
+
+               for (n in tinyMCE.instances) {
+                       inst = tinyMCE.instances[n];
+
+                       if (!tinyMCE.isInstance(inst))
+                               continue;
+
+                       inst.switchSettings();
+
+                       for (i=0; i<formObj.elements.length; i++) {
+                               if (inst.formTargetElementId == formObj.elements[i].name)
+                                       inst.getBody().innerHTML = inst.startContent;
+                       }
+               }
+       },
+
+       execInstanceCommand : function(editor_id, command, user_interface, value, focus) {
+               var inst = tinyMCE.getInstanceById(editor_id), r;
+
+               if (inst) {
+                       r = inst.selection.getRng();
+
+                       if (typeof(focus) == "undefined")
+                               focus = true;
+
+                       // IE bug lost focus on images in absolute divs Bug #1534575
+                       if (focus && (!r || !r.item))
+                               inst.contentWindow.focus();
+
+                       // Reset design mode if lost
+                       inst.autoResetDesignMode();
+
+                       this.selectedElement = inst.getFocusElement();
+                       inst.select();
+                       tinyMCE.execCommand(command, user_interface, value);
+
+                       // Cancel event so it doesn't call onbeforeonunlaod
+                       if (tinyMCE.isIE && window.event != null)
+                               tinyMCE.cancelEvent(window.event);
+               }
+       },
+
+       execCommand : function(command, user_interface, value) {
+               var inst = tinyMCE.selectedInstance, n, pe, te;
+
+               // Default input
+               user_interface = user_interface ? user_interface : false;
+               value = value ? value : null;
+
+               if (inst)
+                       inst.switchSettings();
+
+               switch (command) {
+                       case "Undo":
+                               if (this.getParam('custom_undo_redo_global')) {
+                                       if (this.undoIndex > 0) {
+                                               tinyMCE.nextUndoRedoAction = 'Undo';
+                                               inst = this.undoLevels[--this.undoIndex];
+                                               inst.select();
+
+                                               if (!tinyMCE.nextUndoRedoInstanceId)
+                                                       inst.execCommand('Undo');
+                                       }
+                               } else
+                                       inst.execCommand('Undo');
+                               return true;
+
+                       case "Redo":
+                               if (this.getParam('custom_undo_redo_global')) {
+                                       if (this.undoIndex <= this.undoLevels.length - 1) {
+                                               tinyMCE.nextUndoRedoAction = 'Redo';
+                                               inst = this.undoLevels[this.undoIndex++];
+                                               inst.select();
+
+                                               if (!tinyMCE.nextUndoRedoInstanceId)
+                                                       inst.execCommand('Redo');
+                                       }
+                               } else
+                                       inst.execCommand('Redo');
+
+                               return true;
+
+                       case 'mceFocus':
+                               inst = tinyMCE.getInstanceById(value);
+
+                               if (inst)
+                                       inst.getWin().focus();
+                       return;
+
+                       case "mceAddControl":
+                       case "mceAddEditor":
+                               tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);
+                               return;
+
+                       case "mceAddFrameControl":
+                               tinyMCE.addMCEControl(tinyMCE._getElementById(value.element, value.document), value.element, value.document);
+                               return;
+
+                       case "mceRemoveControl":
+                       case "mceRemoveEditor":
+                               tinyMCE.removeMCEControl(value);
+                               return;
+
+                       case "mceToggleEditor":
+                               inst = tinyMCE.getInstanceById(value);
+
+                               if (inst) {
+                                       pe = document.getElementById(inst.editorId + '_parent');
+                                       te = inst.oldTargetElement;
+
+                                       if (typeof(inst.enabled) == 'undefined')
+                                               inst.enabled = true;
+
+                                       inst.enabled = !inst.enabled;
+
+                                       if (!inst.enabled) {
+                                               pe.style.display = 'none';
+
+                                               if (te.nodeName == 'TEXTAREA' || te.nodeName == 'INPUT')
+                                                       te.value = inst.getHTML();
+                                               else
+                                                       te.innerHTML = inst.getHTML();
+
+                                               te.style.display = inst.oldTargetDisplay;
+                                               tinyMCE.dispatchCallback(inst, 'hide_instance_callback', 'hideInstance', inst);
+                                       } else {
+                                               pe.style.display = 'block';
+                                               te.style.display = 'none';
+
+                                               if (te.nodeName == 'TEXTAREA' || te.nodeName == 'INPUT')
+                                                       inst.setHTML(te.value);
+                                               else
+                                                       inst.setHTML(te.innerHTML);
+
+                                               inst.useCSS = false;
+                                               tinyMCE.dispatchCallback(inst, 'show_instance_callback', 'showInstance', inst);
+                                       }
+                               } else
+                                       tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);
+
+                               return;
+
+                       case "mceResetDesignMode":
+                               // Resets the designmode state of the editors in Gecko
+                               if (tinyMCE.isGecko) {
+                                       for (n in tinyMCE.instances) {
+                                               if (!tinyMCE.isInstance(tinyMCE.instances[n]))
+                                                       continue;
+
+                                               try {
+                                                       tinyMCE.instances[n].getDoc().designMode = "off";
+                                                       tinyMCE.instances[n].getDoc().designMode = "on";
+                                                       tinyMCE.instances[n].useCSS = false;
+                                               } catch (e) {
+                                                       // Ignore any errors
+                                               }
+                                       }
+                               }
+
+                               return;
+               }
+
+               if (inst) {
+                       inst.execCommand(command, user_interface, value);
+               } else if (tinyMCE.settings.focus_alert)
+                       alert(tinyMCELang.lang_focus_alert);
+       },
+
+       _createIFrame : function(replace_element, doc, win) {
+               var iframe, id = replace_element.getAttribute("id");
+               var aw, ah;
+
+               if (typeof(doc) == "undefined")
+                       doc = document;
+
+               if (typeof(win) == "undefined")
+                       win = window;
+
+               iframe = doc.createElement("iframe");
+
+               aw = "" + tinyMCE.settings.area_width;
+               ah = "" + tinyMCE.settings.area_height;
+
+               if (aw.indexOf('%') == -1) {
+                       aw = parseInt(aw);
+                       aw = (isNaN(aw) || aw < 0) ? 300 : aw;
+                       aw = aw + "px";
+               }
+
+               if (ah.indexOf('%') == -1) {
+                       ah = parseInt(ah);
+                       ah = (isNaN(ah) || ah < 0) ? 240 : ah;
+                       ah = ah + "px";
+               }
+
+               iframe.setAttribute("id", id);
+               iframe.setAttribute("name", id);
+               iframe.setAttribute("class", "mceEditorIframe");
+               iframe.setAttribute("border", "0");
+               iframe.setAttribute("frameBorder", "0");
+               iframe.setAttribute("marginWidth", "0");
+               iframe.setAttribute("marginHeight", "0");
+               iframe.setAttribute("leftMargin", "0");
+               iframe.setAttribute("topMargin", "0");
+               iframe.setAttribute("width", aw);
+               iframe.setAttribute("height", ah);
+               iframe.setAttribute("allowtransparency", "true");
+               iframe.className = 'mceEditorIframe';
+
+               if (tinyMCE.settings.auto_resize)
+                       iframe.setAttribute("scrolling", "no");
+
+               // Must have a src element in MSIE HTTPs breaks aswell as absoute URLs
+               if (tinyMCE.isRealIE)
+                       iframe.setAttribute("src", this.settings.default_document);
+
+               iframe.style.width = aw;
+               iframe.style.height = ah;
+
+               // Ugly hack for Gecko problem in strict mode
+               if (tinyMCE.settings.strict_loading_mode)
+                       iframe.style.marginBottom = '-5px';
+
+               // MSIE 5.0 issue
+               if (tinyMCE.isRealIE)
+                       replace_element.outerHTML = iframe.outerHTML;
+               else
+                       replace_element.parentNode.replaceChild(iframe, replace_element);
+
+               if (tinyMCE.isRealIE)
+                       return win.frames[id];
+               else
+                       return iframe;
+       },
+
+       setupContent : function(editor_id) {
+               var inst = tinyMCE.instances[editor_id], i, doc = inst.getDoc(), head = doc.getElementsByTagName('head').item(0);
+               var content = inst.startContent, contentElement, body;
+
+               // HTML values get XML encoded in strict mode
+               if (tinyMCE.settings.strict_loading_mode) {
+                       content = content.replace(/&lt;/g, '<');
+                       content = content.replace(/&gt;/g, '>');
+                       content = content.replace(/&quot;/g, '"');
+                       content = content.replace(/&amp;/g, '&');
+               }
+
+               tinyMCE.selectedInstance = inst;
+               inst.switchSettings();
+
+               // Not loaded correctly hit it again, Mozilla bug #997860
+               if (!tinyMCE.isIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") {
+                       // This part will remove the designMode status
+                       // Failes first time in Firefox 1.5b2 on Mac
+                       try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {}
+                       window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000);
+                       return;
+               }
+
+               // Wait for it to load
+               if (!head || !doc.body) {
+                       window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10);
+                       return;
+               }
+
+               // Import theme specific content CSS the user specific
+               tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/themes/" + inst.settings.theme + "/css/editor_content.css");
+               tinyMCE.importCSS(inst.getDoc(), inst.settings.content_css);
+               tinyMCE.dispatchCallback(inst, 'init_instance_callback', 'initInstance', inst);
+
+               // Setup keyboard shortcuts
+               if (tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')) {
+                       inst.addShortcut('ctrl', 'z', 'lang_undo_desc', 'Undo');
+                       inst.addShortcut('ctrl', 'y', 'lang_redo_desc', 'Redo');
+               }
+
+               // BlockFormat shortcuts keys
+               for (i=1; i<=6; i++)
+                       inst.addShortcut('ctrl', '' + i, '', 'FormatBlock', false, '<h' + i + '>');
+
+               inst.addShortcut('ctrl', '7', '', 'FormatBlock', false, '<p>');
+               inst.addShortcut('ctrl', '8', '', 'FormatBlock', false, '<div>');
+               inst.addShortcut('ctrl', '9', '', 'FormatBlock', false, '<address>');
+
+               // Add default shortcuts for gecko
+               if (tinyMCE.isGecko) {
+                       inst.addShortcut('ctrl', 'b', 'lang_bold_desc', 'Bold');
+                       inst.addShortcut('ctrl', 'i', 'lang_italic_desc', 'Italic');
+                       inst.addShortcut('ctrl', 'u', 'lang_underline_desc', 'Underline');
+               }
+
+               // Setup span styles
+               if (tinyMCE.getParam("convert_fonts_to_spans"))
+                       inst.getBody().setAttribute('id', 'mceSpanFonts');
+
+               if (tinyMCE.settings.nowrap)
+                       doc.body.style.whiteSpace = "nowrap";
+
+               doc.body.dir = this.settings.directionality;
+               doc.editorId = editor_id;
+
+               // Add on document element in Mozilla
+               if (!tinyMCE.isIE)
+                       doc.documentElement.editorId = editor_id;
+
+               inst.setBaseHREF(tinyMCE.settings.base_href);
+
+               // Replace new line characters to BRs
+               if (tinyMCE.settings.convert_newlines_to_brs) {
+                       content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi");
+                       content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi");
+                       content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi");
+               }
+
+               // Open closed anchors
+       //      content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
+
+               // Call custom cleanup code
+               content = tinyMCE.storeAwayURLs(content);
+               content = tinyMCE._customCleanup(inst, "insert_to_editor", content);
+
+               if (tinyMCE.isIE) {
+                       // Ugly!!!
+                       window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["' + editor_id + '"].getDoc(), "' + editor_id + '");}catch(e){}', 500);
+
+                       if (tinyMCE.settings.force_br_newlines)
+                               doc.styleSheets[0].addRule("p", "margin: 0;");
+
+                       body = inst.getBody();
+                       body.editorId = editor_id;
+               }
+
+               content = tinyMCE.cleanupHTMLCode(content);
+
+               // Fix for bug #958637
+               if (!tinyMCE.isIE) {
+                       contentElement = inst.getDoc().createElement("body");
+                       doc = inst.getDoc();
+
+                       contentElement.innerHTML = content;
+
+                       if (tinyMCE.settings.cleanup_on_startup)
+                               tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, this.settings, contentElement));
+                       else
+                               tinyMCE.setInnerHTML(inst.getBody(), content);
+
+                       tinyMCE.convertAllRelativeURLs(inst.getBody());
+               } else {
+                       if (tinyMCE.settings.cleanup_on_startup) {
+                               tinyMCE._setHTML(inst.getDoc(), content);
+
+                               // Produces permission denied error in MSIE 5.5
+                               try {
+                                       tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));
+                               } catch(e) {
+                                       // Ignore
+                               }
+                       } else
+                               tinyMCE._setHTML(inst.getDoc(), content);
+               }
+
+               // Fix for bug #957681
+               //inst.getDoc().designMode = inst.getDoc().designMode;
+
+               tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings.visual, inst);
+               tinyMCE.dispatchCallback(inst, 'setupcontent_callback', 'setupContent', editor_id, inst.getBody(), inst.getDoc());
+
+               // Re-add design mode on mozilla
+               if (!tinyMCE.isIE)
+                       tinyMCE.addEventHandlers(inst);
+
+               // Add blur handler
+               if (tinyMCE.isIE) {
+                       tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE_Engine.prototype._eventPatch);
+                       tinyMCE.addEvent(inst.getBody(), "beforedeactivate", TinyMCE_Engine.prototype._eventPatch); // Bug #1439953
+
+                       // Workaround for drag drop/copy paste base href bug
+                       if (!tinyMCE.isOpera) {
+                               tinyMCE.addEvent(doc.body, "mousemove", TinyMCE_Engine.prototype.onMouseMove);
+                               tinyMCE.addEvent(doc.body, "beforepaste", TinyMCE_Engine.prototype._eventPatch);
+                               tinyMCE.addEvent(doc.body, "drop", TinyMCE_Engine.prototype._eventPatch);
+                       }
+               }
+
+               // Trigger node change, this call locks buttons for tables and so forth
+               inst.select();
+               tinyMCE.selectedElement = inst.contentWindow.document.body;
+
+               // Call custom DOM cleanup
+               tinyMCE._customCleanup(inst, "insert_to_editor_dom", inst.getBody());
+               tinyMCE._customCleanup(inst, "setup_content_dom", inst.getBody());
+               tinyMCE._setEventsEnabled(inst.getBody(), false);
+               tinyMCE.cleanupAnchors(inst.getDoc());
+
+               if (tinyMCE.getParam("convert_fonts_to_spans"))
+                       tinyMCE.convertSpansToFonts(inst.getDoc());
+
+               inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);
+               inst.undoRedo.add({ content : inst.startContent });
+
+               // Cleanup any mess left from storyAwayURLs
+               if (tinyMCE.isGecko) {
+                       // Remove mce_src from textnodes and comments
+                       tinyMCE.selectNodes(inst.getBody(), function(n) {
+                               if (n.nodeType == 3 || n.nodeType == 8)
+                                       n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), "");
+
+                               return false;
+                       });
+               }
+
+               // Remove Gecko spellchecking
+               if (tinyMCE.isGecko)
+                       inst.getBody().spellcheck = tinyMCE.getParam("gecko_spellcheck");
+
+               // Cleanup any mess left from storyAwayURLs
+               tinyMCE._removeInternal(inst.getBody());
+
+               inst.select();
+               tinyMCE.triggerNodeChange(false, true);
+       },
+
+       storeAwayURLs : function(s) {
+               // Remove all mce_src, mce_href and replace them with new ones
+               // s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
+               // s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');
+
+               if (!s.match(/(mce_src|mce_href)/gi, s)) {
+                       s = s.replace(new RegExp('src\\s*=\\s*[\"\']([^ >\"]*)[\"\']', 'gi'), 'src="$1" mce_src="$1"');
+                       s = s.replace(new RegExp('href\\s*=\\s*[\"\']([^ >\"]*)[\"\']', 'gi'), 'href="$1" mce_href="$1"');
+               }
+
+               return s;
+       },
+
+       _removeInternal : function(n) {
+               if (tinyMCE.isGecko) {
+                       // Remove mce_src from textnodes and comments
+                       tinyMCE.selectNodes(n, function(n) {
+                               if (n.nodeType == 3 || n.nodeType == 8)
+                                       n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), "");
+
+                               return false;
+                       });
+               }
+       },
+
+       removeTinyMCEFormElements : function(form_obj) {
+               var i, elementId;
+
+               // Skip form element removal
+               if (!tinyMCE.getParam('hide_selects_on_submit'))
+                       return;
+
+               // Check if form is valid
+               if (typeof(form_obj) == "undefined" || form_obj == null)
+                       return;
+
+               // If not a form, find the form
+               if (form_obj.nodeName != "FORM") {
+                       if (form_obj.form)
+                               form_obj = form_obj.form;
+                       else
+                               form_obj = tinyMCE.getParentElement(form_obj, "form");
+               }
+
+               // Still nothing
+               if (form_obj == null)
+                       return;
+
+               // Disable all UI form elements that TinyMCE created
+               for (i=0; i<form_obj.elements.length; i++) {
+                       elementId = form_obj.elements[i].name ? form_obj.elements[i].name : form_obj.elements[i].id;
+
+                       if (elementId.indexOf('mce_editor_') == 0)
+                               form_obj.elements[i].disabled = true;
+               }
+       },
+
+       handleEvent : function(e) {
+               var inst = tinyMCE.selectedInstance, i, elm, keys;
+
+               // Remove odd, error
+               if (typeof(tinyMCE) == "undefined")
+                       return true;
+
+               //tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));
+
+               if (tinyMCE.executeCallback(tinyMCE.selectedInstance, 'handle_event_callback', 'handleEvent', e))
+                       return false;
+
+               switch (e.type) {
+                       case "beforedeactivate": // Was added due to bug #1439953
+                       case "blur":
+                               if (tinyMCE.selectedInstance)
+                                       tinyMCE.selectedInstance.execCommand('mceEndTyping');
+
+                               tinyMCE.hideMenus();
+
+                               return;
+
+                       // Workaround for drag drop/copy paste base href bug
+                       case "drop":
+                       case "beforepaste":
+/*                             if (tinyMCE.selectedInstance)
+                                       tinyMCE.selectedInstance.setBaseHREF(null);
+
+                               // Fixes odd MSIE bug where drag/droping elements in a iframe with height 100% breaks
+                               // This logic forces the width/height to be in pixels while the user is drag/dropping
+                               // NOTE: This has been disabled for now since it messes up copy/paste that is far more important than image drag
+                               if (tinyMCE.isRealIE) {
+                                       var ife = tinyMCE.selectedInstance.iframeElement;
+
+                                       if (ife.style.height.indexOf('%') != -1) {
+                                               ife._oldHeight = ife.style.height;
+                                               ife.style.height = ife.clientHeight;
+                                       }
+                               }
+
+                               window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings.base_href);tinyMCE._resetIframeHeight();", 1);
+                               */
+                               return;
+
+                       case "submit":
+                               tinyMCE.formSubmit(tinyMCE.isMSIE ? window.event.srcElement : e.target);
+                               return;
+
+                       case "reset":
+                               var formObj = tinyMCE.isIE ? window.event.srcElement : e.target;
+
+                               for (i=0; i<document.forms.length; i++) {
+                                       if (document.forms[i] == formObj)
+                                               window.setTimeout('tinyMCE.resetForm(' + i + ');', 10);
+                               }
+
+                               return;
+
+                       case "keypress":
+                               if (inst && inst.handleShortcut(e))
+                                       return false;
+
+                               if (e.target.editorId) {
+                                       tinyMCE.instances[e.target.editorId].select();
+                               } else {
+                                       if (e.target.ownerDocument.editorId)
+                                               tinyMCE.instances[e.target.ownerDocument.editorId].select();
+                               }
+
+                               if (tinyMCE.selectedInstance)
+                                       tinyMCE.selectedInstance.switchSettings();
+
+                               // Insert P element
+                               if ((tinyMCE.isGecko || tinyMCE.isOpera || tinyMCE.isSafari) && tinyMCE.settings.force_p_newlines && e.keyCode == 13 && !e.shiftKey) {
+                                       // Insert P element instead of BR
+                                       if (TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance, e)) {
+                                               // Cancel event
+                                               tinyMCE.execCommand("mceAddUndoLevel");
+                                               return tinyMCE.cancelEvent(e);
+                                       }
+                               }
+
+                               // Handle backspace
+                               if ((tinyMCE.isGecko && !tinyMCE.isSafari) && tinyMCE.settings.force_p_newlines && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
+                                       // Insert P element instead of BR
+                                       if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
+                                               // Cancel event
+                                               tinyMCE.execCommand("mceAddUndoLevel");
+                                               return tinyMCE.cancelEvent(e);
+                                       }
+                               }
+
+                               // Return key pressed
+                               if (tinyMCE.isIE && tinyMCE.settings.force_br_newlines && e.keyCode == 13) {
+                                       if (e.target.editorId)
+                                               tinyMCE.instances[e.target.editorId].select();
+
+                                       if (tinyMCE.selectedInstance) {
+                                               var sel = tinyMCE.selectedInstance.getDoc().selection;
+                                               var rng = sel.createRange();
+
+                                               if (tinyMCE.getParentElement(rng.parentElement(), "li") != null)
+                                                       return false;
+
+                                               // Cancel event
+                                               e.returnValue = false;
+                                               e.cancelBubble = true;
+
+                                               // Insert BR element
+                                               rng.pasteHTML("<br />");
+                                               rng.collapse(false);
+                                               rng.select();
+
+                                               tinyMCE.execCommand("mceAddUndoLevel");
+                                               tinyMCE.triggerNodeChange(false);
+                                               return false;
+                                       }
+                               }
+
+                               // Backspace or delete
+                               if (e.keyCode == 8 || e.keyCode == 46) {
+                                       tinyMCE.selectedElement = e.target;
+                                       tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a");
+                                       tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img");
+                                       tinyMCE.triggerNodeChange(false);
+                               }
+
+                               return false;
+
+                       case "keyup":
+                       case "keydown":
+                               tinyMCE.hideMenus();
+                               tinyMCE.hasMouseMoved = false;
+
+                               if (inst && inst.handleShortcut(e))
+                                       return false;
+
+                               inst._fixRootBlocks();
+
+                               if (inst.settings.remove_trailing_nbsp)
+                                       inst._fixTrailingNbsp();
+
+                               if (e.target.editorId)
+                                       tinyMCE.instances[e.target.editorId].select();
+
+                               if (tinyMCE.selectedInstance)
+                                       tinyMCE.selectedInstance.switchSettings();
+
+                               inst = tinyMCE.selectedInstance;
+
+                               // Handle backspace
+                               if (tinyMCE.isGecko && tinyMCE.settings.force_p_newlines && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {
+                                       // Insert P element instead of BR
+                                       if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {
+                                               // Cancel event
+                                               tinyMCE.execCommand("mceAddUndoLevel");
+                                               e.preventDefault();
+                                               return false;
+                                       }
+                               }
+
+                               tinyMCE.selectedElement = null;
+                               tinyMCE.selectedNode = null;
+                               elm = tinyMCE.selectedInstance.getFocusElement();
+                               tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a");
+                               tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img");
+                               tinyMCE.selectedElement = elm;
+
+                               // Update visualaids on tabs
+                               if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9)
+                                       tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings.visual, tinyMCE.selectedInstance);
+
+                               // Fix empty elements on return/enter, check where enter occured
+                               if (tinyMCE.isIE && e.type == "keydown" && e.keyCode == 13)
+                                       tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();
+
+                               // Fix empty elements on return/enter
+                               if (tinyMCE.isIE && e.type == "keyup" && e.keyCode == 13) {
+                                       elm = tinyMCE.enterKeyElement;
+                                       if (elm) {
+                                               var re = new RegExp('^HR|IMG|BR$','g'); // Skip these
+                                               var dre = new RegExp('^H[1-6]$','g'); // Add double on these
+
+                                               if (!elm.hasChildNodes() && !re.test(elm.nodeName)) {
+                                                       if (dre.test(elm.nodeName))
+                                                               elm.innerHTML = "&nbsp;&nbsp;";
+                                                       else
+                                                               elm.innerHTML = "&nbsp;";
+                                               }
+                                       }
+                               }
+
+                               // Check if it's a position key
+                               keys = tinyMCE.posKeyCodes;
+                               var posKey = false;
+                               for (i=0; i<keys.length; i++) {
+                                       if (keys[i] == e.keyCode) {
+                                               posKey = true;
+                                               break;
+                                       }
+                               }
+
+                               // MSIE custom key handling
+                               if (tinyMCE.isIE && tinyMCE.settings.custom_undo_redo) {
+                                       keys = [8, 46]; // Backspace,Delete
+
+                                       for (i=0; i<keys.length; i++) {
+                                               if (keys[i] == e.keyCode) {
+                                                       if (e.type == "keyup")
+                                                               tinyMCE.triggerNodeChange(false);
+                                               }
+                                       }
+                               }
+
+                               // If Ctrl key
+                               if (e.keyCode == 17)
+                                       return true;
+
+                               // Handle Undo/Redo when typing content
+
+                               if (tinyMCE.isGecko) {
+                                       // Start typing (not a position key or ctrl key, but ctrl+x and ctrl+p is ok)
+                                       if (!posKey && e.type == "keyup" && !e.ctrlKey || (e.ctrlKey && (e.keyCode == 86 || e.keyCode == 88)))
+                                               tinyMCE.execCommand("mceStartTyping");
+                               } else {
+                                       // IE seems to be working better with this setting
+                                       if (!posKey && e.type == "keyup")
+                                               tinyMCE.execCommand("mceStartTyping");
+                               }
+
+                               // Store undo bookmark
+                               if (e.type == "keydown" && (posKey || e.ctrlKey) && inst)
+                                       inst.undoBookmark = inst.selection.getBookmark();
+
+                               // End typing (position key) or some Ctrl event
+                               if (e.type == "keyup" && (posKey || e.ctrlKey))
+                                       tinyMCE.execCommand("mceEndTyping");
+
+                               if (posKey && e.type == "keyup")
+                                       tinyMCE.triggerNodeChange(false);
+
+                               if (tinyMCE.isIE && e.ctrlKey)
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
+                       break;
+
+                       case "mousedown":
+                       case "mouseup":
+                       case "click":
+                       case "dblclick":
+                       case "focus":
+                               tinyMCE.hideMenus();
+
+                               if (tinyMCE.selectedInstance) {
+                                       tinyMCE.selectedInstance.switchSettings();
+                                       tinyMCE.selectedInstance.isFocused = true;
+                               }
+
+                               // Check instance event trigged on
+                               var targetBody = tinyMCE.getParentElement(e.target, "html");
+                               for (var instanceName in tinyMCE.instances) {
+                                       if (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))
+                                               continue;
+
+                                       inst = tinyMCE.instances[instanceName];
+
+                                       // Reset design mode if lost (on everything just in case)
+                                       inst.autoResetDesignMode();
+
+                                       // Use HTML element since users might click outside of body element
+                                       if (inst.getBody().parentNode == targetBody) {
+                                               inst.select();
+                                               tinyMCE.selectedElement = e.target;
+                                               tinyMCE.linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");
+                                               tinyMCE.imgElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "img");
+                                               break;
+                                       }
+                               }
+
+                               // Add first bookmark location
+                               if (!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark && (e.type == "mouseup" || e.type == "dblclick"))
+                                       tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark = tinyMCE.selectedInstance.selection.getBookmark();
+
+                               // Reset selected node
+                               if (e.type != "focus")
+                                       tinyMCE.selectedNode = null;
+
+                               tinyMCE.triggerNodeChange(false);
+                               tinyMCE.execCommand("mceEndTyping");
+
+                               if (e.type == "mouseup")
+                                       tinyMCE.execCommand("mceAddUndoLevel");
+
+                               // Just in case
+                               if (!tinyMCE.selectedInstance && e.target.editorId)
+                                       tinyMCE.instances[e.target.editorId].select();
+
+                               return false;
+               }
+       },
+
+       getButtonHTML : function(id, lang, img, cmd, ui, val) {
+               var h = '', m, x, io = '';
+
+               cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';
+
+               if (typeof(ui) != "undefined" && ui != null)
+                       cmd += ',' + ui;
+
+               if (typeof(val) != "undefined" && val != null)
+                       cmd += ",'" + val + "'";
+
+               cmd += ');';
+
+               // Patch for IE7 bug with hover out not restoring correctly
+               if (tinyMCE.isRealIE)
+                       io = 'onmouseover="tinyMCE.lastHover = this;"';
+
+               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled
+               if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = this.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {
+                       // Tiled button
+                       x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);
+                       h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" ' + io + ' class="mceTiledButton mceButtonNormal" target="_self">';
+                       h += '<img src="{$themeurl}/images/spacer.gif" style="background-position: ' + x + 'px 0" alt="{$'+lang+'}" title="{$' + lang + '}" />';
+                       h += '</a>';
+               } else {
+                       // Normal button
+                       h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" ' + io + ' class="mceButtonNormal" target="_self">';
+                       h += '<img src="' + img + '" alt="{$'+lang+'}" title="{$' + lang + '}" />';
+                       h += '</a>';
+               }
+
+               return h;
+       },
+
+       getMenuButtonHTML : function(id, lang, img, mcmd, cmd, ui, val) {
+               var h = '', m, x;
+
+               mcmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + mcmd + '\');';
+               cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';
+
+               if (typeof(ui) != "undefined" && ui != null)
+                       cmd += ',' + ui;
+
+               if (typeof(val) != "undefined" && val != null)
+                       cmd += ",'" + val + "'";
+
+               cmd += ');';
+
+               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled
+               if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = tinyMCE.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {
+                       x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);
+
+                       if (tinyMCE.isRealIE)
+                               h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';
+                       else
+                               h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton">';
+
+                       h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceTiledButton mceMenuButtonNormal" target="_self">';
+                       h += '<img src="{$themeurl}/images/spacer.gif" style="width: 20px; height: 20px; background-position: ' + x + 'px 0" title="{$' + lang + '}" /></a>';
+                       h += '<a href="javascript:' + mcmd + '" onclick="' + mcmd + 'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';
+                       h += '</a></span>';
+               } else {
+                       if (tinyMCE.isRealIE)
+                               h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';
+                       else
+                               h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton">';
+
+                       h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';
+                       h += '<img src="' + img + '" title="{$' + lang + '}" /></a>';
+                       h += '<a href="javascript:' + mcmd + '" onclick="' + mcmd + 'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';
+                       h += '</a></span>';
+               }
+
+               return h;
+       },
+
+       _menuButtonEvent : function(e, o) {
+               if (o.className == 'mceMenuButtonFocus')
+                       return;
+
+               if (e == 'over')
+                       o.className = o.className + ' mceMenuHover';
+               else
+                       o.className = o.className.replace(/\s.*$/, '');
+       },
+
+       addButtonMap : function(m) {
+               var i, a = m.replace(/\s+/, '').split(',');
+
+               for (i=0; i<a.length; i++)
+                       this.buttonMap[a[i]] = i;
+       },
+
+       formSubmit : function(f, p) {
+               var n, inst, found = false;
+
+               if (f.form)
+                       f = f.form;
+
+               // Is it a form that has a TinyMCE instance
+               if (tinyMCE.getParam('save_on_tinymce_forms')) {
+                       for (n in tinyMCE.instances) {
+                               inst = tinyMCE.instances[n];
+
+                               if (!tinyMCE.isInstance(inst))
+                                       continue;
+
+                               if (inst.formElement) {
+                                       if (f == inst.formElement.form) {
+                                               found = true;
+                                               inst.isNotDirty = true;
+                                       }
+                               }
+                       }
+               } else
+                       found  = true;
+
+               // Is valid
+               if (found) {
+                       tinyMCE.removeTinyMCEFormElements(f);
+                       tinyMCE.triggerSave();
+               }
+
+               // Is it patched
+               if (f.mceOldSubmit && p)
+                       f.mceOldSubmit();
+       },
+
+       submitPatch : function() {
+               tinyMCE.formSubmit(this, true);
+       },
+
+       onLoad : function() {
+               var r, i, c, mode, trigger, elements, element, settings, elementId, elm;
+               var selector, deselector, elementRefAr, form;
+
+               // Wait for everything to be loaded first
+               if (tinyMCE.settings.strict_loading_mode && this.loadingIndex != -1) {
+                       window.setTimeout('tinyMCE.onLoad();', 1);
+                       return;
+               }
+
+               if (tinyMCE.isRealIE && window.event.type == "readystatechange" && document.readyState != "complete")
+                       return true;
+
+               if (tinyMCE.isLoaded)
+                       return true;
+
+               tinyMCE.isLoaded = true;
+
+               // IE produces JS error if TinyMCE is placed in a frame
+               // It seems to have something to do with the selection not beeing
+               // correctly initialized in IE so this hack solves the problem
+               if (tinyMCE.isRealIE && document.body && window.location.href != window.top.location.href) {
+                       r = document.body.createTextRange();
+                       r.collapse(true);
+                       r.select();
+               }
+
+               tinyMCE.dispatchCallback(null, 'onpageload', 'onPageLoad');
+
+               for (c=0; c<tinyMCE.configs.length; c++) {
+                       tinyMCE.settings = tinyMCE.configs[c];
+
+                       selector = tinyMCE.getParam("editor_selector");
+                       deselector = tinyMCE.getParam("editor_deselector");
+                       elementRefAr = [];
+
+                       // Add submit triggers
+                       if (document.forms && tinyMCE.settings.add_form_submit_trigger && !tinyMCE.submitTriggers) {
+                               for (i=0; i<document.forms.length; i++) {
+                                       form = document.forms[i];
+
+                                       tinyMCE.addEvent(form, "submit", TinyMCE_Engine.prototype.handleEvent);
+                                       tinyMCE.addEvent(form, "reset", TinyMCE_Engine.prototype.handleEvent);
+                                       tinyMCE.submitTriggers = true; // Do it only once
+
+                                       // Patch the form.submit function
+                                       if (tinyMCE.settings.submit_patch) {
+                                               try {
+                                                       form.mceOldSubmit = form.submit;
+                                                       form.submit = TinyMCE_Engine.prototype.submitPatch;
+                                               } catch (e) {
+                                                       // Do nothing
+                                               }
+                                       }
+                               }
+                       }
+
+                       // Add editor instances based on mode
+                       mode = tinyMCE.settings.mode;
+                       switch (mode) {
+                               case "exact":
+                                       elements = tinyMCE.getParam('elements', '', true, ',');
+
+                                       for (i=0; i<elements.length; i++) {
+                                               element = tinyMCE._getElementById(elements[i]);
+                                               trigger = element ? element.getAttribute(tinyMCE.settings.textarea_trigger) : "";
+
+                                               if (new RegExp('\\b' + deselector + '\\b').test(tinyMCE.getAttrib(element, "class")))
+                                                       continue;
+
+                                               if (trigger == "false")
+                                                       continue;
+
+                                               if ((tinyMCE.settings.ask || tinyMCE.settings.convert_on_click) && element) {
+                                                       elementRefAr[elementRefAr.length] = element;
+                                                       continue;
+                                               }
+
+                                               if (element)
+                                                       tinyMCE.addMCEControl(element, elements[i]);
+                                       }
+                               break;
+
+                               case "specific_textareas":
+                               case "textareas":
+                                       elements = document.getElementsByTagName("textarea");
+
+                                       for (i=0; i<elements.length; i++) {
+                                               elm = elements.item(i);
+                                               trigger = elm.getAttribute(tinyMCE.settings.textarea_trigger);
+
+                                               if (selector !== '' && !new RegExp('\\b' + selector + '\\b').test(tinyMCE.getAttrib(elm, "class")))
+                                                       continue;
+
+                                               if (selector !== '')
+                                                       trigger = selector !== '' ? "true" : "";
+
+                                               if (new RegExp('\\b' + deselector + '\\b').test(tinyMCE.getAttrib(elm, "class")))
+                                                       continue;
+
+                                               if ((mode == "specific_textareas" && trigger == "true") || (mode == "textareas" && trigger != "false"))
+                                                       elementRefAr[elementRefAr.length] = elm;
+                                       }
+                               break;
+                       }
+
+                       for (i=0; i<elementRefAr.length; i++) {
+                               element = elementRefAr[i];
+                               elementId = element.name ? element.name : element.id;
+
+                               if (tinyMCE.settings.ask || tinyMCE.settings.convert_on_click) {
+                                       // Focus breaks in Mozilla
+                                       if (tinyMCE.isGecko) {
+                                               settings = tinyMCE.settings;
+
+                                               tinyMCE.addEvent(element, "focus", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});
+
+                                               if (element.nodeName != "TEXTAREA" && element.nodeName != "INPUT")
+                                                       tinyMCE.addEvent(element, "click", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});
+                                               // tinyMCE.addEvent(element, "mouseover", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});
+                                       } else {
+                                               settings = tinyMCE.settings;
+
+                                               tinyMCE.addEvent(element, "focus", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });
+                                               tinyMCE.addEvent(element, "click", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });
+                                               // tinyMCE.addEvent(element, "mouseenter", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });
+                                       }
+                               } else
+                                       tinyMCE.addMCEControl(element, elementId);
+                       }
+
+                       // Handle auto focus
+                       if (tinyMCE.settings.auto_focus) {
+                               window.setTimeout(function () {
+                                       var inst = tinyMCE.getInstanceById(tinyMCE.settings.auto_focus);
+                                       inst.selection.selectNode(inst.getBody(), true, true);
+                                       inst.contentWindow.focus();
+                               }, 100);
+                       }
+
+                       tinyMCE.dispatchCallback(null, 'oninit', 'onInit');
+               }
+       },
+
+       isInstance : function(o) {
+               return o != null && typeof(o) == "object" && o.isTinyMCE_Control;
+       },
+
+       getParam : function(name, default_value, strip_whitespace, split_chr) {
+               var i, outArray, value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];
+
+               // Fix bool values
+               if (value == "true" || value == "false")
+                       return (value == "true");
+
+               if (strip_whitespace)
+                       value = tinyMCE.regexpReplace(value, "[ \t\r\n]", "");
+
+               if (typeof(split_chr) != "undefined" && split_chr != null) {
+                       value = value.split(split_chr);
+                       outArray = [];
+
+                       for (i=0; i<value.length; i++) {
+                               if (value[i] && value[i] !== '')
+                                       outArray[outArray.length] = value[i];
+                       }
+
+                       value = outArray;
+               }
+
+               return value;
+       },
+
+       getLang : function(name, default_value, parse_entities, va) {
+               var v = (typeof(tinyMCELang[name]) == "undefined") ? default_value : tinyMCELang[name], n;
+
+               if (parse_entities)
+                       v = tinyMCE.entityDecode(v);
+
+               if (va) {
+                       for (n in va)
+                               v = this.replaceVar(v, n, va[n]);
+               }
+
+               return v;
+       },
+
+       entityDecode : function(s) {
+               var e = document.createElement("div");
+
+               e.innerHTML = s;
+
+               return !e.firstChild ? s : e.firstChild.nodeValue;
+       },
+
+       addToLang : function(prefix, ar) {
+               var k;
+
+               for (k in ar) {
+                       if (typeof(ar[k]) == 'function')
+                               continue;
+
+                       tinyMCELang[(k.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix !== '' ? (prefix + "_") : '') + k] = ar[k];
+               }
+
+               this.loadNextScript();
+       },
+
+       triggerNodeChange : function(focus, setup_content) {
+               var elm, inst, editorId, undoIndex = -1, undoLevels = -1, doc, anySelection, st;
+
+               if (tinyMCE.selectedInstance) {
+                       inst = tinyMCE.selectedInstance;
+                       elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();
+
+/*                     if (elm == inst.lastTriggerEl)
+                               return;
+
+                       inst.lastTriggerEl = elm;*/
+
+                       editorId = inst.editorId;
+                       st = inst.selection.getSelectedText();
+
+                       if (tinyMCE.settings.auto_resize)
+                               inst.resizeToContent();
+
+                       if (setup_content && tinyMCE.isGecko && inst.isHidden())
+                               elm = inst.getBody();
+
+                       inst.switchSettings();
+                       anySelection = !inst.selection.isCollapsed();
+
+                       if (tinyMCE.settings.custom_undo_redo) {
+                               undoIndex = inst.undoRedo.undoIndex;
+                               undoLevels = inst.undoRedo.undoLevels.length;
+                       }
+
+                       tinyMCE.dispatchCallback(inst, 'handle_node_change_callback', 'handleNodeChange', editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content);
+               }
+
+               if (this.selectedInstance && (typeof(focus) == "undefined" || focus))
+                       this.selectedInstance.contentWindow.focus();
+       },
+
+       _customCleanup : function(inst, type, content) {
+               var pl, po, i, customCleanup;
+
+               // Call custom cleanup
+               customCleanup = tinyMCE.settings.cleanup_callback;
+               if (customCleanup != '')
+                       content = tinyMCE.resolveDots(tinyMCE.settings.cleanup_callback, window)(type, content, inst);
+
+               // Trigger theme cleanup
+               po = tinyMCE.themes[tinyMCE.settings.theme];
+               if (po && po.cleanup)
+                       content = po.cleanup(type, content, inst);
+
+               // Trigger plugin cleanups
+               pl = inst.plugins;
+               for (i=0; i<pl.length; i++) {
+                       po = tinyMCE.plugins[pl[i]];
+
+                       if (po && po.cleanup)
+                               content = po.cleanup(type, content, inst);
+               }
+
+               return content;
+       },
+
+       setContent : function(h) {
+               if (tinyMCE.selectedInstance) {
+                       tinyMCE.selectedInstance.execCommand('mceSetContent', false, h);
+                       tinyMCE.selectedInstance.repaint();
+               }
+       },
+
+       importThemeLanguagePack : function(name) {
+               if (typeof(name) == "undefined")
+                       name = tinyMCE.settings.theme;
+
+               tinyMCE.loadScript(tinyMCE.baseURL + '/themes/' + name + '/langs/' + tinyMCE.settings.language + '.js');
+       },
+
+       importPluginLanguagePack : function(name) {
+               var b = tinyMCE.baseURL + '/plugins/' + name;
+
+               if (this.plugins[name])
+                       b = this.plugins[name].baseURL;
+
+               tinyMCE.loadScript(b + '/langs/' + tinyMCE.settings.language +  '.js');
+       },
+
+       applyTemplate : function(h, ag) {
+               return h.replace(new RegExp('\\{\\$([a-z0-9_]+)\\}', 'gi'), function(m, s) {
+                       if (s.indexOf('lang_') == 0 && tinyMCELang[s])
+                               return tinyMCELang[s];
+
+                       if (ag && ag[s])
+                               return ag[s];
+
+                       if (tinyMCE.settings[s])
+                               return tinyMCE.settings[s];
+
+                       if (m == 'themeurl')
+                               return tinyMCE.themeURL;
+
+                       return m;
+               });
+       },
+
+       replaceVar : function(h, r, v) {
+               return h.replace(new RegExp('{\\\$' + r + '}', 'g'), v);
+       },
+
+       openWindow : function(template, args) {
+               var html, width, height, x, y, resizable, scrollbars, url, name, win, modal, features;
+
+               args = !args ? {} : args;
+
+               args.mce_template_file = template.file;
+               args.mce_width = template.width;
+               args.mce_height = template.height;
+               tinyMCE.windowArgs = args;
+
+               html = template.html;
+               if (!(width = parseInt(template.width)))
+                       width = 320;
+
+               if (!(height = parseInt(template.height)))
+                       height = 200;
+
+               // Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!
+               if (tinyMCE.isIE)
+                       height += 40;
+               else
+                       height += 20;
+
+               x = parseInt(screen.width / 2.0) - (width / 2.0);
+               y = parseInt(screen.height / 2.0) - (height / 2.0);
+
+               resizable = (args && args.resizable) ? args.resizable : "no";
+               scrollbars = (args && args.scrollbars) ? args.scrollbars : "no";
+
+               if (template.file.charAt(0) != '/' && template.file.indexOf('://') == -1)
+                       url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template.file;
+               else
+                       url = template.file;
+
+               // Replace all args as variables in URL
+               for (name in args) {
+                       if (typeof(args[name]) == 'function')
+                               continue;
+
+                       url = tinyMCE.replaceVar(url, name, escape(args[name]));
+               }
+
+               if (html) {
+                       html = tinyMCE.replaceVar(html, "css", this.settings.popups_css);
+                       html = tinyMCE.applyTemplate(html, args);
+
+                       win = window.open("", "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=yes,minimizable=" + resizable + ",modal=yes,width=" + width + ",height=" + height + ",resizable=" + resizable);
+                       if (win == null) {
+                               alert(tinyMCELang.lang_popup_blocked);
+                               return;
+                       }
+
+                       win.document.write(html);
+                       win.document.close();
+                       win.resizeTo(width, height);
+                       win.focus();
+               } else {
+                       if ((tinyMCE.isRealIE) && resizable != 'yes' && tinyMCE.settings.dialog_type == "modal") {
+                               height += 10;
+
+                               features = "resizable:" + resizable + ";scroll:" + scrollbars + ";status:yes;center:yes;help:no;dialogWidth:" + width + "px;dialogHeight:" + height + "px;";
+
+                               window.showModalDialog(url, window, features);
+                       } else {
+                               modal = (resizable == "yes") ? "no" : "yes";
+
+                               if (tinyMCE.isGecko && tinyMCE.isMac)
+                                       modal = "no";
+
+                               if (template.close_previous != "no")
+                                       try {tinyMCE.lastWindow.close();} catch (ex) {}
+
+                               win = window.open(url, "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=" + modal + ",minimizable=" + resizable + ",modal=" + modal + ",width=" + width + ",height=" + height + ",resizable=" + resizable);
+                               if (win == null) {
+                                       alert(tinyMCELang.lang_popup_blocked);
+                                       return;
+                               }
+
+                               if (template.close_previous != "no")
+                                       tinyMCE.lastWindow = win;
+
+                               try {
+                                       win.resizeTo(width, height);
+                               } catch(e) {
+                                       // Ignore
+                               }
+
+                               // Make it bigger if statusbar is forced
+                               if (tinyMCE.isGecko && win.document) {
+                                       if (win.document.defaultView.statusbar.visible)
+                                               win.resizeBy(0, tinyMCE.isMac ? 10 : 24);
+                               }
+
+                               win.focus();
+                       }
+               }
+       },
+
+       closeWindow : function(win) {
+               win.close();
+       },
+
+       getVisualAidClass : function(class_name, state) {
+               var i, classNames, ar, className, aidClass = tinyMCE.settings.visual_table_class;
+
+               if (typeof(state) == "undefined")
+                       state = tinyMCE.settings.visual;
+
+               // Split
+               classNames = [];
+               ar = class_name.split(' ');
+               for (i=0; i<ar.length; i++) {
+                       if (ar[i] == aidClass)
+                               ar[i] = "";
+
+                       if (ar[i] !== '')
+                               classNames[classNames.length] = ar[i];
+               }
+
+               if (state)
+                       classNames[classNames.length] = aidClass;
+
+               // Glue
+               className = "";
+               for (i=0; i<classNames.length; i++) {
+                       if (i > 0)
+                               className += " ";
+
+                       className += classNames[i];
+               }
+
+               return className;
+       },
+
+       handleVisualAid : function(el, deep, state, inst, skip_dispatch) {
+               var i, x, y, tableElement, anchorName, oldW, oldH, bo, cn;
+
+               if (!el)
+                       return;
+
+               if (!skip_dispatch)
+                       tinyMCE.dispatchCallback(inst, 'handle_visual_aid_callback', 'handleVisualAid', el, deep, state, inst);
+
+               tableElement = null;
+
+               switch (el.nodeName) {
+                       case "TABLE":
+                               oldW = el.style.width;
+                               oldH = el.style.height;
+                               bo = tinyMCE.getAttrib(el, "border");
+
+                               bo = bo == '' || bo == "0" ? true : false;
+
+                               tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo));
+
+                               el.style.width = oldW;
+                               el.style.height = oldH;
+
+                               for (y=0; y<el.rows.length; y++) {
+                                       for (x=0; x<el.rows[y].cells.length; x++) {
+                                               cn = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x], "class"), state && bo);
+                                               tinyMCE.setAttrib(el.rows[y].cells[x], "class", cn);
+                                       }
+                               }
+
+                               break;
+
+                       case "A":
+                               anchorName = tinyMCE.getAttrib(el, "name");
+
+                               if (anchorName !== '' && state) {
+                                       el.title = anchorName;
+                                       tinyMCE.addCSSClass(el, 'mceItemAnchor');
+                               } else if (anchorName !== '' && !state)
+                                       el.className = '';
+
+                               break;
+               }
+
+               if (deep && el.hasChildNodes()) {
+                       for (i=0; i<el.childNodes.length; i++)
+                               tinyMCE.handleVisualAid(el.childNodes[i], deep, state, inst, true);
+               }
+       },
+
+       fixGeckoBaseHREFBug : function(m, e, h) {
+               var xsrc, xhref;
+
+               if (tinyMCE.isGecko) {
+                       if (m == 1) {
+                               h = h.replace(/\ssrc=/gi, " mce_tsrc=");
+                               h = h.replace(/\shref=/gi, " mce_thref=");
+
+                               return h;
+                       } else {
+                               // Why bother if there is no src or href broken
+                               if (!new RegExp('(src|href)=', 'g').test(h))
+                                       return h;
+
+                               // Restore src and href that gets messed up by Gecko
+                               tinyMCE.selectElements(e, 'A,IMG,SELECT,AREA,IFRAME,BASE,INPUT,SCRIPT,EMBED,OBJECT,LINK', function (n) {
+                                       xsrc = tinyMCE.getAttrib(n, "mce_tsrc");
+                                       xhref = tinyMCE.getAttrib(n, "mce_thref");
+
+                                       if (xsrc !== '') {
+                                               try {
+                                                       n.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, xsrc);
+                                               } catch (e) {
+                                                       // Ignore, Firefox cast exception if local file wasn't found
+                                               }
+
+                                               n.removeAttribute("mce_tsrc");
+                                       }
+
+                                       if (xhref !== '') {
+                                               try {
+                                                       n.href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, xhref);
+                                               } catch (e) {
+                                                       // Ignore, Firefox cast exception if local file wasn't found
+                                               }
+
+                                               n.removeAttribute("mce_thref");
+                                       }
+
+                                       return false;
+                               });
+
+                               // Restore text/comment nodes
+                               tinyMCE.selectNodes(e, function(n) {
+                                       if (n.nodeType == 3 || n.nodeType == 8) {
+                                               n.nodeValue = n.nodeValue.replace(/\smce_tsrc=/gi, " src=");
+                                               n.nodeValue = n.nodeValue.replace(/\smce_thref=/gi, " href=");
+                                       }
+
+                                       return false;
+                               });
+                       }
+               }
+
+               return h;
+       },
+
+       _setHTML : function(doc, html_content) {
+               var i, html, paras, node;
+
+               // Force closed anchors open
+               //html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');
+
+               html_content = tinyMCE.cleanupHTMLCode(html_content);
+
+               // Try innerHTML if it fails use pasteHTML in MSIE
+               try {
+                       tinyMCE.setInnerHTML(doc.body, html_content);
+               } catch (e) {
+                       if (this.isMSIE)
+                               doc.body.createTextRange().pasteHTML(html_content);
+               }
+
+               // Content duplication bug fix
+               if (tinyMCE.isIE && tinyMCE.settings.fix_content_duplication) {
+                       // Remove P elements in P elements
+                       paras = doc.getElementsByTagName("P");
+                       for (i=0; i<paras.length; i++) {
+                               node = paras[i];
+
+                               while ((node = node.parentNode) != null) {
+                                       if (node.nodeName == "P")
+                                               node.outerHTML = node.innerHTML;
+                               }
+                       }
+
+                       // Content duplication bug fix (Seems to be word crap)
+                       html = doc.body.innerHTML;
+
+                       // Always set the htmlText output
+                       tinyMCE.setInnerHTML(doc.body, html);
+               }
+
+               tinyMCE.cleanupAnchors(doc);
+
+               if (tinyMCE.getParam("convert_fonts_to_spans"))
+                       tinyMCE.convertSpansToFonts(doc);
+       },
+
+       getEditorId : function(form_element) {
+               var inst = this.getInstanceById(form_element);
+
+               if (!inst)
+                       return null;
+
+               return inst.editorId;
+       },
+
+       getInstanceById : function(editor_id) {
+               var inst = this.instances[editor_id], n;
+
+               if (!inst) {
+                       for (n in tinyMCE.instances) {
+                               inst = tinyMCE.instances[n];
+
+                               if (!tinyMCE.isInstance(inst))
+                                       continue;
+
+                               if (inst.formTargetElementId == editor_id)
+                                       return inst;
+                       }
+               } else
+                       return inst;
+
+               return null;
+       },
+
+       queryInstanceCommandValue : function(editor_id, command) {
+               var inst = tinyMCE.getInstanceById(editor_id);
+
+               if (inst)
+                       return inst.queryCommandValue(command);
+
+               return false;
+       },
+
+       queryInstanceCommandState : function(editor_id, command) {
+               var inst = tinyMCE.getInstanceById(editor_id);
+
+               if (inst)
+                       return inst.queryCommandState(command);
+
+               return null;
+       },
+
+       setWindowArg : function(n, v) {
+               this.windowArgs[n] = v;
+       },
+
+       getWindowArg : function(n, d) {
+               return (typeof(this.windowArgs[n]) == "undefined") ? d : this.windowArgs[n];
+       },
+
+       getCSSClasses : function(editor_id, doc) {
+               var i, c, x, rule, styles, rules, csses, selectorText, inst = tinyMCE.getInstanceById(editor_id);
+               var cssClass, addClass, p;
+
+               if (!inst)
+                       inst = tinyMCE.selectedInstance;
+
+               if (!inst)
+                       return [];
+
+               if (!doc)
+                       doc = inst.getDoc();
+
+               // Is cached, use that
+               if (inst && inst.cssClasses.length > 0)
+                       return inst.cssClasses;
+
+               if (!doc)
+                       return;
+
+               styles = doc.styleSheets;
+
+               if (styles && styles.length > 0) {
+                       for (x=0; x<styles.length; x++) {
+                               csses = null;
+
+                               try {
+                                       csses = tinyMCE.isIE ? doc.styleSheets(x).rules : styles[x].cssRules;
+                               } catch(e) {
+                                       // Just ignore any errors I know this is ugly!!
+                               }
+       
+                               if (!csses)
+                                       return [];
+
+                               for (i=0; i<csses.length; i++) {
+                                       selectorText = csses[i].selectorText;
+
+                                       // Can be multiple rules per selector
+                                       if (selectorText) {
+                                               rules = selectorText.split(',');
+                                               for (c=0; c<rules.length; c++) {
+                                                       rule = rules[c];
+
+                                                       // Strip spaces between selectors
+                                                       while (rule.indexOf(' ') == 0)
+                                                               rule = rule.substring(1);
+
+                                                       // Invalid rule
+                                                       if (rule.indexOf(' ') != -1 || rule.indexOf(':') != -1 || rule.indexOf('mceItem') != -1)
+                                                               continue;
+
+                                                       if (rule.indexOf(tinyMCE.settings.visual_table_class) != -1 || rule.indexOf('mceEditable') != -1 || rule.indexOf('mceNonEditable') != -1)
+                                                               continue;
+
+                                                       // Is class rule
+                                                       if (rule.indexOf('.') != -1) {
+                                                               cssClass = rule.substring(rule.indexOf('.') + 1);
+                                                               addClass = true;
+
+                                                               for (p=0; p<inst.cssClasses.length && addClass; p++) {
+                                                                       if (inst.cssClasses[p] == cssClass)
+                                                                               addClass = false;
+                                                               }
+
+                                                               if (addClass)
+                                                                       inst.cssClasses[inst.cssClasses.length] = cssClass;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               return inst.cssClasses;
+       },
+
+       regexpReplace : function(in_str, reg_exp, replace_str, opts) {
+               var re;
+
+               if (in_str == null)
+                       return in_str;
+
+               if (typeof(opts) == "undefined")
+                       opts = 'g';
+
+               re = new RegExp(reg_exp, opts);
+
+               return in_str.replace(re, replace_str);
+       },
+
+       trim : function(s) {
+               return s.replace(/^\s*|\s*$/g, "");
+       },
+
+       cleanupEventStr : function(s) {
+               s = "" + s;
+               s = s.replace('function anonymous()\n{\n', '');
+               s = s.replace('\n}', '');
+               s = s.replace(/^return true;/gi, ''); // Remove event blocker
+
+               return s;
+       },
+
+       getControlHTML : function(c) {
+               var i, l, n, o, v, rtl = tinyMCE.getLang('lang_dir') == 'rtl';
+
+               l = tinyMCE.plugins;
+               for (n in l) {
+                       o = l[n];
+
+                       if (o.getControlHTML && (v = o.getControlHTML(c)) !== '') {
+                               if (rtl)
+                                       return '<span dir="rtl">' + tinyMCE.replaceVar(v, "pluginurl", o.baseURL) + '</span>';
+
+                               return tinyMCE.replaceVar(v, "pluginurl", o.baseURL);
+                       }
+               }
+
+               o = tinyMCE.themes[tinyMCE.settings.theme];
+               if (o.getControlHTML && (v = o.getControlHTML(c)) !== '') {
+                       if (rtl)
+                               return '<span dir="rtl">' + v + '</span>';
+
+                       return v;
+               }
+
+               return '';
+       },
+
+       evalFunc : function(f, idx, a, o) {
+               o = !o ? window : o;
+               f = typeof(f) == 'function' ? f : o[f];
+
+               return f.apply(o, Array.prototype.slice.call(a, idx));
+       },
+
+       dispatchCallback : function(i, p, n) {
+               return this.callFunc(i, p, n, 0, this.dispatchCallback.arguments);
+       },
+
+       executeCallback : function(i, p, n) {
+               return this.callFunc(i, p, n, 1, this.executeCallback.arguments);
+       },
+
+       execCommandCallback : function(i, p, n) {
+               return this.callFunc(i, p, n, 2, this.execCommandCallback.arguments);
+       },
+
+       callFunc : function(ins, p, n, m, a) {
+               var l, i, on, o, s, v;
+
+               s = m == 2;
+
+               l = tinyMCE.getParam(p, '');
+
+               if (l !== '' && (v = tinyMCE.evalFunc(l, 3, a)) == s && m > 0)
+                       return true;
+
+               if (ins != null) {
+                       for (i=0, l = ins.plugins; i<l.length; i++) {
+                               o = tinyMCE.plugins[l[i]];
+
+                               if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0)
+                                       return true;
+                       }
+               }
+
+               l = tinyMCE.themes;
+               for (on in l) {
+                       o = l[on];
+
+                       if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0)
+                               return true;
+               }
+
+               return false;
+       },
+
+       resolveDots : function(s, o) {
+               var i;
+
+               if (typeof(s) == 'string') {
+                       for (i=0, s=s.split('.'); i<s.length; i++)
+                               o = o[s[i]];
+               } else
+                       o = s;
+
+               return o;
+       },
+
+       xmlEncode : function(s) {
+               return s ? ('' + s).replace(this.xmlEncodeRe, function (c, b) {
+                       switch (c) {
+                               case '&':
+                                       return '&amp;';
+
+                               case '"':
+                                       return '&quot;';
+
+                               case '<':
+                                       return '&lt;';
+
+                               case '>':
+                                       return '&gt;';
+                       }
+
+                       return c;
+               }) : s;
+       },
+
+       add : function(c, m) {
+               var n;
+
+               for (n in m) {
+                       if (m.hasOwnProperty(n))
+                               c.prototype[n] = m[n];
+               }
+       },
+
+       extend : function(p, np) {
+               var o = {}, n;
+
+               o.parent = p;
+
+               for (n in p) {
+                       if (p.hasOwnProperty(n))
+                               o[n] = p[n];
+               }
+
+               for (n in np) {
+                       if (np.hasOwnProperty(n))
+                               o[n] = np[n];
+               }
+
+               return o;
+       },
+
+       hideMenus : function() {
+               var e = tinyMCE.lastSelectedMenuBtn;
+
+               if (tinyMCE.lastMenu) {
+                       tinyMCE.lastMenu.hide();
+                       tinyMCE.lastMenu = null;
+               }
+
+               if (e) {
+                       tinyMCE.switchClass(e, tinyMCE.lastMenuBtnClass);
+                       tinyMCE.lastSelectedMenuBtn = null;
+               }
+       }
+
+       };
+
+// Global instances
+var TinyMCE = TinyMCE_Engine; // Compatiblity with gzip compressors
+var tinyMCE = new TinyMCE_Engine();
+var tinyMCELang = {};
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Control.class.js */
+
+function TinyMCE_Control(settings) {
+       var t, i, tos, fu, p, x, fn, fu, pn, s = settings;
+
+       this.undoRedoLevel = true;
+       this.isTinyMCE_Control = true;
+
+       // Default settings
+       this.enabled = true;
+       this.settings = s;
+       this.settings.theme = tinyMCE.getParam("theme", "default");
+       this.settings.width = tinyMCE.getParam("width", -1);
+       this.settings.height = tinyMCE.getParam("height", -1);
+       this.selection = new TinyMCE_Selection(this);
+       this.undoRedo = new TinyMCE_UndoRedo(this);
+       this.cleanup = new TinyMCE_Cleanup();
+       this.shortcuts = [];
+       this.hasMouseMoved = false;
+       this.foreColor = this.backColor = "#999999";
+       this.data = {};
+       this.cssClasses = [];
+
+       this.cleanup.init({
+               valid_elements : s.valid_elements,
+               extended_valid_elements : s.extended_valid_elements,
+               valid_child_elements : s.valid_child_elements,
+               entities : s.entities,
+               entity_encoding : s.entity_encoding,
+               debug : s.cleanup_debug,
+               indent : s.apply_source_formatting,
+               invalid_elements : s.invalid_elements,
+               verify_html : s.verify_html,
+               fix_content_duplication : s.fix_content_duplication,
+               convert_fonts_to_spans : s.convert_fonts_to_spans
+       });
+
+       // Wrap old theme
+       t = this.settings.theme;
+       if (!tinyMCE.hasTheme(t)) {
+               fn = tinyMCE.callbacks;
+               tos = {};
+
+               for (i=0; i<fn.length; i++) {
+                       if ((fu = window['TinyMCE_' + t + "_" + fn[i]]))
+                               tos[fn[i]] = fu;
+               }
+
+               tinyMCE.addTheme(t, tos);
+       }
+
+       // Wrap old plugins
+       this.plugins = [];
+       p = tinyMCE.getParam('plugins', '', true, ',');
+       if (p.length > 0) {
+               for (i=0; i<p.length; i++) {
+                       pn = p[i];
+
+                       if (pn.charAt(0) == '-')
+                               pn = pn.substring(1);
+
+                       if (!tinyMCE.hasPlugin(pn)) {
+                               fn = tinyMCE.callbacks;
+                               tos = {};
+
+                               for (x=0; x<fn.length; x++) {
+                                       if ((fu = window['TinyMCE_' + pn + "_" + fn[x]]))
+                                               tos[fn[x]] = fu;
+                               }
+
+                               tinyMCE.addPlugin(pn, tos);
+                       }
+
+                       this.plugins[this.plugins.length] = pn; 
+               }
+       }
+};
+
+TinyMCE_Control.prototype = {
+       selection : null,
+
+       settings : null,
+
+       cleanup : null,
+
+       getData : function(na) {
+               var o = this.data[na];
+
+               if (!o)
+                       o = this.data[na] = {};
+
+               return o;
+       },
+
+       hasPlugin : function(n) {
+               var i;
+
+               for (i=0; i<this.plugins.length; i++) {
+                       if (this.plugins[i] == n)
+                               return true;
+               }
+
+               return false;
+       },
+
+       addPlugin : function(n, p) {
+               if (!this.hasPlugin(n)) {
+                       tinyMCE.addPlugin(n, p);
+                       this.plugins[this.plugins.length] = n;
+               }
+       },
+
+       repaint : function() {
+               var s, b, ex;
+
+               if (tinyMCE.isRealIE)
+                       return;
+
+               try {
+                       s = this.selection;
+                       b = s.getBookmark(true);
+                       this.getBody().style.display = 'none';
+                       this.getDoc().execCommand('selectall', false, null);
+                       this.getSel().collapseToStart();
+                       this.getBody().style.display = 'block';
+                       s.moveToBookmark(b);
+               } catch (ex) {
+                       // Ignore
+               }
+       },
+
+       switchSettings : function() {
+               if (tinyMCE.configs.length > 1 && tinyMCE.currentConfig != this.settings.index) {
+                       tinyMCE.settings = this.settings;
+                       tinyMCE.currentConfig = this.settings.index;
+               }
+       },
+
+       select : function() {
+               var oldInst = tinyMCE.selectedInstance;
+
+               if (oldInst != this) {
+                       if (oldInst)
+                               oldInst.execCommand('mceEndTyping');
+
+                       tinyMCE.dispatchCallback(this, 'select_instance_callback', 'selectInstance', this, oldInst);
+                       tinyMCE.selectedInstance = this;
+               }
+       },
+
+       getBody : function() {
+               return this.contentBody ? this.contentBody : this.getDoc().body;
+       },
+
+       getDoc : function() {
+//             return this.contentDocument ? this.contentDocument : this.contentWindow.document; // Removed due to IE 5.5 ?
+               return this.contentWindow.document;
+       },
+
+       getWin : function() {
+               return this.contentWindow;
+       },
+
+       getContainerWin : function() {
+               return this.containerWindow ? this.containerWindow : window;
+       },
+
+       getViewPort : function() {
+               return tinyMCE.getViewPort(this.getWin());
+       },
+
+       getParentNode : function(n, f) {
+               return tinyMCE.getParentNode(n, f, this.getBody());
+       },
+
+       getParentElement : function(n, na, f) {
+               return tinyMCE.getParentElement(n, na, f, this.getBody());
+       },
+
+       getParentBlockElement : function(n) {
+               return tinyMCE.getParentBlockElement(n, this.getBody());
+       },
+
+       resizeToContent : function() {
+               var d = this.getDoc(), b = d.body, de = d.documentElement;
+
+               this.iframeElement.style.height = (tinyMCE.isRealIE) ? b.scrollHeight : de.offsetHeight + 'px';
+       },
+
+       addShortcut : function(m, k, d, cmd, ui, va) {
+               var n = typeof(k) == "number", ie = tinyMCE.isIE, c, sc, i, scl = this.shortcuts;
+
+               if (!tinyMCE.getParam('custom_shortcuts'))
+                       return false;
+
+               m = m.toLowerCase();
+               k = ie && !n ? k.toUpperCase() : k;
+               c = n ? null : k.charCodeAt(0);
+               d = d && d.indexOf('lang_') == 0 ? tinyMCE.getLang(d) : d;
+
+               sc = {
+                       alt : m.indexOf('alt') != -1,
+                       ctrl : m.indexOf('ctrl') != -1,
+                       shift : m.indexOf('shift') != -1,
+                       charCode : c,
+                       keyCode : n ? k : (ie ? c : null),
+                       desc : d,
+                       cmd : cmd,
+                       ui : ui,
+                       val : va
+               };
+
+               for (i=0; i<scl.length; i++) {
+                       if (sc.alt == scl[i].alt && sc.ctrl == scl[i].ctrl && sc.shift == scl[i].shift
+                               && sc.charCode == scl[i].charCode && sc.keyCode == scl[i].keyCode) {
+                               return false;
+                       }
+               }
+
+               scl[scl.length] = sc;
+
+               return true;
+       },
+
+       handleShortcut : function(e) {
+               var i, s, o;
+
+               // Normal key press, then ignore it
+               if (!e.altKey && !e.ctrlKey)
+                       return false;
+
+               s = this.shortcuts;
+
+               for (i=0; i<s.length; i++) {
+                       o = s[i];
+
+                       if (o.alt == e.altKey && o.ctrl == e.ctrlKey && (o.keyCode == e.keyCode || o.charCode == e.charCode)) {
+                               if (o.cmd && (e.type == "keydown" || (e.type == "keypress" && !tinyMCE.isOpera)))
+                                       tinyMCE.execCommand(o.cmd, o.ui, o.val);
+
+                               tinyMCE.cancelEvent(e);
+                               return true;
+                       }
+               }
+
+               return false;
+       },
+
+       autoResetDesignMode : function() {
+               // Add fix for tab/style.display none/block problems in Gecko
+               if (!tinyMCE.isIE && this.isHidden() && tinyMCE.getParam('auto_reset_designmode'))
+                       eval('try { this.getDoc().designMode = "On"; this.useCSS = false; } catch(e) {}');
+       },
+
+       isHidden : function() {
+               var s;
+
+               if (tinyMCE.isIE)
+                       return false;
+
+               s = this.getSel();
+
+               // Weird, wheres that cursor selection?
+               return (!s || !s.rangeCount || s.rangeCount == 0);
+       },
+
+       isDirty : function() {
+               // Is content modified and not in a submit procedure
+               return tinyMCE.trim(this.startContent) != tinyMCE.trim(this.getBody().innerHTML) && !this.isNotDirty;
+       },
+
+       _mergeElements : function(scmd, pa, ch, override) {
+               var st, stc, className, n;
+
+               if (scmd == "removeformat") {
+                       pa.className = "";
+                       pa.style.cssText = "";
+                       ch.className = "";
+                       ch.style.cssText = "";
+                       return;
+               }
+
+               st = tinyMCE.parseStyle(tinyMCE.getAttrib(pa, "style"));
+               stc = tinyMCE.parseStyle(tinyMCE.getAttrib(ch, "style"));
+               className = tinyMCE.getAttrib(pa, "class");
+
+               // Removed class adding due to bug #1478272
+               className = tinyMCE.getAttrib(ch, "class");
+
+               if (override) {
+                       for (n in st) {
+                               if (typeof(st[n]) == 'function')
+                                       continue;
+
+                               stc[n] = st[n];
+                       }
+               } else {
+                       for (n in stc) {
+                               if (typeof(stc[n]) == 'function')
+                                       continue;
+
+                               st[n] = stc[n];
+                       }
+               }
+
+               tinyMCE.setAttrib(pa, "style", tinyMCE.serializeStyle(st));
+               tinyMCE.setAttrib(pa, "class", tinyMCE.trim(className));
+               ch.className = "";
+               ch.style.cssText = "";
+               ch.removeAttribute("class");
+               ch.removeAttribute("style");
+       },
+
+       _fixRootBlocks : function() {
+               var rb, b, ne, be, nx, bm;
+
+               rb = tinyMCE.getParam('forced_root_block');
+               if (!rb)
+                       return;
+
+               b = this.getBody();
+               ne = b.firstChild;
+
+               while (ne) {
+                       nx = ne.nextSibling;
+
+                       // If text node or inline element wrap it in a block element
+                       if ((ne.nodeType == 3 && ne.nodeValue.replace(/\s+/g, '') != '') || (ne.nodeType == 1 && !tinyMCE.blockRegExp.test(ne.nodeName))) {
+                               if (!bm)
+                                       bm = this.selection.getBookmark();
+
+                               if (!be) {
+                                       be = this.getDoc().createElement(rb);
+                                       be.appendChild(ne.cloneNode(true));
+                                       b.replaceChild(be, ne);
+                               } else {
+                                       be.appendChild(ne.cloneNode(true));
+                                       b.removeChild(ne);
+                               }
+                       } else
+                               be = null;
+
+                       ne = nx;
+               }
+
+               if (bm)
+                       this.selection.moveToBookmark(bm);
+       },
+
+       _fixTrailingNbsp : function() {
+               var s = this.selection, e = s.getFocusElement(), bm, v;
+
+               if (e && tinyMCE.blockRegExp.test(e.nodeName) && e.firstChild) {
+                       v = e.firstChild.nodeValue;
+
+                       if (v && v.length > 1 && /(^\u00a0|\u00a0$)/.test(v)) {
+                               e.firstChild.nodeValue = v.replace(/(^\u00a0|\u00a0$)/, '');
+                               s.selectNode(e.firstChild, true, false, false); // Select and collapse
+                       }
+               }
+       },
+
+       _setUseCSS : function(b) {
+               var d = this.getDoc();
+
+               try {d.execCommand("useCSS", false, !b);} catch (ex) {}
+               try {d.execCommand("styleWithCSS", false, b);} catch (ex) {}
+
+               if (!tinyMCE.getParam("table_inline_editing"))
+                       try {d.execCommand('enableInlineTableEditing', false, "false");} catch (ex) {}
+
+               if (!tinyMCE.getParam("object_resizing"))
+                       try {d.execCommand('enableObjectResizing', false, "false");} catch (ex) {}
+       },
+
+       execCommand : function(command, user_interface, value) {
+               var i, x, z, align, img, div, doc = this.getDoc(), win = this.getWin(), focusElm = this.getFocusElement();
+
+               // Is not a undo specific command
+               if (!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel', 'gi').test(command))
+                       this.undoBookmark = null;
+
+               // Mozilla issue
+               if (!tinyMCE.isIE && !this.useCSS) {
+                       this._setUseCSS(false);
+                       this.useCSS = true;
+               }
+
+               //debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);
+               this.contentDocument = doc; // <-- Strange, unless this is applied Mozilla 1.3 breaks
+
+               // Don't dispatch key commands
+               if (!/mceStartTyping|mceEndTyping/.test(command)) {
+                       if (tinyMCE.execCommandCallback(this, 'execcommand_callback', 'execCommand', this.editorId, this.getBody(), command, user_interface, value))
+                               return;
+               }
+
+               // Fix align on images
+               if (focusElm && focusElm.nodeName == "IMG") {
+                       align = focusElm.getAttribute('align');
+                       img = command == "JustifyCenter" ? focusElm.cloneNode(false) : focusElm;
+
+                       switch (command) {
+                               case "JustifyLeft":
+                                       if (align == 'left') {
+                                               img.setAttribute('align', ''); // Needed for IE
+                                               img.removeAttribute('align');
+                                       } else
+                                               img.setAttribute('align', 'left');
+
+                                       // Remove the div
+                                       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.setAttribute('align', ''); // Needed for IE
+                                       img.removeAttribute('align');
+
+                                       // Is centered
+                                       div = tinyMCE.getParentElement(focusElm, "div");
+                                       if (div && div.style.textAlign == "center") {
+                                               // Remove div
+                                               if (div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)
+                                                       div.parentNode.replaceChild(img, div);
+                                       } else {
+                                               // Add div
+                                               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.setAttribute('align', ''); // Needed for IE
+                                               img.removeAttribute('align');
+                                       } else
+                                               img.setAttribute('align', 'right');
+
+                                       // Remove the div
+                                       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 "JustifyLeft":
+                       case "JustifyCenter":
+                       case "JustifyFull":
+                       case "JustifyRight":
+                               var el = tinyMCE.getParentNode(focusElm, function(n) {return tinyMCE.getAttrib(n, 'align');});
+
+                               if (el) {
+                                       el.setAttribute('align', ''); // Needed for IE
+                                       el.removeAttribute('align');
+                               } else
+                                       this.getDoc().execCommand(command, user_interface, value);
+
+                               tinyMCE.triggerNodeChange();
+
+                               return true;
+
+                       case "unlink":
+                               // Unlink if caret is inside link
+                               if (tinyMCE.isGecko && this.getSel().isCollapsed) {
+                                       focusElm = tinyMCE.getParentElement(focusElm, 'A');
+
+                                       if (focusElm)
+                                               this.selection.selectNode(focusElm, false);
+                               }
+
+                               this.getDoc().execCommand(command, user_interface, value);
+
+                               tinyMCE.isGecko && this.getSel().collapseToEnd();
+
+                               tinyMCE.triggerNodeChange();
+
+                               return true;
+
+                       case "InsertUnorderedList":
+                       case "InsertOrderedList":
+                               this.getDoc().execCommand(command, user_interface, value);
+                               tinyMCE.triggerNodeChange();
+                               break;
+
+                       case "Strikethrough":
+                               this.getDoc().execCommand(command, user_interface, value);
+                               tinyMCE.triggerNodeChange();
+                               break;
+
+                       case "mceSelectNode":
+                               this.selection.selectNode(value);
+                               tinyMCE.triggerNodeChange();
+                               tinyMCE.selectedNode = value;
+                               break;
+
+                       case "FormatBlock":
+                               if (value == null || value == '') {
+                                       var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");
+
+                                       if (elm)
+                                               this.execCommand("mceRemoveNode", false, elm);
+                               } else {
+                                       if (!this.cleanup.isValid(value))
+                                               return true;
+
+                                       if (tinyMCE.isGecko && new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>', 'gi').test(value))
+                                               value = value.replace(/[^a-z]/gi, '');
+
+                                       if (tinyMCE.isIE && new RegExp('blockquote|code|samp', 'gi').test(value)) {
+                                               var b = this.selection.getBookmark();
+                                               this.getDoc().execCommand("FormatBlock", false, '<p>');
+                                               tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()), value);
+                                               this.selection.moveToBookmark(b);
+                                       } else
+                                               this.getDoc().execCommand("FormatBlock", false, value);
+                               }
+
+                               tinyMCE.triggerNodeChange();
+
+                               break;
+
+                       case "mceRemoveNode":
+                               if (!value)
+                                       value = tinyMCE.getParentElement(this.getFocusElement());
+
+                               if (tinyMCE.isIE) {
+                                       value.outerHTML = value.innerHTML;
+                               } else {
+                                       var rng = value.ownerDocument.createRange();
+                                       rng.setStartBefore(value);
+                                       rng.setEndAfter(value);
+                                       rng.deleteContents();
+                                       rng.insertNode(rng.createContextualFragment(value.innerHTML));
+                               }
+
+                               tinyMCE.triggerNodeChange();
+
+                               break;
+
+                       case "mceSelectNodeDepth":
+                               var parentNode = this.getFocusElement();
+                               for (i=0; parentNode; i++) {
+                                       if (parentNode.nodeName.toLowerCase() == "body")
+                                               break;
+
+                                       if (parentNode.nodeName.toLowerCase() == "#text") {
+                                               i--;
+                                               parentNode = parentNode.parentNode;
+                                               continue;
+                                       }
+
+                                       if (i == value) {
+                                               this.selection.selectNode(parentNode, false);
+                                               tinyMCE.triggerNodeChange();
+                                               tinyMCE.selectedNode = parentNode;
+                                               return;
+                                       }
+
+                                       parentNode = parentNode.parentNode;
+                               }
+
+                               break;
+
+                       case "mceSetStyleInfo":
+                       case "SetStyleInfo":
+                               var rng = this.getRng();
+                               var sel = this.getSel();
+                               var scmd = value.command;
+                               var sname = value.name;
+                               var svalue = value.value == null ? '' : value.value;
+                               //var svalue = value['value'] == null ? '' : value['value'];
+                               var wrapper = value.wrapper ? value.wrapper : "span";
+                               var parentElm = null;
+                               var invalidRe = new RegExp("^BODY|HTML$", "g");
+                               var invalidParentsRe = tinyMCE.settings.merge_styles_invalid_parents !== '' ? new RegExp(tinyMCE.settings.merge_styles_invalid_parents, "gi") : null;
+
+                               // Whole element selected check
+                               if (tinyMCE.isIE) {
+                                       // Control range
+                                       if (rng.item)
+                                               parentElm = rng.item(0);
+                                       else {
+                                               var pelm = rng.parentElement();
+                                               var prng = doc.selection.createRange();
+                                               prng.moveToElementText(pelm);
+
+                                               if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) {
+                                                       if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName))
+                                                               parentElm = pelm;
+                                               }
+                                       }
+                               } else {
+                                       var felm = this.getFocusElement();
+                                       if (sel.isCollapsed || (new RegExp('td|tr|tbody|table|img', 'gi').test(felm.nodeName) && sel.anchorNode == felm.parentNode))
+                                               parentElm = felm;
+                               }
+
+                               // Whole element selected
+                               if (parentElm && !invalidRe.test(parentElm.nodeName)) {
+                                       if (scmd == "setstyle")
+                                               tinyMCE.setStyleAttrib(parentElm, sname, svalue);
+
+                                       if (scmd == "setattrib")
+                                               tinyMCE.setAttrib(parentElm, sname, svalue);
+
+                                       if (scmd == "removeformat") {
+                                               parentElm.style.cssText = '';
+                                               tinyMCE.setAttrib(parentElm, 'class', '');
+                                       }
+
+                                       // Remove style/attribs from all children
+                                       var ch = tinyMCE.getNodeTree(parentElm, [], 1);
+                                       for (z=0; z<ch.length; z++) {
+                                               if (ch[z] == parentElm)
+                                                       continue;
+
+                                               if (scmd == "setstyle")
+                                                       tinyMCE.setStyleAttrib(ch[z], sname, '');
+
+                                               if (scmd == "setattrib")
+                                                       tinyMCE.setAttrib(ch[z], sname, '');
+
+                                               if (scmd == "removeformat") {
+                                                       ch[z].style.cssText = '';
+                                                       tinyMCE.setAttrib(ch[z], 'class', '');
+                                               }
+                                       }
+                               } else {
+                                       this._setUseCSS(false); // Bug in FF when running in fullscreen
+                                       doc.execCommand("FontName", false, "#mce_temp_font#");
+                                       var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#");
+
+                                       // Change them all
+                                       for (x=0; x<elementArray.length; x++) {
+                                               elm = elementArray[x];
+                                               if (elm) {
+                                                       var spanElm = doc.createElement(wrapper);
+
+                                                       if (scmd == "setstyle")
+                                                               tinyMCE.setStyleAttrib(spanElm, sname, svalue);
+
+                                                       if (scmd == "setattrib")
+                                                               tinyMCE.setAttrib(spanElm, sname, svalue);
+
+                                                       if (scmd == "removeformat") {
+                                                               spanElm.style.cssText = '';
+                                                               tinyMCE.setAttrib(spanElm, 'class', '');
+                                                       }
+
+                                                       if (elm.hasChildNodes()) {
+                                                               for (i=0; i<elm.childNodes.length; i++)
+                                                                       spanElm.appendChild(elm.childNodes[i].cloneNode(true));
+                                                       }
+
+                                                       spanElm.setAttribute("mce_new", "true");
+                                                       elm.parentNode.replaceChild(spanElm, elm);
+
+                                                       // Remove style/attribs from all children
+                                                       var ch = tinyMCE.getNodeTree(spanElm, [], 1);
+                                                       for (z=0; z<ch.length; z++) {
+                                                               if (ch[z] == spanElm)
+                                                                       continue;
+
+                                                               if (scmd == "setstyle")
+                                                                       tinyMCE.setStyleAttrib(ch[z], sname, '');
+
+                                                               if (scmd == "setattrib")
+                                                                       tinyMCE.setAttrib(ch[z], sname, '');
+
+                                                               if (scmd == "removeformat") {
+                                                                       ch[z].style.cssText = '';
+                                                                       tinyMCE.setAttrib(ch[z], 'class', '');
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Cleaup wrappers
+                               var nodes = doc.getElementsByTagName(wrapper);
+                               for (i=nodes.length-1; i>=0; i--) {
+                                       var elm = nodes[i];
+                                       var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true";
+
+                                       elm.removeAttribute("mce_new");
+
+                                       // Is only child a element
+                                       if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {
+                                               //tinyMCE.debug("merge1" + isNew);
+                                               this._mergeElements(scmd, elm, elm.childNodes[0], isNew);
+                                               continue;
+                                       }
+
+                                       // Is I the only child
+                                       if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {
+                                               //tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);
+                                               if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))
+                                                       this._mergeElements(scmd, elm.parentNode, elm, false);
+                                       }
+                               }
+
+                               // Remove empty wrappers
+                               var nodes = doc.getElementsByTagName(wrapper);
+                               for (i=nodes.length-1; i>=0; i--) {
+                                       var elm = nodes[i], isEmpty = true;
+
+                                       // Check if it has any attribs
+                                       var tmp = doc.createElement("body");
+                                       tmp.appendChild(elm.cloneNode(false));
+
+                                       // Is empty span, remove it
+                                       tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), '');
+                                       //tinyMCE.debug(tmp.innerHTML);
+                                       if (new RegExp('<span>', 'gi').test(tmp.innerHTML)) {
+                                               for (x=0; x<elm.childNodes.length; x++) {
+                                                       if (elm.parentNode != null)
+                                                               elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true), elm);
+                                               }
+
+                                               elm.parentNode.removeChild(elm);
+                                       }
+                               }
+
+                               // Re add the visual aids
+                               if (scmd == "removeformat")
+                                       tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
+
+                               tinyMCE.triggerNodeChange();
+
+                               break;
+
+                       case "FontName":
+                               if (value == null) {
+                                       var s = this.getSel();
+
+                                       // Find font and select it
+                                       if (tinyMCE.isGecko && s.isCollapsed) {
+                                               var f = tinyMCE.getParentElement(this.getFocusElement(), "font");
+
+                                               if (f != null)
+                                                       this.selection.selectNode(f, false);
+                                       }
+
+                                       // Remove format
+                                       this.getDoc().execCommand("RemoveFormat", false, null);
+
+                                       // Collapse range if font was found
+                                       if (f != null && tinyMCE.isGecko) {
+                                               var r = this.getRng().cloneRange();
+                                               r.collapse(true);
+                                               s.removeAllRanges();
+                                               s.addRange(r);
+                                       }
+                               } else
+                                       this.getDoc().execCommand('FontName', false, value);
+
+                               if (tinyMCE.isGecko)
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
+
+                               return;
+
+                       case "FontSize":
+                               this.getDoc().execCommand('FontSize', false, value);
+
+                               if (tinyMCE.isGecko)
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
+
+                               return;
+
+                       case "forecolor":
+                               value = value == null ? this.foreColor : value;
+                               value = tinyMCE.trim(value);
+                               value = value.charAt(0) != '#' ? (isNaN('0x' + value) ? value : '#' + value) : value;
+
+                               this.foreColor = value;
+                               this.getDoc().execCommand('forecolor', false, value);
+                               break;
+
+                       case "HiliteColor":
+                               value = value == null ? this.backColor : value;
+                               value = tinyMCE.trim(value);
+                               value = value.charAt(0) != '#' ? (isNaN('0x' + value) ? value : '#' + value) : value;
+                               this.backColor = value;
+
+                               if (tinyMCE.isGecko || tinyMCE.isOpera) {
+                                       this._setUseCSS(true);
+                                       this.getDoc().execCommand('hilitecolor', false, value);
+                                       this._setUseCSS(false);
+                               } else
+                                       this.getDoc().execCommand('BackColor', false, value);
+                               break;
+
+                       case "Cut":
+                       case "Copy":
+                       case "Paste":
+                               var cmdFailed = false;
+
+                               // Try executing command
+                               eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');
+
+                               if (tinyMCE.isOpera && cmdFailed)
+                                       alert('Currently not supported by your browser, use keyboard shortcuts instead.');
+
+                               // Alert error in gecko if command failed
+                               if (tinyMCE.isGecko && cmdFailed) {
+                                       // Confirm more info
+                                       if (confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_clipboard_msg'))))
+                                               window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal');
+
+                                       return;
+                               } else
+                                       tinyMCE.triggerNodeChange();
+                       break;
+
+                       case "mceSetContent":
+                               if (!value)
+                                       value = "";
+
+                               // Call custom cleanup code
+                               value = tinyMCE.storeAwayURLs(value);
+                               value = tinyMCE._customCleanup(this, "insert_to_editor", value);
+
+                               if (this.getBody().nodeName == 'BODY')
+                                       tinyMCE._setHTML(doc, value);
+                               else
+                                       this.getBody().innerHTML = value;
+
+                               tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, doc, this.settings, this.getBody(), false, false, false, true));
+                               tinyMCE.convertAllRelativeURLs(this.getBody());
+
+                               // Cleanup any mess left from storyAwayURLs
+                               tinyMCE._removeInternal(this.getBody());
+
+                               // When editing always use fonts internaly
+                               if (tinyMCE.getParam("convert_fonts_to_spans"))
+                                       tinyMCE.convertSpansToFonts(doc);
+
+                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
+                               tinyMCE._setEventsEnabled(this.getBody(), false);
+                               this._addBogusBR();
+
+                               return true;
+
+                       case "mceCleanup":
+                               var b = this.selection.getBookmark();
+                               tinyMCE._setHTML(this.contentDocument, this.getBody().innerHTML);
+                               tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, this.contentDocument, this.settings, this.getBody(), this.visualAid));
+                               tinyMCE.convertAllRelativeURLs(doc.body);
+
+                               // When editing always use fonts internaly
+                               if (tinyMCE.getParam("convert_fonts_to_spans"))
+                                       tinyMCE.convertSpansToFonts(doc);
+
+                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
+                               tinyMCE._setEventsEnabled(this.getBody(), false);
+                               this._addBogusBR();
+                               this.repaint();
+                               this.selection.moveToBookmark(b);
+                               tinyMCE.triggerNodeChange();
+                       break;
+
+                       case "mceReplaceContent":
+                               // Force empty string
+                               if (!value)
+                                       value = '';
+
+                               this.getWin().focus();
+
+                               var selectedText = "";
+
+                               if (tinyMCE.isIE) {
+                                       var rng = doc.selection.createRange();
+                                       selectedText = rng.text;
+                               } else
+                                       selectedText = this.getSel().toString();
+
+                               if (selectedText.length > 0) {
+                                       value = tinyMCE.replaceVar(value, "selection", selectedText);
+                                       tinyMCE.execCommand('mceInsertContent', false, value);
+                               }
+
+                               this._addBogusBR();
+                               tinyMCE.triggerNodeChange();
+                       break;
+
+                       case "mceSetAttribute":
+                               if (typeof(value) == 'object') {
+                                       var targetElms = (typeof(value.targets) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value.targets;
+                                       var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms);
+
+                                       if (targetNode) {
+                                               targetNode.setAttribute(value.name, value.value);
+                                               tinyMCE.triggerNodeChange();
+                                       }
+                               }
+                       break;
+
+                       case "mceSetCSSClass":
+                               this.execCommand("mceSetStyleInfo", false, {command : "setattrib", name : "class", value : value});
+                       break;
+
+                       case "mceInsertRawHTML":
+                               var key = 'tiny_mce_marker';
+
+                               this.execCommand('mceBeginUndoLevel');
+
+                               // Insert marker key
+                               this.execCommand('mceInsertContent', false, key);
+
+                               // Store away scroll pos
+                               var scrollX = this.getBody().scrollLeft + this.getDoc().documentElement.scrollLeft;
+                               var scrollY = this.getBody().scrollTop + this.getDoc().documentElement.scrollTop;
+
+                               // Find marker and replace with RAW HTML
+                               var html = this.getBody().innerHTML;
+                               if ((pos = html.indexOf(key)) != -1)
+                                       tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length));
+
+                               // Restore scoll pos
+                               this.contentWindow.scrollTo(scrollX, scrollY);
+
+                               this.execCommand('mceEndUndoLevel');
+
+                               break;
+
+                       case "mceInsertContent":
+                               // Force empty string
+                               if (!value)
+                                       value = '';
+
+                               var insertHTMLFailed = false;
+
+                               // Removed since it produced problems in IE
+                               // this.getWin().focus();
+
+                               if (tinyMCE.isGecko || tinyMCE.isOpera) {
+                                       try {
+                                               // Is plain text or HTML, &amp;, &nbsp; etc will be encoded wrong in FF
+                                               if (value.indexOf('<') == -1 && !value.match(/(&#38;|&#160;|&#60;|&#62;)/g)) {
+                                                       var r = this.getRng();
+                                                       var n = this.getDoc().createTextNode(tinyMCE.entityDecode(value));
+                                                       var s = this.getSel();
+                                                       var r2 = r.cloneRange();
+
+                                                       // Insert text at cursor position
+                                                       s.removeAllRanges();
+                                                       r.deleteContents();
+                                                       r.insertNode(n);
+
+                                                       // Move the cursor to the end of text
+                                                       r2.selectNode(n);
+                                                       r2.collapse(false);
+                                                       s.removeAllRanges();
+                                                       s.addRange(r2);
+                                               } else {
+                                                       value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value);
+                                                       this.getDoc().execCommand('inserthtml', false, value);
+                                                       tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);
+                                               }
+                                       } catch (ex) {
+                                               insertHTMLFailed = true;
+                                       }
+
+                                       if (!insertHTMLFailed) {
+                                               tinyMCE.triggerNodeChange();
+                                               return;
+                                       }
+                               }
+
+                               if (!tinyMCE.isIE) {
+                                       var isHTML = value.indexOf('<') != -1;
+                                       var sel = this.getSel();
+                                       var rng = this.getRng();
+
+                                       if (isHTML) {
+                                               if (tinyMCE.isSafari) {
+                                                       var tmpRng = this.getDoc().createRange();
+
+                                                       tmpRng.setStart(this.getBody(), 0);
+                                                       tmpRng.setEnd(this.getBody(), 0);
+
+                                                       value = tmpRng.createContextualFragment(value);
+                                               } else
+                                                       value = rng.createContextualFragment(value);
+                                       } else {
+                                               // Setup text node
+                                               value = doc.createTextNode(tinyMCE.entityDecode(value));
+                                       }
+
+                                       // Insert plain text in Safari
+                                       if (tinyMCE.isSafari && !isHTML) {
+                                               this.execCommand('InsertText', false, value.nodeValue);
+                                               tinyMCE.triggerNodeChange();
+                                               return true;
+                                       } else if (tinyMCE.isSafari && isHTML) {
+                                               rng.deleteContents();
+                                               rng.insertNode(value);
+                                               tinyMCE.triggerNodeChange();
+                                               return true;
+                                       }
+
+                                       rng.deleteContents();
+
+                                       // If target node is text do special treatment, (Mozilla 1.3 fix)
+                                       if (rng.startContainer.nodeType == 3) {
+                                               var node = rng.startContainer.splitText(rng.startOffset);
+                                               node.parentNode.insertBefore(value, node); 
+                                       } else
+                                               rng.insertNode(value);
+
+                                       if (!isHTML) {
+                                               // Removes weird selection trails
+                                               sel.selectAllChildren(doc.body);
+                                               sel.removeAllRanges();
+
+                                               // Move cursor to end of content
+                                               var rng = doc.createRange();
+
+                                               rng.selectNode(value);
+                                               rng.collapse(false);
+
+                                               sel.addRange(rng);
+                                       } else
+                                               rng.collapse(false);
+
+                                       tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);
+                               } else {
+                                       var rng = doc.selection.createRange(), tmpRng = null;
+                                       var c = value.indexOf('<!--') != -1;
+
+                                       // Fix comment bug, add tag before comments
+                                       if (c)
+                                               value = tinyMCE.uniqueTag + value;
+
+                                       //      tmpRng = rng.duplicate(); // Store away range (Fixes Undo bookmark bug in IE)
+
+                                       if (rng.item)
+                                               rng.item(0).outerHTML = value;
+                                       else
+                                               rng.pasteHTML(value);
+
+                                       //if (tmpRng)
+                                       //      tmpRng.select(); // Restore range  (Fixes Undo bookmark bug in IE)
+
+                                       // Remove unique tag
+                                       if (c) {
+                                               var e = this.getDoc().getElementById('mceTMPElement');
+                                               e.parentNode.removeChild(e);
+                                       }
+                               }
+
+                               tinyMCE.execCommand("mceAddUndoLevel");
+                               tinyMCE.triggerNodeChange();
+                       break;
+
+                       case "mceStartTyping":
+                               if (tinyMCE.settings.custom_undo_redo && this.undoRedo.typingUndoIndex == -1) {
+                                       this.undoRedo.typingUndoIndex = this.undoRedo.undoIndex;
+                                       tinyMCE.typingUndoIndex = tinyMCE.undoIndex;
+                                       this.execCommand('mceAddUndoLevel');
+                               }
+                               break;
+
+                       case "mceEndTyping":
+                               if (tinyMCE.settings.custom_undo_redo && this.undoRedo.typingUndoIndex != -1) {
+                                       this.execCommand('mceAddUndoLevel');
+                                       this.undoRedo.typingUndoIndex = -1;
+                               }
+
+                               tinyMCE.typingUndoIndex = -1;
+                               break;
+
+                       case "mceBeginUndoLevel":
+                               this.undoRedoLevel = false;
+                               break;
+
+                       case "mceEndUndoLevel":
+                               this.undoRedoLevel = true;
+                               this.execCommand('mceAddUndoLevel');
+                               break;
+
+                       case "mceAddUndoLevel":
+                               if (tinyMCE.settings.custom_undo_redo && this.undoRedoLevel) {
+                                       if (this.undoRedo.add())
+                                               tinyMCE.triggerNodeChange(false);
+                               }
+                               break;
+
+                       case "Undo":
+                               if (tinyMCE.settings.custom_undo_redo) {
+                                       tinyMCE.execCommand("mceEndTyping");
+                                       this.undoRedo.undo();
+                                       tinyMCE.triggerNodeChange();
+                               } else
+                                       this.getDoc().execCommand(command, user_interface, value);
+                               break;
+
+                       case "Redo":
+                               if (tinyMCE.settings.custom_undo_redo) {
+                                       tinyMCE.execCommand("mceEndTyping");
+                                       this.undoRedo.redo();
+                                       tinyMCE.triggerNodeChange();
+                               } else
+                                       this.getDoc().execCommand(command, user_interface, value);
+                               break;
+
+                       case "mceToggleVisualAid":
+                               this.visualAid = !this.visualAid;
+                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);
+                               tinyMCE.triggerNodeChange();
+                               break;
+
+                       case "Indent":
+                               this.getDoc().execCommand(command, user_interface, value);
+                               tinyMCE.triggerNodeChange();
+
+                               if (tinyMCE.isIE) {
+                                       var n = tinyMCE.getParentElement(this.getFocusElement(), "blockquote");
+                                       do {
+                                               if (n && n.nodeName == "BLOCKQUOTE") {
+                                                       n.removeAttribute("dir");
+                                                       n.removeAttribute("style");
+                                               }
+                                       } while (n != null && (n = n.parentNode) != null);
+                               }
+                               break;
+
+                       case "RemoveFormat":
+                       case "removeformat":
+                               var text = this.selection.getSelectedText();
+
+                               if (tinyMCE.isOpera) {
+                                       this.getDoc().execCommand("RemoveFormat", false, null);
+                                       return;
+                               }
+
+                               if (tinyMCE.isIE) {
+                                       try {
+                                               var rng = doc.selection.createRange();
+                                               rng.execCommand("RemoveFormat", false, null);
+                                       } catch (e) {
+                                               // Do nothing
+                                       }
+
+                                       this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});
+                               } else {
+                                       this.getDoc().execCommand(command, user_interface, value);
+
+                                       this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});
+                               }
+
+                               // Remove class
+                               if (text.length == 0)
+                                       this.execCommand("mceSetCSSClass", false, "");
+
+                               tinyMCE.triggerNodeChange();
+                               break;
+
+                       default:
+                               this.getDoc().execCommand(command, user_interface, value);
+
+                               if (tinyMCE.isGecko)
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);
+                               else
+                                       tinyMCE.triggerNodeChange();
+               }
+
+               // Add undo level after modification
+               if (command != "mceAddUndoLevel" && command != "Undo" && command != "Redo" && command != "mceStartTyping" && command != "mceEndTyping")
+                       tinyMCE.execCommand("mceAddUndoLevel");
+       },
+
+       queryCommandValue : function(c) {
+               try {
+                       return this.getDoc().queryCommandValue(c);
+               } catch (e) {
+                       return null;
+               }
+       },
+
+       queryCommandState : function(c) {
+               return this.getDoc().queryCommandState(c);
+       },
+
+       _addBogusBR : function() {
+               var b = this.getBody();
+
+               if (tinyMCE.isGecko && !b.hasChildNodes())
+                       b.innerHTML = '<br _moz_editor_bogus_node="TRUE" />';
+       },
+
+       _onAdd : function(replace_element, form_element_name, target_document) {
+               var hc, th, tos, editorTemplate, targetDoc, deltaWidth, deltaHeight, html, rng, fragment;
+               var dynamicIFrame, tElm, doc, parentElm;
+
+               th = this.settings.theme;
+               tos = tinyMCE.themes[th];
+
+               targetDoc = target_document ? target_document : document;
+
+               this.targetDoc = targetDoc;
+
+               tinyMCE.themeURL = tinyMCE.baseURL + "/themes/" + this.settings.theme;
+               this.settings.themeurl = tinyMCE.themeURL;
+
+               if (!replace_element) {
+                       alert("Error: Could not find the target element.");
+                       return false;
+               }
+
+               if (tos.getEditorTemplate)
+                       editorTemplate = tos.getEditorTemplate(this.settings, this.editorId);
+
+               deltaWidth = editorTemplate.delta_width ? editorTemplate.delta_width : 0;
+               deltaHeight = editorTemplate.delta_height ? editorTemplate.delta_height : 0;
+               html = '<span id="' + this.editorId + '_parent" class="mceEditorContainer">' + editorTemplate.html;
+
+               html = tinyMCE.replaceVar(html, "editor_id", this.editorId);
+
+               if (!this.settings.default_document)
+                       this.settings.default_document = tinyMCE.baseURL + "/blank.htm";
+
+               this.settings.old_width = this.settings.width;
+               this.settings.old_height = this.settings.height;
+
+               // Set default width, height
+               if (this.settings.width == -1)
+                       this.settings.width = replace_element.offsetWidth;
+
+               if (this.settings.height == -1)
+                       this.settings.height = replace_element.offsetHeight;
+
+               // Try the style width
+               if (this.settings.width == 0)
+                       this.settings.width = replace_element.style.width;
+
+               // Try the style height
+               if (this.settings.height == 0)
+                       this.settings.height = replace_element.style.height; 
+
+               // If no width/height then default to 320x240, better than nothing
+               if (this.settings.width == 0)
+                       this.settings.width = 320;
+
+               if (this.settings.height == 0)
+                       this.settings.height = 240;
+
+               this.settings.area_width = parseInt(this.settings.width);
+               this.settings.area_height = parseInt(this.settings.height);
+               this.settings.area_width += deltaWidth;
+               this.settings.area_height += deltaHeight;
+               this.settings.width_style = "" + this.settings.width;
+               this.settings.height_style = "" + this.settings.height;
+
+               // Special % handling
+               if (("" + this.settings.width).indexOf('%') != -1)
+                       this.settings.area_width = "100%";
+               else
+                       this.settings.width_style += 'px';
+
+               if (("" + this.settings.height).indexOf('%') != -1)
+                       this.settings.area_height = "100%";
+               else
+                       this.settings.height_style += 'px';
+
+               if (("" + replace_element.style.width).indexOf('%') != -1) {
+                       this.settings.width = replace_element.style.width;
+                       this.settings.area_width = "100%";
+                       this.settings.width_style = "100%";
+               }
+
+               if (("" + replace_element.style.height).indexOf('%') != -1) {
+                       this.settings.height = replace_element.style.height;
+                       this.settings.area_height = "100%";
+                       this.settings.height_style = "100%";
+               }
+
+               html = tinyMCE.applyTemplate(html);
+
+               this.settings.width = this.settings.old_width;
+               this.settings.height = this.settings.old_height;
+
+               this.visualAid = this.settings.visual;
+               this.formTargetElementId = form_element_name;
+
+               // Get replace_element contents
+               if (replace_element.nodeName == "TEXTAREA" || replace_element.nodeName == "INPUT")
+                       this.startContent = replace_element.value;
+               else
+                       this.startContent = replace_element.innerHTML;
+
+               // If not text area or input
+               if (replace_element.nodeName != "TEXTAREA" && replace_element.nodeName != "INPUT") {
+                       this.oldTargetElement = replace_element;
+
+                       // Debug mode
+                       hc = '<input type="hidden" id="' + form_element_name + '" name="' + form_element_name + '" />';
+                       this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');
+                       this.oldTargetElement.style.display = "none";
+
+                       html += '</span>';
+
+                       if (tinyMCE.isGecko)
+                               html = hc + html;
+                       else
+                               html += hc;
+
+                       // Output HTML and set editable
+                       if (tinyMCE.isGecko) {
+                               rng = replace_element.ownerDocument.createRange();
+                               rng.setStartBefore(replace_element);
+
+                               fragment = rng.createContextualFragment(html);
+                               tinyMCE.insertAfter(fragment, replace_element);
+                       } else
+                               replace_element.insertAdjacentHTML("beforeBegin", html);
+               } else {
+                       html += '</span>';
+
+                       // Just hide the textarea element
+                       this.oldTargetElement = replace_element;
+
+                       this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');
+                       this.oldTargetElement.style.display = "none";
+
+                       // Output HTML and set editable
+                       if (tinyMCE.isGecko) {
+                               rng = replace_element.ownerDocument.createRange();
+                               rng.setStartBefore(replace_element);
+
+                               fragment = rng.createContextualFragment(html);
+                               tinyMCE.insertAfter(fragment, replace_element);
+                       } else
+                               replace_element.insertAdjacentHTML("beforeBegin", html);
+               }
+
+               // Setup iframe
+               dynamicIFrame = false;
+               tElm = targetDoc.getElementById(this.editorId);
+
+               if (!tinyMCE.isIE) {
+                       // Node case is preserved in XML strict mode
+                       if (tElm && (tElm.nodeName == "SPAN" || tElm.nodeName == "span")) {
+                               tElm = tinyMCE._createIFrame(tElm, targetDoc);
+                               dynamicIFrame = true;
+                       }
+
+                       this.targetElement = tElm;
+                       this.iframeElement = tElm;
+                       this.contentDocument = tElm.contentDocument;
+                       this.contentWindow = tElm.contentWindow;
+
+                       //this.getDoc().designMode = "on";
+               } else {
+                       if (tElm && tElm.nodeName == "SPAN")
+                               tElm = tinyMCE._createIFrame(tElm, targetDoc, targetDoc.parentWindow);
+                       else
+                               tElm = targetDoc.frames[this.editorId];
+
+                       this.targetElement = tElm;
+                       this.iframeElement = targetDoc.getElementById(this.editorId);
+
+                       if (tinyMCE.isOpera) {
+                               this.contentDocument = this.iframeElement.contentDocument;
+                               this.contentWindow = this.iframeElement.contentWindow;
+                               dynamicIFrame = true;
+                       } else {
+                               this.contentDocument = tElm.window.document;
+                               this.contentWindow = tElm.window;
+                       }
+
+                       this.getDoc().designMode = "on";
+               }
+
+               // Setup base HTML
+               doc = this.contentDocument;
+               if (dynamicIFrame) {
+                       html = tinyMCE.getParam('doctype') + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + tinyMCE.settings.base_href + '" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';
+
+                       try {
+                               if (!this.isHidden())
+                                       this.getDoc().designMode = "on";
+
+                               doc.open();
+                               doc.write(html);
+                               doc.close();
+                       } catch (e) {
+                               // Failed Mozilla 1.3
+                               this.getDoc().location.href = tinyMCE.baseURL + "/blank.htm";
+                       }
+               }
+
+               // This timeout is needed in MSIE 5.5 for some odd reason
+               // it seems that the document.frames isn't initialized yet?
+               if (tinyMCE.isIE)
+                       window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\"" + this.editorId + "\"]);", 1);
+
+               // Setup element references
+               parentElm = this.targetDoc.getElementById(this.editorId + '_parent');
+               this.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;
+
+               tinyMCE.setupContent(this.editorId, true);
+
+               return true;
+       },
+
+       setBaseHREF : function(u) {
+               var h, b, d, nl;
+
+               d = this.getDoc();
+               nl = d.getElementsByTagName("base");
+               b = nl.length > 0 ? nl[0] : null;
+
+               if (!b) {
+                       nl = d.getElementsByTagName("head");
+                       h = nl.length > 0 ? nl[0] : null;
+
+                       b = d.createElement("base");
+                       b.setAttribute('href', u);
+                       h.appendChild(b);
+               } else {
+                       if (u == '' || u == null)
+                               b.parentNode.removeChild(b);
+                       else
+                               b.setAttribute('href', u);
+               }
+       },
+
+       getHTML : function(r) {
+               var h, d = this.getDoc(), b = this.getBody();
+
+               if (r)
+                       return b.innerHTML;
+
+               h = tinyMCE._cleanupHTML(this, d, this.settings, b, false, true, false, true);
+
+               if (tinyMCE.getParam("convert_fonts_to_spans"))
+                       tinyMCE.convertSpansToFonts(d);
+
+               return h;
+       },
+
+       setHTML : function(h) {
+               this.execCommand('mceSetContent', false, h);
+               this.repaint();
+       },
+
+       getFocusElement : function() {
+               return this.selection.getFocusElement();
+       },
+
+       getSel : function() {
+               return this.selection.getSel();
+       },
+
+       getRng : function() {
+               return this.selection.getRng();
+       },
+
+       triggerSave : function(skip_cleanup, skip_callback) {
+               var e, nl = [], i, s, content, htm;
+
+               if (!this.enabled)
+                       return;
+
+               this.switchSettings();
+               s = tinyMCE.settings;
+
+               // Force hidden tabs visible while serializing
+               if (tinyMCE.isRealIE) {
+                       e = this.iframeElement;
+
+                       do {
+                               if (e.style && e.style.display == 'none') {
+                                       e.style.display = 'block';
+                                       nl[nl.length] = {elm : e, type : 'style'};
+                               }
+
+                               if (e.style && s.hidden_tab_class.length > 0 && e.className.indexOf(s.hidden_tab_class) != -1) {
+                                       e.className = s.display_tab_class;
+                                       nl[nl.length] = {elm : e, type : 'class'};
+                               }
+                       } while ((e = e.parentNode) != null)
+               }
+
+               tinyMCE.settings.preformatted = false;
+
+               // Default to false
+               if (typeof(skip_cleanup) == "undefined")
+                       skip_cleanup = false;
+
+               // Default to false
+               if (typeof(skip_callback) == "undefined")
+                       skip_callback = false;
+
+               tinyMCE._setHTML(this.getDoc(), this.getBody().innerHTML);
+
+               // Remove visual aids when cleanup is disabled
+               if (this.settings.cleanup == false) {
+                       tinyMCE.handleVisualAid(this.getBody(), true, false, this);
+                       tinyMCE._setEventsEnabled(this.getBody(), true);
+               }
+
+               tinyMCE._customCleanup(this, "submit_content_dom", this.contentWindow.document.body);
+               htm = skip_cleanup ? this.getBody().innerHTML : tinyMCE._cleanupHTML(this, this.getDoc(), this.settings, this.getBody(), tinyMCE.visualAid, true, true);
+               htm = tinyMCE._customCleanup(this, "submit_content", htm);
+
+               if (!skip_callback && tinyMCE.settings.save_callback !== '')
+                       content = tinyMCE.resolveDots(tinyMCE.settings.save_callback, window)(this.formTargetElementId,htm,this.getBody());
+
+               // Use callback content if available
+               if ((typeof(content) != "undefined") && content != null)
+                       htm = content;
+
+               // Replace some weird entities (Bug: #1056343)
+               htm = tinyMCE.regexpReplace(htm, "&#40;", "(", "gi");
+               htm = tinyMCE.regexpReplace(htm, "&#41;", ")", "gi");
+               htm = tinyMCE.regexpReplace(htm, "&#59;", ";", "gi");
+               htm = tinyMCE.regexpReplace(htm, "&#34;", "&quot;", "gi");
+               htm = tinyMCE.regexpReplace(htm, "&#94;", "^", "gi");
+
+               if (this.formElement)
+                       this.formElement.value = htm;
+
+               if (tinyMCE.isSafari && this.formElement)
+                       this.formElement.innerText = htm;
+
+               // Hide them again (tabs in MSIE)
+               for (i=0; i<nl.length; i++) {
+                       if (nl[i].type == 'style')
+                               nl[i].elm.style.display = 'none';
+                       else
+                               nl[i].elm.className = s.hidden_tab_class;
+               }
+       }
+
+       };
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Cleanup.class.js */
+
+tinyMCE.add(TinyMCE_Engine, {
+       cleanupHTMLCode : function(s) {
+               s = s.replace(new RegExp('<p \\/>', 'gi'), '<p>&nbsp;</p>');
+               s = s.replace(new RegExp('<p>\\s*<\\/p>', 'gi'), '<p>&nbsp;</p>');
+
+               // Fix close BR elements
+               s = s.replace(new RegExp('<br>\\s*<\\/br>', 'gi'), '<br />');
+
+               // Open closed tags like <b/> to <b></b>
+               s = s.replace(new RegExp('<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>', 'gi'), '<$1$2$3></$1$2>');
+
+               // Remove trailing space <b > to <b>
+               s = s.replace(new RegExp('\\s+></', 'gi'), '></');
+
+               // Close tags <img></img> to <img/>
+               s = s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>', 'gi'), '<$1$2 />');
+
+               // Weird MSIE bug, <p><hr /></p> breaks runtime?
+               if (tinyMCE.isIE)
+                       s = s.replace(new RegExp('<p><hr \\/><\\/p>', 'gi'), "<hr>");
+
+               // Weird tags will make IE error #bug: 1538495
+               if (tinyMCE.isIE)
+                       s = s.replace(/<!(\s*)\/>/g, '');
+
+               // Convert relative anchors to absolute URLs ex: #something to file.htm#something
+               // Removed: Since local document anchors should never be forced absolute example edit.php?id=something
+               //if (tinyMCE.getParam('convert_urls'))
+               //      s = s.replace(new RegExp('(href=\"{0,1})(\\s*#)', 'gi'), '$1' + tinyMCE.settings.document_base_url + "#");
+
+               return s;
+       },
+
+       parseStyle : function(str) {
+               var ar = [], st, i, re, pa;
+
+               if (str == null)
+                       return ar;
+
+               st = str.split(';');
+
+               tinyMCE.clearArray(ar);
+
+               for (i=0; i<st.length; i++) {
+                       if (st[i] == '')
+                               continue;
+
+                       re = new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');
+                       pa = st[i].replace(re, '$1||$2').split('||');
+       //tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));
+                       if (pa.length == 2)
+                               ar[pa[0].toLowerCase()] = pa[1];
+               }
+
+               return ar;
+       },
+
+       compressStyle : function(ar, pr, sf, res) {
+               var box = [], i, a;
+
+               box[0] = ar[pr + '-top' + sf];
+               box[1] = ar[pr + '-left' + sf];
+               box[2] = ar[pr + '-right' + sf];
+               box[3] = ar[pr + '-bottom' + sf];
+
+               for (i=0; i<box.length; i++) {
+                       if (box[i] == null)
+                               return;
+
+                       if (i && box[i] != box[i-1])
+                               return;
+               }
+
+               // They are all the same
+               ar[res] = box[0];
+               ar[pr + '-top' + sf] = null;
+               ar[pr + '-left' + sf] = null;
+               ar[pr + '-right' + sf] = null;
+               ar[pr + '-bottom' + sf] = null;
+       },
+
+       serializeStyle : function(ar) {
+               var str = "", key, val, m;
+
+               // Compress box
+               tinyMCE.compressStyle(ar, "border", "", "border");
+               tinyMCE.compressStyle(ar, "border", "-width", "border-width");
+               tinyMCE.compressStyle(ar, "border", "-color", "border-color");
+               tinyMCE.compressStyle(ar, "border", "-style", "border-style");
+               tinyMCE.compressStyle(ar, "padding", "", "padding");
+               tinyMCE.compressStyle(ar, "margin", "", "margin");
+
+               for (key in ar) {
+                       val = ar[key];
+
+                       if (typeof(val) == 'function')
+                               continue;
+
+                       if (key.indexOf('mso-') == 0)
+                               continue;
+
+                       if (val != null && val !== '') {
+                               val = '' + val; // Force string
+
+                               // Fix style URL
+                               val = val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)", 'gi'), "url('$1')");
+
+                               // Convert URL
+                               if (val.indexOf('url(') != -1 && tinyMCE.getParam('convert_urls')) {
+                                       m = new RegExp("url\\('(.*?)'\\)").exec(val);
+
+                                       if (m.length > 1)
+                                               val = "url('" + eval(tinyMCE.getParam('urlconverter_callback') + "(m[1], null, true);") + "')";
+                               }
+
+                               // Force HEX colors
+                               if (tinyMCE.getParam("force_hex_style_colors"))
+                                       val = tinyMCE.convertRGBToHex(val, true);
+
+                               val = val.replace(/\"/g, '\'');
+
+                               if (val != "url('')")
+                                       str += key.toLowerCase() + ": " + val + "; ";
+                       }
+               }
+
+               if (new RegExp('; $').test(str))
+                       str = str.substring(0, str.length - 2);
+
+               return str;
+       },
+
+       convertRGBToHex : function(s, k) {
+               var re, rgb;
+
+               if (s.toLowerCase().indexOf('rgb') != -1) {
+                       re = new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)", "gi");
+                       rgb = s.replace(re, "$1,$2,$3,$4,$5").split(',');
+
+                       if (rgb.length == 5) {
+                               r = parseInt(rgb[1]).toString(16);
+                               g = parseInt(rgb[2]).toString(16);
+                               b = parseInt(rgb[3]).toString(16);
+
+                               r = r.length == 1 ? '0' + r : r;
+                               g = g.length == 1 ? '0' + g : g;
+                               b = b.length == 1 ? '0' + b : b;
+
+                               s = "#" + r + g + b;
+
+                               if (k)
+                                       s = rgb[0] + s + rgb[4];
+                       }
+               }
+
+               return s;
+       },
+
+       convertHexToRGB : function(s) {
+               if (s.indexOf('#') != -1) {
+                       s = s.replace(new RegExp('[^0-9A-F]', 'gi'), '');
+                       return "rgb(" + parseInt(s.substring(0, 2), 16) + "," + parseInt(s.substring(2, 4), 16) + "," + parseInt(s.substring(4, 6), 16) + ")";
+               }
+
+               return s;
+       },
+
+       convertSpansToFonts : function(doc) {
+               var s, i, size, fSize, x, fFace, fColor, sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');
+
+               s = tinyMCE.selectElements(doc, 'span,font');
+               for (i=0; i<s.length; i++) {
+                       size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();
+                       fSize = 0;
+
+                       for (x=0; x<sizes.length; x++) {
+                               if (sizes[x] == size) {
+                                       fSize = x + 1;
+                                       break;
+                               }
+                       }
+
+                       if (fSize > 0) {
+                               tinyMCE.setAttrib(s[i], 'size', fSize);
+                               s[i].style.fontSize = '';
+                       }
+
+                       fFace = s[i].style.fontFamily;
+                       if (fFace != null && fFace !== '') {
+                               tinyMCE.setAttrib(s[i], 'face', fFace);
+                               s[i].style.fontFamily = '';
+                       }
+
+                       fColor = s[i].style.color;
+                       if (fColor != null && fColor !== '') {
+                               tinyMCE.setAttrib(s[i], 'color', tinyMCE.convertRGBToHex(fColor));
+                               s[i].style.color = '';
+                       }
+               }
+       },
+
+       convertFontsToSpans : function(doc) {
+               var fsClasses, s, i, fSize, fFace, fColor, sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');
+
+               fsClasses = tinyMCE.getParam('font_size_classes');
+               if (fsClasses !== '')
+                       fsClasses = fsClasses.replace(/\s+/, '').split(',');
+               else
+                       fsClasses = null;
+
+               s = tinyMCE.selectElements(doc, 'span,font');
+               for (i=0; i<s.length; i++) {
+                       fSize = tinyMCE.getAttrib(s[i], 'size');
+                       fFace = tinyMCE.getAttrib(s[i], 'face');
+                       fColor = tinyMCE.getAttrib(s[i], 'color');
+
+                       if (fSize !== '') {
+                               fSize = parseInt(fSize);
+
+                               if (fSize > 0 && fSize < 8) {
+                                       if (fsClasses != null)
+                                               tinyMCE.setAttrib(s[i], 'class', fsClasses[fSize-1]);
+                                       else
+                                               s[i].style.fontSize = sizes[fSize-1];
+                               }
+
+                               s[i].removeAttribute('size');
+                       }
+
+                       if (fFace !== '') {
+                               s[i].style.fontFamily = fFace;
+                               s[i].removeAttribute('face');
+                       }
+
+                       if (fColor !== '') {
+                               s[i].style.color = fColor;
+                               s[i].removeAttribute('color');
+                       }
+               }
+       },
+
+       cleanupAnchors : function(doc) {
+               var i, cn, x, an = doc.getElementsByTagName("a");
+
+               // Loops backwards due to bug #1467987
+               for (i=an.length-1; i>=0; i--) {
+                       if (tinyMCE.getAttrib(an[i], "name") !== '' && tinyMCE.getAttrib(an[i], "href") == '') {
+                               cn = an[i].childNodes;
+
+                               for (x=cn.length-1; x>=0; x--)
+                                       tinyMCE.insertAfter(cn[x], an[i]);
+                       }
+               }
+       },
+
+       getContent : function(editor_id) {
+               if (typeof(editor_id) != "undefined")
+                        tinyMCE.getInstanceById(editor_id).select();
+
+               if (tinyMCE.selectedInstance)
+                       return tinyMCE.selectedInstance.getHTML();
+
+               return null;
+       },
+
+       _fixListElements : function(d) {
+               var nl, x, a = ['ol', 'ul'], i, n, p, r = new RegExp('^(OL|UL)$'), np;
+
+               for (x=0; x<a.length; x++) {
+                       nl = d.getElementsByTagName(a[x]);
+
+                       for (i=0; i<nl.length; i++) {
+                               n = nl[i];
+                               p = n.parentNode;
+
+                               if (r.test(p.nodeName)) {
+                                       np = tinyMCE.prevNode(n, 'LI');
+
+                                       if (!np) {
+                                               np = d.createElement('li');
+                                               np.innerHTML = '&nbsp;';
+                                               np.appendChild(n);
+                                               p.insertBefore(np, p.firstChild);
+                                       } else
+                                               np.appendChild(n);
+                               }
+                       }
+               }
+       },
+
+       _fixTables : function(d) {
+               var nl, i, n, p, np, x, t;
+
+               nl = d.getElementsByTagName('table');
+               for (i=0; i<nl.length; i++) {
+                       n = nl[i];
+
+                       if ((p = tinyMCE.getParentElement(n, 'p,h1,h2,h3,h4,h5,h6')) != null) {
+                               np = p.cloneNode(false);
+                               np.removeAttribute('id');
+
+                               t = n;
+
+                               while ((n = n.nextSibling))
+                                       np.appendChild(n);
+
+                               tinyMCE.insertAfter(np, p);
+                               tinyMCE.insertAfter(t, p);
+                       }
+               }
+       },
+
+       _cleanupHTML : function(inst, doc, config, elm, visual, on_save, on_submit, inn) {
+               var h, d, t1, t2, t3, t4, t5, c, s, nb;
+
+               if (!tinyMCE.getParam('cleanup'))
+                       return elm.innerHTML;
+
+               on_save = typeof(on_save) == 'undefined' ? false : on_save;
+
+               c = inst.cleanup;
+               s = inst.settings;
+               d = c.settings.debug;
+
+               if (d)
+                       t1 = new Date().getTime();
+
+               inst._fixRootBlocks();
+
+               if (tinyMCE.getParam("convert_fonts_to_spans"))
+                       tinyMCE.convertFontsToSpans(doc);
+
+               if (tinyMCE.getParam("fix_list_elements"))
+                       tinyMCE._fixListElements(doc);
+
+               if (tinyMCE.getParam("fix_table_elements"))
+                       tinyMCE._fixTables(doc);
+
+               // Call custom cleanup code
+               tinyMCE._customCleanup(inst, on_save ? "get_from_editor_dom" : "insert_to_editor_dom", doc.body);
+
+               if (d)
+                       t2 = new Date().getTime();
+
+               c.settings.on_save = on_save;
+
+               c.idCount = 0;
+               c.serializationId++; // Unique ID needed for the content duplication bug
+               c.serializedNodes = [];
+               c.sourceIndex = -1;
+
+               if (s.cleanup_serializer == "xml")
+                       h = c.serializeNodeAsXML(elm, inn);
+               else
+                       h = c.serializeNodeAsHTML(elm, inn);
+
+               if (d)
+                       t3 = new Date().getTime();
+
+               // Post processing
+               nb = tinyMCE.getParam('entity_encoding') == 'numeric' ? '&#160;' : '&nbsp;';
+               h = h.replace(/<\/?(body|head|html)[^>]*>/gi, '');
+               h = h.replace(new RegExp(' (rowspan="1"|colspan="1")', 'g'), '');
+               h = h.replace(/<p><hr \/><\/p>/g, '<hr />');
+               h = h.replace(/<p>(&nbsp;|&#160;)<\/p><hr \/><p>(&nbsp;|&#160;)<\/p>/g, '<hr />');
+               h = h.replace(/<td>\s*<br \/>\s*<\/td>/g, '<td>' + nb + '</td>');
+               h = h.replace(/<p>\s*<br \/>\s*<\/p>/g, '<p>' + nb + '</p>');
+               h = h.replace(/<br \/>$/, ''); // Remove last BR for Gecko
+               h = h.replace(/<br \/><\/p>/g, '</p>'); // Remove last BR in P tags for Gecko
+               h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g, '<p>' + nb + '</p>');
+               h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g, '<p>' + nb + '</p>');
+               h = h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g, '<p>' + nb + '</p>');
+               h = h.replace(new RegExp('<a>(.*?)<\\/a>', 'g'), '$1');
+               h = h.replace(/<p([^>]*)>\s*<\/p>/g, '<p$1>' + nb + '</p>');
+
+               // Clean body
+               if (/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))
+                       h = '';
+
+               // If preformatted
+               if (s.preformatted) {
+                       h = h.replace(/^<pre>/, '');
+                       h = h.replace(/<\/pre>$/, '');
+                       h = '<pre>' + h + '</pre>';
+               }
+
+               // Gecko specific processing
+               if (tinyMCE.isGecko) {
+                       // Makes no sence but FF generates it!!
+                       h = h.replace(/<br \/>\s*<\/li>/g, '</li>');
+                       h = h.replace(/&nbsp;\s*<\/(dd|dt)>/g, '</$1>');
+                       h = h.replace(/<o:p _moz-userdefined="" \/>/g, '');
+                       h = h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g, '<td$1>' + nb + '</td>');
+               }
+
+               if (s.force_br_newlines)
+                       h = h.replace(/<p>(&nbsp;|&#160;)<\/p>/g, '<br />');
+
+               // Call custom cleanup code
+               h = tinyMCE._customCleanup(inst, on_save ? "get_from_editor" : "insert_to_editor", h);
+
+               // Remove internal classes
+               if (on_save) {
+                       h = h.replace(new RegExp(' ?(mceItem[a-zA-Z0-9]*|' + s.visual_table_class + ')', 'g'), '');
+                       h = h.replace(new RegExp(' ?class=""', 'g'), '');
+               }
+
+               if (s.remove_linebreaks && !c.settings.indent)
+                       h = h.replace(/\n|\r/g, ' ');
+
+               if (d)
+                       t4 = new Date().getTime();
+
+               if (on_save && c.settings.indent)
+                       h = c.formatHTML(h);
+
+               // If encoding (not recommended option)
+               if (on_submit && (s.encoding == "xml" || s.encoding == "html"))
+                       h = c.xmlEncode(h);
+
+               if (d)
+                       t5 = new Date().getTime();
+
+               if (c.settings.debug)
+                       tinyMCE.debug("Cleanup in ms: Pre=" + (t2-t1) + ", Serialize: " + (t3-t2) + ", Post: " + (t4-t3) + ", Format: " + (t5-t4) + ", Sum: " + (t5-t1) + ".");
+
+               return h;
+       }
+});
+
+function TinyMCE_Cleanup() {
+       this.isIE = (navigator.appName == "Microsoft Internet Explorer");
+       this.rules = tinyMCE.clearArray([]);
+
+       // Default config
+       this.settings = {
+               indent_elements : 'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object',
+               newline_before_elements : 'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td',
+               newline_after_elements : 'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script',
+               newline_before_after_elements : 'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div',
+               indent_char : '\t',
+               indent_levels : 1,
+               entity_encoding : 'raw',
+               valid_elements : '*[*]',
+               entities : '',
+               url_converter : '',
+               invalid_elements : '',
+               verify_html : false
+       };
+
+       this.vElements = tinyMCE.clearArray([]);
+       this.vElementsRe = '';
+       this.closeElementsRe = /^(IMG|BR|HR|LINK|META|BASE|INPUT|AREA)$/;
+       this.codeElementsRe = /^(SCRIPT|STYLE)$/;
+       this.serializationId = 0;
+       this.mceAttribs = {
+               href : 'mce_href',
+               src : 'mce_src',
+               type : 'mce_type'
+       };
+}
+
+TinyMCE_Cleanup.prototype = {
+       init : function(s) {
+               var n, a, i, ir, or, st;
+
+               for (n in s)
+                       this.settings[n] = s[n];
+
+               // Setup code formating
+               s = this.settings;
+
+               // Setup regexps
+               this.inRe = this._arrayToRe(s.indent_elements.split(','), '', '^<(', ')[^>]*');
+               this.ouRe = this._arrayToRe(s.indent_elements.split(','), '', '^<\\/(', ')[^>]*');
+               this.nlBeforeRe = this._arrayToRe(s.newline_before_elements.split(','), 'gi', '<(',  ')([^>]*)>');
+               this.nlAfterRe = this._arrayToRe(s.newline_after_elements.split(','), 'gi', '<(',  ')([^>]*)>');
+               this.nlBeforeAfterRe = this._arrayToRe(s.newline_before_after_elements.split(','), 'gi', '<(\\/?)(', ')([^>]*)>');
+               this.serializedNodes = [];
+               this.serializationId = 0;
+
+               if (s.invalid_elements !== '')
+                       this.iveRe = this._arrayToRe(s.invalid_elements.toUpperCase().split(','), 'g', '^(', ')$');
+               else
+                       this.iveRe = null;
+
+               // Setup separator
+               st = '';
+               for (i=0; i<s.indent_levels; i++)
+                       st += s.indent_char;
+
+               this.inStr = st;
+
+               // If verify_html if false force *[*]
+               if (!s.verify_html) {
+                       s.valid_elements = '*[*]';
+                       s.extended_valid_elements = '';
+               }
+
+               this.fillStr = s.entity_encoding == "named" ? "&nbsp;" : "&#160;";
+               this.idCount = 0;
+               this.xmlEncodeRe = new RegExp('[\u007F-\uFFFF<>&"]', 'g');
+       },
+
+       addRuleStr : function(s) {
+               var r = this.parseRuleStr(s), n;
+
+               for (n in r) {
+                       if (r[n])
+                               this.rules[n] = r[n];
+               }
+
+               this.vElements = tinyMCE.clearArray([]);
+
+               for (n in this.rules) {
+                       if (this.rules[n])
+                               this.vElements[this.vElements.length] = this.rules[n].tag;
+               }
+
+               this.vElementsRe = this._arrayToRe(this.vElements, '');
+       },
+
+       isValid : function(n) {
+               if (!this.rulesDone)
+                       this._setupRules(); // Will initialize cleanup rules
+
+               // Empty is true since it removes formatting
+               if (!n)
+                       return true;
+
+               // Clean the name up a bit
+               n = n.replace(/[^a-z0-9]+/gi, '').toUpperCase();
+
+               return !tinyMCE.getParam('cleanup') || this.vElementsRe.test(n);
+       },
+
+       addChildRemoveRuleStr : function(s) {
+               var x, y, p, i, t, tn, ta, cl, r;
+
+               if (!s)
+                       return;
+
+               ta = s.split(',');
+               for (x=0; x<ta.length; x++) {
+                       s = ta[x];
+
+                       // Split tag/children
+                       p = this.split(/\[|\]/, s);
+                       if (p == null || p.length < 1)
+                               t = s.toUpperCase();
+                       else
+                               t = p[0].toUpperCase();
+
+                       // Handle all tag names
+                       tn = this.split('/', t);
+                       for (y=0; y<tn.length; y++) {
+                               r = "^(";
+
+                               // Build regex
+                               cl = this.split(/\|/, p[1]);
+                               for (i=0; i<cl.length; i++) {
+                                       if (cl[i] == '%istrict')
+                                               r += tinyMCE.inlineStrict;
+                                       else if (cl[i] == '%itrans')
+                                               r += tinyMCE.inlineTransitional;
+                                       else if (cl[i] == '%istrict_na')
+                                               r += tinyMCE.inlineStrict.substring(2);
+                                       else if (cl[i] == '%itrans_na')
+                                               r += tinyMCE.inlineTransitional.substring(2);
+                                       else if (cl[i] == '%btrans')
+                                               r += tinyMCE.blockElms;
+                                       else if (cl[i] == '%strict')
+                                               r += tinyMCE.blockStrict;
+                                       else
+                                               r += (cl[i].charAt(0) != '#' ? cl[i].toUpperCase() : cl[i]);
+
+                                       r += (i != cl.length - 1 ? '|' : '');
+                               }
+
+                               r += ')$';
+
+                               if (this.childRules == null)
+                                       this.childRules = tinyMCE.clearArray([]);
+
+                               this.childRules[tn[y]] = new RegExp(r);
+
+                               if (p.length > 1)
+                                       this.childRules[tn[y]].wrapTag = p[2];
+                       }
+               }
+       },
+
+       parseRuleStr : function(s) {
+               var ta, p, r, a, i, x, px, t, tn, y, av, or = tinyMCE.clearArray([]), dv;
+
+               if (s == null || s.length == 0)
+                       return or;
+
+               ta = s.split(',');
+               for (x=0; x<ta.length; x++) {
+                       s = ta[x];
+                       if (s.length == 0)
+                               continue;
+
+                       // Split tag/attrs
+                       p = this.split(/\[|\]/, s);
+                       if (p == null || p.length < 1)
+                               t = s.toUpperCase();
+                       else
+                               t = p[0].toUpperCase();
+
+                       // Handle all tag names
+                       tn = this.split('/', t);
+                       for (y=0; y<tn.length; y++) {
+                               r = {};
+
+                               r.tag = tn[y];
+                               r.forceAttribs = null;
+                               r.defaultAttribs = null;
+                               r.validAttribValues = null;
+
+                               // Handle prefixes
+                               px = r.tag.charAt(0);
+                               r.forceOpen = px == '+';
+                               r.removeEmpty = px == '-';
+                               r.fill = px == '#';
+                               r.tag = r.tag.replace(/\+|-|#/g, '');
+                               r.oTagName = tn[0].replace(/\+|-|#/g, '').toLowerCase();
+                               r.isWild = new RegExp('\\*|\\?|\\+', 'g').test(r.tag);
+                               r.validRe = new RegExp(this._wildcardToRe('^' + r.tag + '$'));
+
+                               // Setup valid attributes
+                               if (p.length > 1) {
+                                       r.vAttribsRe = '^(';
+                                       a = this.split(/\|/, p[1]);
+
+                                       for (i=0; i<a.length; i++) {
+                                               t = a[i];
+
+                                               if (t.charAt(0) == '!') {
+                                                       a[i] = t = t.substring(1);
+
+                                                       if (!r.reqAttribsRe)
+                                                               r.reqAttribsRe = '\\s+(' + t;
+                                                       else
+                                                               r.reqAttribsRe += '|' + t;
+                                               }
+
+                                               av = new RegExp('(=|:|<)(.*?)$').exec(t);
+                                               t = t.replace(new RegExp('(=|:|<).*?$'), '');
+                                               if (av && av.length > 0) {
+                                                       if (av[0].charAt(0) == ':') {
+                                                               if (!r.forceAttribs)
+                                                                       r.forceAttribs = tinyMCE.clearArray([]);
+
+                                                               r.forceAttribs[t.toLowerCase()] = av[0].substring(1);
+                                                       } else if (av[0].charAt(0) == '=') {
+                                                               if (!r.defaultAttribs)
+                                                                       r.defaultAttribs = tinyMCE.clearArray([]);
+
+                                                               dv = av[0].substring(1);
+
+                                                               r.defaultAttribs[t.toLowerCase()] = dv == '' ? "mce_empty" : dv;
+                                                       } else if (av[0].charAt(0) == '<') {
+                                                               if (!r.validAttribValues)
+                                                                       r.validAttribValues = tinyMCE.clearArray([]);
+
+                                                               r.validAttribValues[t.toLowerCase()] = this._arrayToRe(this.split('?', av[0].substring(1)), 'i');
+                                                       }
+                                               }
+
+                                               r.vAttribsRe += '' + t.toLowerCase() + (i != a.length - 1 ? '|' : '');
+
+                                               a[i] = t.toLowerCase();
+                                       }
+
+                                       if (r.reqAttribsRe)
+                                               r.reqAttribsRe = new RegExp(r.reqAttribsRe + ')=\"', 'g');
+
+                                       r.vAttribsRe += ')$';
+                                       r.vAttribsRe = this._wildcardToRe(r.vAttribsRe);
+                                       r.vAttribsReIsWild = new RegExp('\\*|\\?|\\+', 'g').test(r.vAttribsRe);
+                                       r.vAttribsRe = new RegExp(r.vAttribsRe);
+                                       r.vAttribs = a.reverse();
+
+                                       //tinyMCE.debug(r.tag, r.oTagName, r.vAttribsRe, r.vAttribsReWC);
+                               } else {
+                                       r.vAttribsRe = '';
+                                       r.vAttribs = tinyMCE.clearArray([]);
+                                       r.vAttribsReIsWild = false;
+                               }
+
+                               or[r.tag] = r;
+                       }
+               }
+
+               return or;
+       },
+
+       serializeNodeAsXML : function(n) {
+               var s, b;
+
+               if (!this.xmlDoc) {
+                       if (this.isIE) {
+                               try {this.xmlDoc = new ActiveXObject('MSXML2.DOMDocument');} catch (e) {}
+
+                               if (!this.xmlDoc)
+                                       try {this.xmlDoc = new ActiveXObject('Microsoft.XmlDom');} catch (e) {}
+                       } else
+                               this.xmlDoc = document.implementation.createDocument('', '', null);
+
+                       if (!this.xmlDoc)
+                               alert("Error XML Parser could not be found.");
+               }
+
+               if (this.xmlDoc.firstChild)
+                       this.xmlDoc.removeChild(this.xmlDoc.firstChild);
+
+               b = this.xmlDoc.createElement("html");
+               b = this.xmlDoc.appendChild(b);
+
+               this._convertToXML(n, b);
+
+               if (this.isIE)
+                       return this.xmlDoc.xml;
+               else
+                       return new XMLSerializer().serializeToString(this.xmlDoc);
+       },
+
+       _convertToXML : function(n, xn) {
+               var xd, el, i, l, cn, at, no, hc = false;
+
+               if (tinyMCE.isRealIE && this._isDuplicate(n))
+                       return;
+
+               xd = this.xmlDoc;
+
+               switch (n.nodeType) {
+                       case 1: // Element
+                               hc = n.hasChildNodes();
+
+                               el = xd.createElement(n.nodeName.toLowerCase());
+
+                               at = n.attributes;
+                               for (i=at.length-1; i>-1; i--) {
+                                       no = at[i];
+
+                                       if (no.specified && no.nodeValue)
+                                               el.setAttribute(no.nodeName.toLowerCase(), no.nodeValue);
+                               }
+
+                               if (!hc && !this.closeElementsRe.test(n.nodeName))
+                                       el.appendChild(xd.createTextNode(""));
+
+                               xn = xn.appendChild(el);
+                               break;
+
+                       case 3: // Text
+                               xn.appendChild(xd.createTextNode(n.nodeValue));
+                               return;
+
+                       case 8: // Comment
+                               xn.appendChild(xd.createComment(n.nodeValue));
+                               return;
+               }
+
+               if (hc) {
+                       cn = n.childNodes;
+
+                       for (i=0, l=cn.length; i<l; i++)
+                               this._convertToXML(cn[i], xn);
+               }
+       },
+
+       serializeNodeAsHTML : function(n, inn) {
+               var en, no, h = '', i, l, t, st, r, cn, va = false, f = false, at, hc, cr, nn;
+
+               if (!this.rulesDone)
+                       this._setupRules(); // Will initialize cleanup rules
+
+               if (tinyMCE.isRealIE && this._isDuplicate(n))
+                       return '';
+
+               // Skip non valid child elements
+               if (n.parentNode && this.childRules != null) {
+                       cr = this.childRules[n.parentNode.nodeName];
+
+                       if (typeof(cr) != "undefined" && !cr.test(n.nodeName)) {
+                               st = true;
+                               t = null;
+                       }
+               }
+
+               switch (n.nodeType) {
+                       case 1: // Element
+                               hc = n.hasChildNodes();
+
+                               if (st)
+                                       break;
+
+                               nn = n.nodeName;
+
+                               if (tinyMCE.isRealIE) {
+                                       // MSIE sometimes produces <//tag>
+                                       if (n.nodeName.indexOf('/') != -1)
+                                               break;
+
+                                       // MSIE has it's NS in a separate attrib
+                                       if (n.scopeName && n.scopeName != 'HTML')
+                                               nn = n.scopeName.toUpperCase() + ':' + nn.toUpperCase();
+                               } else if (tinyMCE.isOpera && nn.indexOf(':') > 0)
+                                       nn = nn.toUpperCase();
+
+                               // Convert fonts to spans
+                               if (this.settings.convert_fonts_to_spans) {
+                                       // On get content FONT -> SPAN
+                                       if (this.settings.on_save && nn == 'FONT')
+                                               nn = 'SPAN';
+
+                                       // On insert content SPAN -> FONT
+                                       if (!this.settings.on_save && nn == 'SPAN')
+                                               nn = 'FONT';
+                               }
+
+                               if (this.vElementsRe.test(nn) && (!this.iveRe || !this.iveRe.test(nn)) && !inn) {
+                                       va = true;
+
+                                       r = this.rules[nn];
+                                       if (!r) {
+                                               at = this.rules;
+                                               for (no in at) {
+                                                       if (at[no] && at[no].validRe.test(nn)) {
+                                                               r = at[no];
+                                                               break;
+                                                       }
+                                               }
+                                       }
+
+                                       en = r.isWild ? nn.toLowerCase() : r.oTagName;
+                                       f = r.fill;
+
+                                       if (r.removeEmpty && !hc)
+                                               return "";
+
+                                       t = '<' + en;
+
+                                       if (r.vAttribsReIsWild) {
+                                               // Serialize wildcard attributes
+                                               at = n.attributes;
+                                               for (i=at.length-1; i>-1; i--) {
+                                                       no = at[i];
+                                                       if (no.specified && r.vAttribsRe.test(no.nodeName))
+                                                               t += this._serializeAttribute(n, r, no.nodeName);
+                                               }
+                                       } else {
+                                               // Serialize specific attributes
+                                               for (i=r.vAttribs.length-1; i>-1; i--)
+                                                       t += this._serializeAttribute(n, r, r.vAttribs[i]);
+                                       }
+
+                                       // Serialize mce_ atts
+                                       if (!this.settings.on_save) {
+                                               at = this.mceAttribs;
+
+                                               for (no in at) {
+                                                       if (at[no])
+                                                               t += this._serializeAttribute(n, r, at[no]);
+                                               }
+                                       }
+
+                                       // Check for required attribs
+                                       if (r.reqAttribsRe && !t.match(r.reqAttribsRe))
+                                               t = null;
+
+                                       // Close these
+                                       if (t != null && this.closeElementsRe.test(nn))
+                                               return t + ' />';
+
+                                       if (t != null)
+                                               h += t + '>';
+
+                                       if (this.isIE && this.codeElementsRe.test(nn))
+                                               h += n.innerHTML;
+                               }
+                       break;
+
+                       case 3: // Text
+                               if (st)
+                                       break;
+
+                               if (n.parentNode && this.codeElementsRe.test(n.parentNode.nodeName))
+                                       return this.isIE ? '' : n.nodeValue;
+
+                               return this.xmlEncode(n.nodeValue);
+
+                       case 8: // Comment
+                               if (st)
+                                       break;
+
+                               return "<!--" + this._trimComment(n.nodeValue) + "-->";
+               }
+
+               if (hc) {
+                       cn = n.childNodes;
+
+                       for (i=0, l=cn.length; i<l; i++)
+                               h += this.serializeNodeAsHTML(cn[i]);
+               }
+
+               // Fill empty nodes
+               if (f && !hc)
+                       h += this.fillStr;
+
+               // End element
+               if (t != null && va)
+                       h += '</' + en + '>';
+
+               return h;
+       },
+
+       _serializeAttribute : function(n, r, an) {
+               var av = '', t, os = this.settings.on_save;
+
+               if (os && (an.indexOf('mce_') == 0 || an.indexOf('_moz') == 0))
+                       return '';
+
+               if (os && this.mceAttribs[an])
+                       av = this._getAttrib(n, this.mceAttribs[an]);
+
+               if (av.length == 0)
+                       av = this._getAttrib(n, an);
+
+               if (av.length == 0 && r.defaultAttribs && (t = r.defaultAttribs[an])) {
+                       av = t;
+
+                       if (av == "mce_empty")
+                               return " " + an + '=""';
+               }
+
+               if (r.forceAttribs && (t = r.forceAttribs[an]))
+                       av = t;
+
+               if (os && av.length != 0 && /^(src|href|longdesc)$/.test(an))
+                       av = this._urlConverter(this, n, av);
+
+               if (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av))
+                       return "";
+
+               if (av.length != 0 && av == "{$uid}")
+                       av = "uid_" + (this.idCount++);
+
+               if (av.length != 0) {
+                       if (an.indexOf('on') != 0)
+                               av = this.xmlEncode(av, 1);
+
+                       return " " + an + "=" + '"' + av + '"';
+               }
+
+               return "";
+       },
+
+       formatHTML : function(h) {
+               var s = this.settings, p = '', i = 0, li = 0, o = '', l;
+
+               // Replace BR in pre elements to \n
+               h = h.replace(/<pre([^>]*)>(.*?)<\/pre>/gi, function (a, b, c) {
+                       c = c.replace(/<br\s*\/>/gi, '\n');
+                       return '<pre' + b + '>' + c + '</pre>';
+               });
+
+               h = h.replace(/\r/g, ''); // Windows sux, isn't carriage return a thing of the past :)
+               h = '\n' + h;
+               h = h.replace(new RegExp('\\n\\s+', 'gi'), '\n'); // Remove previous formatting
+               h = h.replace(this.nlBeforeRe, '\n<$1$2>');
+               h = h.replace(this.nlAfterRe, '<$1$2>\n');
+               h = h.replace(this.nlBeforeAfterRe, '\n<$1$2$3>\n');
+               h += '\n';
+
+               //tinyMCE.debug(h);
+
+               while ((i = h.indexOf('\n', i + 1)) != -1) {
+                       if ((l = h.substring(li + 1, i)).length != 0) {
+                               if (this.ouRe.test(l) && p.length >= s.indent_levels)
+                                       p = p.substring(s.indent_levels);
+
+                               o += p + l + '\n';
+       
+                               if (this.inRe.test(l))
+                                       p += this.inStr;
+                       }
+
+                       li = i;
+               }
+
+               //tinyMCE.debug(h);
+
+               return o;
+       },
+
+       xmlEncode : function(s) {
+               var cl = this, re = this.xmlEncodeRe;
+
+               if (!this.entitiesDone)
+                       this._setupEntities(); // Will intialize lookup table
+
+               switch (this.settings.entity_encoding) {
+                       case "raw":
+                               return tinyMCE.xmlEncode(s);
+
+                       case "named":
+                               return s.replace(re, function (c) {
+                                       var b = cl.entities[c.charCodeAt(0)];
+
+                                       return b ? '&' + b + ';' : c;
+                               });
+
+                       case "numeric":
+                               return s.replace(re, function (c) {
+                                       return '&#' + c.charCodeAt(0) + ';';
+                               });
+               }
+
+               return s;
+       },
+
+       split : function(re, s) {
+               var i, l, o = [], c = s.split(re);
+
+               for (i=0, l=c.length; i<l; i++) {
+                       if (c[i] !== '')
+                               o[i] = c[i];
+               }
+
+               return o;
+       },
+
+       _trimComment : function(s) {
+               // Remove mce_src, mce_href
+               s = s.replace(new RegExp('\\smce_src=\"[^\"]*\"', 'gi'), "");
+               s = s.replace(new RegExp('\\smce_href=\"[^\"]*\"', 'gi'), "");
+
+               return s;
+       },
+
+       _getAttrib : function(e, n, d) {
+               var v, ex, nn;
+
+               if (typeof(d) == "undefined")
+                       d = "";
+
+               if (!e || e.nodeType != 1)
+                       return d;
+
+               try {
+                       v = e.getAttribute(n, 0);
+               } catch (ex) {
+                       // IE 7 may cast exception on invalid attributes
+                       v = e.getAttribute(n, 2);
+               }
+
+               if (n == "class" && !v)
+                       v = e.className;
+
+               if (this.isIE) {
+                       if (n == "http-equiv")
+                               v = e.httpEquiv;
+
+                       nn = e.nodeName;
+
+                       // Skip the default values that IE returns
+                       if (nn == "FORM" && n == "enctype" && v == "application/x-www-form-urlencoded")
+                               v = "";
+
+                       if (nn == "INPUT" && n == "size" && v == "20")
+                               v = "";
+
+                       if (nn == "INPUT" && n == "maxlength" && v == "2147483647")
+                               v = "";
+
+                       // Images
+                       if (n == "width" || n == "height")
+                               v = e.getAttribute(n, 2);
+               }
+
+               if (n == 'style' && v) {
+                       if (!tinyMCE.isOpera)
+                               v = e.style.cssText;
+
+                       v = tinyMCE.serializeStyle(tinyMCE.parseStyle(v));
+               }
+
+               if (this.settings.on_save && n.indexOf('on') != -1 && this.settings.on_save && v && v !== '')
+                       v = tinyMCE.cleanupEventStr(v);
+
+               return (v && v !== '') ? '' + v : d;
+       },
+
+       _urlConverter : function(c, n, v) {
+               if (!c.settings.on_save)
+                       return tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, v);
+               else if (tinyMCE.getParam('convert_urls')) {
+                       if (!this.urlConverter)
+                               this.urlConverter = eval(tinyMCE.settings.urlconverter_callback);
+
+                       return this.urlConverter(v, n, true);
+               }
+
+               return v;
+       },
+
+       _arrayToRe : function(a, op, be, af) {
+               var i, r;
+
+               op = typeof(op) == "undefined" ? "gi" : op;
+               be = typeof(be) == "undefined" ? "^(" : be;
+               af = typeof(af) == "undefined" ? ")$" : af;
+
+               r = be;
+
+               for (i=0; i<a.length; i++)
+                       r += this._wildcardToRe(a[i]) + (i != a.length-1 ? "|" : "");
+
+               r += af;
+
+               return new RegExp(r, op);
+       },
+
+       _wildcardToRe : function(s) {
+               s = s.replace(/\?/g, '(\\S?)');
+               s = s.replace(/\+/g, '(\\S+)');
+               s = s.replace(/\*/g, '(\\S*)');
+
+               return s;
+       },
+
+       _setupEntities : function() {
+               var n, a, i, s = this.settings;
+
+               // Setup entities
+               if (s.entity_encoding == "named") {
+                       n = tinyMCE.clearArray([]);
+                       a = this.split(',', s.entities);
+                       for (i=0; i<a.length; i+=2)
+                               n[a[i]] = a[i+1];
+
+                       this.entities = n;
+               }
+
+               this.entitiesDone = true;
+       },
+
+       _setupRules : function() {
+               var s = this.settings;
+
+               // Setup default rule
+               this.addRuleStr(s.valid_elements);
+               this.addRuleStr(s.extended_valid_elements);
+               this.addChildRemoveRuleStr(s.valid_child_elements);
+
+               this.rulesDone = true;
+       },
+
+       _isDuplicate : function(n) {
+               var i, l, sn;
+
+               if (!this.settings.fix_content_duplication)
+                       return false;
+
+               if (tinyMCE.isRealIE && n.nodeType == 1) {
+                       // Mark elements
+                       if (n.mce_serialized == this.serializationId)
+                               return true;
+
+                       n.setAttribute('mce_serialized', this.serializationId);
+               } else {
+                       sn = this.serializedNodes;
+
+                       // Search lookup table for text nodes  and comments
+                       for (i=0, l = sn.length; i<l; i++) {
+                               if (sn[i] == n)
+                                       return true;
+                       }
+
+                       sn.push(n);
+               }
+
+               return false;
+       }
+
+       };
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_DOMUtils.class.js */
+
+tinyMCE.add(TinyMCE_Engine, {
+       createTagHTML : function(tn, a, h) {
+               var o = '', f = tinyMCE.xmlEncode, n;
+
+               o = '<' + tn;
+
+               if (a) {
+                       for (n in a) {
+                               if (typeof(a[n]) != 'function' && a[n] != null)
+                                       o += ' ' + f(n) + '="' + f('' + a[n]) + '"';
+                       }
+               }
+
+               o += !h ? ' />' : '>' + h + '</' + tn + '>';
+
+               return o;
+       },
+
+       createTag : function(d, tn, a, h) {
+               var o = d.createElement(tn), n;
+
+               if (a) {
+                       for (n in a) {
+                               if (typeof(a[n]) != 'function' && a[n] != null)
+                                       tinyMCE.setAttrib(o, n, a[n]);
+                       }
+               }
+
+               if (h)
+                       o.innerHTML = h;
+
+               return o;
+       },
+
+       getElementByAttributeValue : function(n, e, a, v) {
+               return (n = this.getElementsByAttributeValue(n, e, a, v)).length == 0 ? null : n[0];
+       },
+
+       getElementsByAttributeValue : function(n, e, a, v) {
+               var i, nl = n.getElementsByTagName(e), o = [];
+
+               for (i=0; i<nl.length; i++) {
+                       if (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)
+                               o[o.length] = nl[i];
+               }
+
+               return o;
+       },
+
+       isBlockElement : function(n) {
+               return n != null && n.nodeType == 1 && this.blockRegExp.test(n.nodeName);
+       },
+
+       getParentBlockElement : function(n, r) {
+               return this.getParentNode(n, function(n) {
+                       return tinyMCE.isBlockElement(n);
+               }, r);
+
+               return null;
+       },
+
+       insertAfter : function(n, r){
+               if (r.nextSibling)
+                       r.parentNode.insertBefore(n, r.nextSibling);
+               else
+                       r.parentNode.appendChild(n);
+       },
+
+       setInnerHTML : function(e, h) {
+               var i, nl, n;
+
+               // Convert all strong/em to b/i in Gecko
+               if (tinyMCE.isGecko) {
+                       h = h.replace(/<embed([^>]*)>/gi, '<tmpembed$1>');
+                       h = h.replace(/<em([^>]*)>/gi, '<i$1>');
+                       h = h.replace(/<tmpembed([^>]*)>/gi, '<embed$1>');
+                       h = h.replace(/<strong([^>]*)>/gi, '<b$1>');
+                       h = h.replace(/<\/strong>/gi, '</b>');
+                       h = h.replace(/<\/em>/gi, '</i>');
+               }
+
+               if (tinyMCE.isRealIE) {
+                       // Since MSIE handles invalid HTML better that valid XHTML we
+                       // need to make some things invalid. <hr /> gets converted to <hr>.
+                       h = h.replace(/\s\/>/g, '>');
+
+                       // Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones
+                       h = h.replace(/<p([^>]*)>\u00A0?<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
+                       h = h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
+                       h = h.replace(/<p([^>]*)>\s+<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs
+
+                       // Remove first comment
+                       e.innerHTML = tinyMCE.uniqueTag + h;
+                       e.firstChild.removeNode(true);
+
+                       // Remove weird auto generated empty paragraphs unless it's supposed to be there
+                       nl = e.getElementsByTagName("p");
+                       for (i=nl.length-1; i>=0; i--) {
+                               n = nl[i];
+
+                               if (n.nodeName == 'P' && !n.hasChildNodes() && !n.mce_keep)
+                                       n.parentNode.removeChild(n);
+                       }
+               } else {
+                       h = this.fixGeckoBaseHREFBug(1, e, h);
+                       e.innerHTML = h;
+                       this.fixGeckoBaseHREFBug(2, e, h);
+               }
+       },
+
+       getOuterHTML : function(e) {
+               var d;
+
+               if (tinyMCE.isIE)
+                       return e.outerHTML;
+
+               d = e.ownerDocument.createElement("body");
+               d.appendChild(e.cloneNode(true));
+
+               return d.innerHTML;
+       },
+
+       setOuterHTML : function(e, h, d) {
+               var d = typeof(d) == "undefined" ? e.ownerDocument : d, i, nl, t;
+
+               if (tinyMCE.isIE && e.nodeType == 1)
+                       e.outerHTML = h;
+               else {
+                       t = d.createElement("body");
+                       t.innerHTML = h;
+
+                       for (i=0, nl=t.childNodes; i<nl.length; i++)
+                               e.parentNode.insertBefore(nl[i].cloneNode(true), e);
+
+                       e.parentNode.removeChild(e);
+               }
+       },
+
+       _getElementById : function(id, d) {
+               var e, i, j, f;
+
+               if (typeof(d) == "undefined")
+                       d = document;
+
+               e = d.getElementById(id);
+               if (!e) {
+                       f = d.forms;
+
+                       for (i=0; i<f.length; i++) {
+                               for (j=0; j<f[i].elements.length; j++) {
+                                       if (f[i].elements[j].name == id) {
+                                               e = f[i].elements[j];
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               return e;
+       },
+
+       getNodeTree : function(n, na, t, nn) {
+               return this.selectNodes(n, function(n) {
+                       return (!t || n.nodeType == t) && (!nn || n.nodeName == nn);
+               }, na ? na : []);
+       },
+
+       getParentElement : function(n, na, f, r) {
+               var re = na ? new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$') : 0, v;
+
+               // Compatiblity with old scripts where f param was a attribute string
+               if (f && typeof(f) == 'string')
+                       return this.getParentElement(n, na, function(no) {return tinyMCE.getAttrib(no, f) !== '';});
+
+               return this.getParentNode(n, function(n) {
+                       return ((n.nodeType == 1 && !re) || (re && re.test(n.nodeName))) && (!f || f(n));
+               }, r);
+       },
+
+       getParentNode : function(n, f, r) {
+               while (n) {
+                       if (n == r)
+                               return null;
+
+                       if (f(n))
+                               return n;
+
+                       n = n.parentNode;
+               }
+
+               return null;
+       },
+
+       getAttrib : function(elm, name, dv) {
+               var v;
+
+               if (typeof(dv) == "undefined")
+                       dv = "";
+
+               // Not a element
+               if (!elm || elm.nodeType != 1)
+                       return dv;
+
+               try {
+                       v = elm.getAttribute(name, 0);
+               } catch (ex) {
+                       // IE 7 may cast exception on invalid attributes
+                       v = elm.getAttribute(name, 2);
+               }
+
+               // Try className for class attrib
+               if (name == "class" && !v)
+                       v = elm.className;
+
+               // Workaround for a issue with Firefox 1.5rc2+
+               if (tinyMCE.isGecko) {
+                       if (name == "src" && elm.src != null && elm.src !== '')
+                               v = elm.src;
+
+                       // Workaround for a issue with Firefox 1.5rc2+
+                       if (name == "href" && elm.href != null && elm.href !== '')
+                               v = elm.href;
+               } else if (tinyMCE.isIE) {
+                       switch (name) {
+                               case "http-equiv":
+                                       v = elm.httpEquiv;
+                                       break;
+
+                               case "width":
+                               case "height":
+                                       v = elm.getAttribute(name, 2);
+                                       break;
+                       }
+               }
+
+               if (name == "style" && !tinyMCE.isOpera)
+                       v = elm.style.cssText;
+
+               return (v && v !== '') ? v : dv;
+       },
+
+       setAttrib : function(el, name, va, fix) {
+               if (typeof(va) == "number" && va != null)
+                       va = "" + va;
+
+               if (fix) {
+                       if (va == null)
+                               va = "";
+
+                       va = va.replace(/[^0-9%]/g, '');
+               }
+
+               if (name == "style")
+                       el.style.cssText = va;
+
+               if (name == "class")
+                       el.className = va;
+
+               if (va != null && va !== '' && va != -1)
+                       el.setAttribute(name, va);
+               else
+                       el.removeAttribute(name);
+       },
+
+       setStyleAttrib : function(e, n, v) {
+               e.style[n] = v;
+
+               // Style attrib deleted in IE
+               if (tinyMCE.isIE && v == null || v == '') {
+                       v = tinyMCE.serializeStyle(tinyMCE.parseStyle(e.style.cssText));
+                       e.style.cssText = v;
+                       e.setAttribute("style", v);
+               }
+       },
+
+       switchClass : function(ei, c) {
+               var e;
+
+               if (tinyMCE.switchClassCache[ei])
+                       e = tinyMCE.switchClassCache[ei];
+               else
+                       e = tinyMCE.switchClassCache[ei] = document.getElementById(ei);
+
+               if (e) {
+                       // Keep tile mode
+                       if (tinyMCE.settings.button_tile_map && e.className && e.className.indexOf('mceTiledButton') == 0)
+                               c = 'mceTiledButton ' + c;
+
+                       e.className = c;
+               }
+       },
+
+       getAbsPosition : function(n, cn) {
+               var l = 0, t = 0;
+
+               while (n && n != cn) {
+                       l += n.offsetLeft;
+                       t += n.offsetTop;
+                       n = n.offsetParent;
+               }
+
+               return {absLeft : l, absTop : t};
+       },
+
+       prevNode : function(e, n) {
+               var a = n.split(','), i;
+
+               while ((e = e.previousSibling) != null) {
+                       for (i=0; i<a.length; i++) {
+                               if (e.nodeName == a[i])
+                                       return e;
+                       }
+               }
+
+               return null;
+       },
+
+       nextNode : function(e, n) {
+               var a = n.split(','), i;
+
+               while ((e = e.nextSibling) != null) {
+                       for (i=0; i<a.length; i++) {
+                               if (e.nodeName == a[i])
+                                       return e;
+                       }
+               }
+
+               return null;
+       },
+
+       selectElements : function(n, na, f) {
+               var i, a = [], nl, x;
+
+               for (x=0, na = na.split(','); x<na.length; x++)
+                       for (i=0, nl = n.getElementsByTagName(na[x]); i<nl.length; i++)
+                               (!f || f(nl[i])) && a.push(nl[i]);
+
+               return a;
+       },
+
+       selectNodes : function(n, f, a) {
+               var i;
+
+               if (!a)
+                       a = [];
+
+               if (f(n))
+                       a[a.length] = n;
+
+               if (n.hasChildNodes()) {
+                       for (i=0; i<n.childNodes.length; i++)
+                               tinyMCE.selectNodes(n.childNodes[i], f, a);
+               }
+
+               return a;
+       },
+
+       addCSSClass : function(e, c, b) {
+               var o = this.removeCSSClass(e, c);
+               return e.className = b ? c + (o !== '' ? (' ' + o) : '') : (o !== '' ? (o + ' ') : '') + c;
+       },
+
+       removeCSSClass : function(e, c) {
+               c = e.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');
+               return e.className = c != ' ' ? c : '';
+       },
+
+       hasCSSClass : function(n, c) {
+               return new RegExp('\\b' + c + '\\b', 'g').test(n.className);
+       },
+
+       renameElement : function(e, n, d) {
+               var ne, i, ar;
+
+               d = typeof(d) == "undefined" ? tinyMCE.selectedInstance.getDoc() : d;
+
+               if (e) {
+                       ne = d.createElement(n);
+
+                       ar = e.attributes;
+                       for (i=ar.length-1; i>-1; i--) {
+                               if (ar[i].specified && ar[i].nodeValue)
+                                       ne.setAttribute(ar[i].nodeName.toLowerCase(), ar[i].nodeValue);
+                       }
+
+                       ar = e.childNodes;
+                       for (i=0; i<ar.length; i++)
+                               ne.appendChild(ar[i].cloneNode(true));
+
+                       e.parentNode.replaceChild(ne, e);
+               }
+       },
+
+       getViewPort : function(w) {
+               var d = w.document, m = d.compatMode == 'CSS1Compat', b = d.body, de = d.documentElement;
+
+               return {
+                       left : w.pageXOffset || (m ? de.scrollLeft : b.scrollLeft),
+                       top : w.pageYOffset || (m ? de.scrollTop : b.scrollTop),
+                       width : w.innerWidth || (m ? de.clientWidth : b.clientWidth),
+                       height : w.innerHeight || (m ? de.clientHeight : b.clientHeight)
+               };
+       },
+
+       getStyle : function(n, na, d) {
+               if (!n)
+                       return false;
+
+               // Gecko
+               if (tinyMCE.isGecko && n.ownerDocument.defaultView) {
+                       try {
+                               return n.ownerDocument.defaultView.getComputedStyle(n, null).getPropertyValue(na);
+                       } catch (n) {
+                               // Old safari might fail
+                               return null;
+                       }
+               }
+
+               // Camelcase it, if needed
+               na = na.replace(/-(\D)/g, function(a, b){
+                       return b.toUpperCase();
+               });
+
+               // IE & Opera
+               if (n.currentStyle)
+                       return n.currentStyle[na];
+
+               return false;
+       }
+
+       });
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_URL.class.js */
+
+tinyMCE.add(TinyMCE_Engine, {
+       parseURL : function(url_str) {
+               var urlParts = [], i, pos, lastPos, chr;
+
+               if (url_str) {
+                       // Parse protocol part
+                       pos = url_str.indexOf('://');
+                       if (pos != -1) {
+                               urlParts.protocol = url_str.substring(0, pos);
+                               lastPos = pos + 3;
+                       }
+
+                       // Find port or path start
+                       for (i=lastPos; i<url_str.length; i++) {
+                               chr = url_str.charAt(i);
+
+                               if (chr == ':')
+                                       break;
+
+                               if (chr == '/')
+                                       break;
+                       }
+                       pos = i;
+
+                       // Get host
+                       urlParts.host = url_str.substring(lastPos, pos);
+
+                       // Get port
+                       urlParts.port = "";
+                       lastPos = pos;
+                       if (url_str.charAt(pos) == ':') {
+                               pos = url_str.indexOf('/', lastPos);
+                               urlParts.port = url_str.substring(lastPos+1, pos);
+                       }
+
+                       // Get path
+                       lastPos = pos;
+                       pos = url_str.indexOf('?', lastPos);
+
+                       if (pos == -1)
+                               pos = url_str.indexOf('#', lastPos);
+
+                       if (pos == -1)
+                               pos = url_str.length;
+
+                       urlParts.path = url_str.substring(lastPos, pos);
+
+                       // Get query
+                       lastPos = pos;
+                       if (url_str.charAt(pos) == '?') {
+                               pos = url_str.indexOf('#');
+                               pos = (pos == -1) ? url_str.length : pos;
+                               urlParts.query = url_str.substring(lastPos+1, pos);
+                       }
+
+                       // Get anchor
+                       lastPos = pos;
+                       if (url_str.charAt(pos) == '#') {
+                               pos = url_str.length;
+                               urlParts.anchor = url_str.substring(lastPos+1, pos);
+                       }
+               }
+
+               return urlParts;
+       },
+
+       serializeURL : function(up) {
+               var o = "";
+
+               if (up.protocol)
+                       o += up.protocol + "://";
+
+               if (up.host)
+                       o += up.host;
+
+               if (up.port)
+                       o += ":" + up.port;
+
+               if (up.path)
+                       o += up.path;
+
+               if (up.query)
+                       o += "?" + up.query;
+
+               if (up.anchor)
+                       o += "#" + up.anchor;
+
+               return o;
+       },
+
+       convertAbsoluteURLToRelativeURL : function(base_url, url_to_relative) {
+               var baseURL = this.parseURL(base_url), targetURL = this.parseURL(url_to_relative);
+               var i, strTok1, strTok2, breakPoint = 0, outPath = "", forceSlash = false;
+               var fileName, pos;
+
+               if (targetURL.path == '')
+                       targetURL.path = "/";
+               else
+                       forceSlash = true;
+
+               // Crop away last path part
+               base_url = baseURL.path.substring(0, baseURL.path.lastIndexOf('/'));
+               strTok1 = base_url.split('/');
+               strTok2 = targetURL.path.split('/');
+
+               if (strTok1.length >= strTok2.length) {
+                       for (i=0; i<strTok1.length; i++) {
+                               if (i >= strTok2.length || strTok1[i] != strTok2[i]) {
+                                       breakPoint = i + 1;
+                                       break;
+                               }
+                       }
+               }
+
+               if (strTok1.length < strTok2.length) {
+                       for (i=0; i<strTok2.length; i++) {
+                               if (i >= strTok1.length || strTok1[i] != strTok2[i]) {
+                                       breakPoint = i + 1;
+                                       break;
+                               }
+                       }
+               }
+
+               if (breakPoint == 1)
+                       return targetURL.path;
+
+               for (i=0; i<(strTok1.length-(breakPoint-1)); i++)
+                       outPath += "../";
+
+               for (i=breakPoint-1; i<strTok2.length; i++) {
+                       if (i != (breakPoint-1))
+                               outPath += "/" + strTok2[i];
+                       else
+                               outPath += strTok2[i];
+               }
+
+               targetURL.protocol = null;
+               targetURL.host = null;
+               targetURL.port = null;
+               targetURL.path = outPath == '' && forceSlash ? "/" : outPath;
+
+               // Remove document prefix from local anchors
+               fileName = baseURL.path;
+
+               if ((pos = fileName.lastIndexOf('/')) != -1)
+                       fileName = fileName.substring(pos + 1);
+
+               // Is local anchor
+               if (fileName == targetURL.path && targetURL.anchor !== '')
+                       targetURL.path = "";
+
+               // If empty and not local anchor force filename or slash
+               if (targetURL.path == '' && !targetURL.anchor)
+                       targetURL.path = fileName !== '' ? fileName : "/";
+
+               return this.serializeURL(targetURL);
+       },
+
+       convertRelativeToAbsoluteURL : function(base_url, relative_url) {
+               var baseURL = this.parseURL(base_url), baseURLParts, relURLParts, newRelURLParts, numBack, relURL = this.parseURL(relative_url), i;
+               var len, absPath, start, end, newBaseURLParts;
+
+               if (relative_url == '' || relative_url.indexOf('://') != -1 || /^(mailto:|javascript:|#|\/)/.test(relative_url))
+                       return relative_url;
+
+               // Split parts
+               baseURLParts = baseURL.path.split('/');
+               relURLParts = relURL.path.split('/');
+
+               // Remove empty chunks
+               newBaseURLParts = [];
+               for (i=baseURLParts.length-1; i>=0; i--) {
+                       if (baseURLParts[i].length == 0)
+                               continue;
+
+                       newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];
+               }
+               baseURLParts = newBaseURLParts.reverse();
+
+               // Merge relURLParts chunks
+               newRelURLParts = [];
+               numBack = 0;
+               for (i=relURLParts.length-1; i>=0; i--) {
+                       if (relURLParts[i].length == 0 || relURLParts[i] == ".")
+                               continue;
+
+                       if (relURLParts[i] == '..') {
+                               numBack++;
+                               continue;
+                       }
+
+                       if (numBack > 0) {
+                               numBack--;
+                               continue;
+                       }
+
+                       newRelURLParts[newRelURLParts.length] = relURLParts[i];
+               }
+
+               relURLParts = newRelURLParts.reverse();
+
+               // Remove end from absolute path
+               len = baseURLParts.length-numBack;
+               absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/');
+               start = "";
+               end = "";
+
+               // Build output URL
+               relURL.protocol = baseURL.protocol;
+               relURL.host = baseURL.host;
+               relURL.port = baseURL.port;
+
+               // Re-add trailing slash if it's removed
+               if (relURL.path.charAt(relURL.path.length-1) == "/")
+                       absPath += "/";
+
+               relURL.path = absPath;
+
+               return this.serializeURL(relURL);
+       },
+
+       convertURL : function(url, node, on_save) {
+               var dl = document.location, start, portPart, urlParts, baseUrlParts, tmpUrlParts, curl;
+               var prot = dl.protocol, host = dl.hostname, port = dl.port;
+
+               // Pass through file protocol
+               if (prot == "file:")
+                       return url;
+
+               // Something is wrong, remove weirdness
+               url = tinyMCE.regexpReplace(url, '(http|https):///', '/');
+
+               // Mailto link or anchor (Pass through)
+               if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || /^[ \t\r\n\+]*[#\?]/.test(url))
+                       return url;
+
+               // Fix relative/Mozilla
+               if (!tinyMCE.isIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/')
+                       return tinyMCE.settings.base_href + url;
+
+               // Handle relative URLs
+               if (on_save && tinyMCE.getParam('relative_urls')) {
+                       curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, url);
+                       if (curl.charAt(0) == '/')
+                               curl = tinyMCE.settings.document_base_prefix + curl;
+
+                       urlParts = tinyMCE.parseURL(curl);
+                       tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings.document_base_url);
+
+                       // Force relative
+                       if (urlParts.host == tmpUrlParts.host && (urlParts.port == tmpUrlParts.port))
+                               return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings.document_base_url, curl);
+               }
+
+               // Handle absolute URLs
+               if (!tinyMCE.getParam('relative_urls')) {
+                       urlParts = tinyMCE.parseURL(url);
+                       baseUrlParts = tinyMCE.parseURL(tinyMCE.settings.base_href);
+
+                       // Force absolute URLs from relative URLs
+                       url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, url);
+
+                       // If anchor and path is the same page
+                       if (urlParts.anchor && urlParts.path == baseUrlParts.path)
+                               return "#" + urlParts.anchor;
+               }
+
+               // Remove current domain
+               if (tinyMCE.getParam('remove_script_host')) {
+                       start = "";
+                       portPart = "";
+
+                       if (port !== '')
+                               portPart = ":" + port;
+
+                       start = prot + "//" + host + portPart + "/";
+
+                       if (url.indexOf(start) == 0)
+                               url = url.substring(start.length-1);
+               }
+
+               return url;
+       },
+
+       convertAllRelativeURLs : function(body) {
+               var i, elms, src, href, mhref, msrc;
+
+               // Convert all image URL:s to absolute URL
+               elms = body.getElementsByTagName("img");
+               for (i=0; i<elms.length; i++) {
+                       src = tinyMCE.getAttrib(elms[i], 'src');
+
+                       msrc = tinyMCE.getAttrib(elms[i], 'mce_src');
+                       if (msrc !== '')
+                               src = msrc;
+
+                       if (src !== '') {
+                               src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, src);
+                               elms[i].setAttribute("src", src);
+                       }
+               }
+
+               // Convert all link URL:s to absolute URL
+               elms = body.getElementsByTagName("a");
+               for (i=0; i<elms.length; i++) {
+                       href = tinyMCE.getAttrib(elms[i], 'href');
+
+                       mhref = tinyMCE.getAttrib(elms[i], 'mce_href');
+                       if (mhref !== '')
+                               href = mhref;
+
+                       if (href && href !== '') {
+                               href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, href);
+                               elms[i].setAttribute("href", href);
+                       }
+               }
+       }
+
+       });
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Array.class.js */
+
+tinyMCE.add(TinyMCE_Engine, {
+       clearArray : function(a) {
+               var n;
+
+               for (n in a)
+                       a[n] = null;
+
+               return a;
+       },
+
+       explode : function(d, s) {
+               var ar = s.split(d), oar = [], i;
+
+               for (i = 0; i<ar.length; i++) {
+                       if (ar[i] !== '')
+                               oar[oar.length] = ar[i];
+               }
+
+               return oar;
+       }
+});
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Event.class.js */
+
+tinyMCE.add(TinyMCE_Engine, {
+       _setEventsEnabled : function(node, state) {
+               var evs, x, y, elms, i, event;
+               var events = ['onfocus','onblur','onclick','ondblclick',
+                                       'onmousedown','onmouseup','onmouseover','onmousemove',
+                                       'onmouseout','onkeypress','onkeydown','onkeydown','onkeyup'];
+
+               evs = tinyMCE.settings.event_elements.split(',');
+               for (y=0; y<evs.length; y++){
+                       elms = node.getElementsByTagName(evs[y]);
+                       for (i=0; i<elms.length; i++) {
+                               event = "";
+
+                               for (x=0; x<events.length; x++) {
+                                       if ((event = tinyMCE.getAttrib(elms[i], events[x])) !== '') {
+                                               event = tinyMCE.cleanupEventStr("" + event);
+
+                                               if (!state)
+                                                       event = "return true;" + event;
+                                               else
+                                                       event = event.replace(/^return true;/gi, '');
+
+                                               elms[i].removeAttribute(events[x]);
+                                               elms[i].setAttribute(events[x], event);
+                                       }
+                               }
+                       }
+               }
+       },
+
+       _eventPatch : function(editor_id) {
+               var n, inst, win, e;
+
+               // Remove odd, error
+               if (typeof(tinyMCE) == "undefined")
+                       return true;
+
+               try {
+                       // Try selected instance first
+                       if (tinyMCE.selectedInstance) {
+                               win = tinyMCE.selectedInstance.getWin();
+
+                               if (win && win.event) {
+                                       e = win.event;
+
+                                       if (!e.target)
+                                               e.target = e.srcElement;
+
+                                       TinyMCE_Engine.prototype.handleEvent(e);
+                                       return;
+                               }
+                       }
+
+                       // Search for it
+                       for (n in tinyMCE.instances) {
+                               inst = tinyMCE.instances[n];
+
+                               if (!tinyMCE.isInstance(inst))
+                                       continue;
+
+                               inst.select();
+                               win = inst.getWin();
+
+                               if (win && win.event) {
+                                       e = win.event;
+
+                                       if (!e.target)
+                                               e.target = e.srcElement;
+
+                                       TinyMCE_Engine.prototype.handleEvent(e);
+                                       return;
+                               }
+                       }
+               } catch (ex) {
+                       // Ignore error if iframe is pointing to external URL
+               }
+       },
+
+       findEvent : function(e) {
+               var n, inst;
+
+               if (e)
+                       return e;
+
+               for (n in tinyMCE.instances) {
+                       inst = tinyMCE.instances[n];
+
+                       if (tinyMCE.isInstance(inst) && inst.getWin().event)
+                               return inst.getWin().event;
+               }
+
+               return null;
+       },
+
+       unloadHandler : function() {
+               tinyMCE.triggerSave(true, true);
+       },
+
+       addEventHandlers : function(inst) {
+               this.setEventHandlers(inst, 1);
+       },
+
+       setEventHandlers : function(inst, s) {
+               var doc = inst.getDoc(), ie, ot, i, f = s ? tinyMCE.addEvent : tinyMCE.removeEvent;
+
+               ie = ['keypress', 'keyup', 'keydown', 'click', 'mouseup', 'mousedown', 'controlselect', 'dblclick'];
+               ot = ['keypress', 'keyup', 'keydown', 'click', 'mouseup', 'mousedown', 'focus', 'blur', 'dragdrop'];
+
+               inst.switchSettings();
+
+               if (tinyMCE.isIE) {
+                       for (i=0; i<ie.length; i++)
+                               f(doc, ie[i], TinyMCE_Engine.prototype._eventPatch);
+               } else {
+                       for (i=0; i<ot.length; i++)
+                               f(doc, ot[i], tinyMCE.handleEvent);
+
+                       // Force designmode
+                       try {
+                               doc.designMode = "On";
+                       } catch (e) {
+                               // Ignore
+                       }
+               }
+       },
+
+       onMouseMove : function() {
+               var inst, lh;
+
+               // Fix for IE7 bug where it's not restoring hover on anchors correctly
+               if (tinyMCE.lastHover) {
+                       lh = tinyMCE.lastHover;
+
+                       // Call out on menus and refresh class on normal buttons
+                       if (lh.className.indexOf('mceMenu') != -1)
+                               tinyMCE._menuButtonEvent('out', lh);
+                       else
+                               lh.className = lh.className;
+
+                       tinyMCE.lastHover = null;
+               }
+
+               if (!tinyMCE.hasMouseMoved) {
+                       inst = tinyMCE.selectedInstance;
+
+                       // Workaround for bug #1437457 (Odd MSIE bug)
+                       if (inst.isFocused) {
+                               inst.undoBookmark = inst.selection.getBookmark();
+                               tinyMCE.hasMouseMoved = true;
+                       }
+               }
+
+       //      tinyMCE.cancelEvent(inst.getWin().event);
+       //      return false;
+       },
+
+       cancelEvent : function(e) {
+               if (!e)
+                       return false;
+
+               if (tinyMCE.isIE) {
+                       e.returnValue = false;
+                       e.cancelBubble = true;
+               } else {
+                       e.preventDefault();
+                       e.stopPropagation && e.stopPropagation();
+               }
+
+               return false;
+       },
+
+       addEvent : function(o, n, h) {
+               // Add cleanup for all non unload events
+               if (n != 'unload') {
+                       function clean() {
+                               var ex;
+
+                               try {
+                                       tinyMCE.removeEvent(o, n, h);
+                                       tinyMCE.removeEvent(window, 'unload', clean);
+                                       o = n = h = null;
+                               } catch (ex) {
+                                       // IE may produce access denied exception on unload
+                               }
+                       }
+
+                       // Add memory cleaner
+                       tinyMCE.addEvent(window, 'unload', clean);
+               }
+
+               if (o.attachEvent)
+                       o.attachEvent("on" + n, h);
+               else
+                       o.addEventListener(n, h, false);
+       },
+
+       removeEvent : function(o, n, h) {
+               if (o.detachEvent)
+                       o.detachEvent("on" + n, h);
+               else
+                       o.removeEventListener(n, h, false);
+       },
+
+       addSelectAccessibility : function(e, s, w) {
+               // Add event handlers 
+               if (!s._isAccessible) {
+                       s.onkeydown = tinyMCE.accessibleEventHandler;
+                       s.onblur = tinyMCE.accessibleEventHandler;
+                       s._isAccessible = true;
+                       s._win = w;
+               }
+
+               return false;
+       },
+
+       accessibleEventHandler : function(e) {
+               var elm, win = this._win;
+
+               e = tinyMCE.isIE ? win.event : e;
+               elm = tinyMCE.isIE ? e.srcElement : e.target;
+
+               // Unpiggyback onchange on blur
+               if (e.type == "blur") {
+                       if (elm.oldonchange) {
+                               elm.onchange = elm.oldonchange;
+                               elm.oldonchange = null;
+                       }
+
+                       return true;
+               }
+
+               // Piggyback onchange
+               if (elm.nodeName == "SELECT" && !elm.oldonchange) {
+                       elm.oldonchange = elm.onchange;
+                       elm.onchange = null;
+               }
+
+               // Execute onchange and remove piggyback
+               if (e.keyCode == 13 || e.keyCode == 32) {
+                       elm.onchange = elm.oldonchange;
+                       elm.onchange();
+                       elm.oldonchange = null;
+
+                       tinyMCE.cancelEvent(e);
+                       return false;
+               }
+
+               return true;
+       },
+
+       _resetIframeHeight : function() {
+               var ife;
+
+               if (tinyMCE.isRealIE) {
+                       ife = tinyMCE.selectedInstance.iframeElement;
+
+       /*              if (ife._oldWidth) {
+                               ife.style.width = ife._oldWidth;
+                               ife.width = ife._oldWidth;
+                       }*/
+
+                       if (ife._oldHeight) {
+                               ife.style.height = ife._oldHeight;
+                               ife.height = ife._oldHeight;
+                       }
+               }
+       }
+
+       });
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Selection.class.js */
+
+function TinyMCE_Selection(inst) {
+       this.instance = inst;
+};
+
+TinyMCE_Selection.prototype = {
+       getSelectedHTML : function() {
+               var inst = this.instance, e, r = this.getRng(), h;
+
+               if (!r)
+                       return null;
+
+               e = document.createElement("body");
+
+               if (r.cloneContents)
+                       e.appendChild(document.importNode(r.cloneContents(), true));
+               else if (typeof(r.item) != 'undefined' || typeof(r.htmlText) != 'undefined')
+                       e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;
+               else
+                       e.innerHTML = r.toString(); // Failed, use text for now
+
+               h = tinyMCE._cleanupHTML(inst, inst.contentDocument, inst.settings, e, e, false, true, false);
+
+               // When editing always use fonts internaly
+               //if (tinyMCE.getParam("convert_fonts_to_spans"))
+               //      tinyMCE.convertSpansToFonts(inst.getDoc());
+
+               return h;
+       },
+
+       getSelectedText : function() {
+               var inst = this.instance, d, r, s, t;
+
+               if (tinyMCE.isIE) {
+                       d = inst.getDoc();
+
+                       if (d.selection.type == "Text") {
+                               r = d.selection.createRange();
+                               t = r.text;
+                       } else
+                               t = '';
+               } else {
+                       s = this.getSel();
+
+                       if (s && s.toString)
+                               t = s.toString();
+                       else
+                               t = '';
+               }
+
+               return t;
+       },
+
+       getBookmark : function(simple) {
+               var inst = this.instance, rng = this.getRng(), doc = inst.getDoc(), b = inst.getBody();
+               var trng, sx, sy, xx = -999999999, vp = inst.getViewPort();
+               var sp, le, s, e, nl, i, si, ei, w;
+
+               sx = vp.left;
+               sy = vp.top;
+
+               if (simple)
+                       return {rng : rng, scrollX : sx, scrollY : sy};
+
+               if (tinyMCE.isRealIE) {
+                       if (rng.item) {
+                               e = rng.item(0);
+
+                               nl = b.getElementsByTagName(e.nodeName);
+                               for (i=0; i<nl.length; i++) {
+                                       if (e == nl[i]) {
+                                               sp = i;
+                                               break;
+                                       }
+                               }
+
+                               return {
+                                       tag : e.nodeName,
+                                       index : sp,
+                                       scrollX : sx,
+                                       scrollY : sy
+                               };
+                       } else {
+                               trng = doc.body.createTextRange();
+                               trng.moveToElementText(inst.getBody());
+                               trng.collapse(true);
+                               bp = Math.abs(trng.move('character', xx));
+
+                               trng = rng.duplicate();
+                               trng.collapse(true);
+                               sp = Math.abs(trng.move('character', xx));
+
+                               trng = rng.duplicate();
+                               trng.collapse(false);
+                               le = Math.abs(trng.move('character', xx)) - sp;
+
+                               return {
+                                       start : sp - bp,
+                                       length : le,
+                                       scrollX : sx,
+                                       scrollY : sy
+                               };
+                       }
+               } else {
+                       s = this.getSel();
+                       e = this.getFocusElement();
+
+                       if (!s)
+                               return null;
+
+                       if (e && e.nodeName == 'IMG') {
+                               /*nl = b.getElementsByTagName('IMG');
+                               for (i=0; i<nl.length; i++) {
+                                       if (e == nl[i]) {
+                                               sp = i;
+                                               break;
+                                       }
+                               }*/
+
+                               return {
+                                       start : -1,
+                                       end : -1,
+                                       index : sp,
+                                       scrollX : sx,
+                                       scrollY : sy
+                               };
+                       }
+
+                       // Caret or selection
+                       if (s.anchorNode == s.focusNode && s.anchorOffset == s.focusOffset) {
+                               e = this._getPosText(b, s.anchorNode, s.focusNode);
+
+                               if (!e)
+                                       return {scrollX : sx, scrollY : sy};
+
+                               return {
+                                       start : e.start + s.anchorOffset,
+                                       end : e.end + s.focusOffset,
+                                       scrollX : sx,
+                                       scrollY : sy
+                               };
+                       } else {
+                               e = this._getPosText(b, rng.startContainer, rng.endContainer);
+
+                               if (!e)
+                                       return {scrollX : sx, scrollY : sy};
+
+                               return {
+                                       start : e.start + rng.startOffset,
+                                       end : e.end + rng.endOffset,
+                                       scrollX : sx,
+                                       scrollY : sy
+                               };
+                       }
+               }
+
+               return null;
+       },
+
+       moveToBookmark : function(bookmark) {
+               var inst = this.instance, rng, nl, i, ex, b = inst.getBody(), sd;
+               var doc = inst.getDoc(), win = inst.getWin(), sel = this.getSel();
+
+               if (!bookmark)
+                       return false;
+
+               if (tinyMCE.isSafari && bookmark.rng) {
+                       sel.setBaseAndExtent(bookmark.rng.startContainer, bookmark.rng.startOffset, bookmark.rng.endContainer, bookmark.rng.endOffset);
+                       return true;
+               }
+
+               if (tinyMCE.isRealIE) {
+                       if (bookmark.rng) {
+                               try {
+                                       bookmark.rng.select();
+                               } catch (ex) {
+                                       // Ignore
+                               }
+
+                               return true;
+                       }
+
+                       win.focus();
+
+                       if (bookmark.tag) {
+                               rng = b.createControlRange();
+
+                               nl = b.getElementsByTagName(bookmark.tag);
+
+                               if (nl.length > bookmark.index) {
+                                       try {
+                                               rng.addElement(nl[bookmark.index]);
+                                       } catch (ex) {
+                                               // Might be thrown if the node no longer exists
+                                       }
+                               }
+                       } else {
+                               // Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs
+                               try {
+                                       // Incorrect bookmark
+                                       if (bookmark.start < 0)
+                                               return true;
+
+                                       rng = inst.getSel().createRange();
+                                       rng.moveToElementText(inst.getBody());
+                                       rng.collapse(true);
+                                       rng.moveStart('character', bookmark.start);
+                                       rng.moveEnd('character', bookmark.length);
+                               } catch (ex) {
+                                       return true;
+                               }
+                       }
+
+                       rng.select();
+
+                       win.scrollTo(bookmark.scrollX, bookmark.scrollY);
+                       return true;
+               }
+
+               if (tinyMCE.isGecko || tinyMCE.isOpera) {
+                       if (!sel)
+                               return false;
+
+                       if (bookmark.rng) {
+                               sel.removeAllRanges();
+                               sel.addRange(bookmark.rng);
+                       }
+
+                       if (bookmark.start != -1 && bookmark.end != -1) {
+                               try {
+                                       sd = this._getTextPos(b, bookmark.start, bookmark.end);
+                                       rng = doc.createRange();
+                                       rng.setStart(sd.startNode, sd.startOffset);
+                                       rng.setEnd(sd.endNode, sd.endOffset);
+                                       sel.removeAllRanges();
+                                       sel.addRange(rng);
+
+                                       if (!tinyMCE.isOpera)
+                                               win.focus();
+                               } catch (ex) {
+                                       // Ignore
+                               }
+                       }
+
+                       /*
+                       if (typeof(bookmark.index) != 'undefined') {
+                               tinyMCE.selectElements(b, 'IMG', function (n) {
+                                       if (bookmark.index-- == 0) {
+                                               // Select image in Gecko here
+                                       }
+
+                                       return false;
+                               });
+                       }
+                       */
+
+                       win.scrollTo(bookmark.scrollX, bookmark.scrollY);
+                       return true;
+               }
+
+               return false;
+       },
+
+       _getPosText : function(r, sn, en) {
+               var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};
+
+               while ((n = w.nextNode()) != null) {
+                       if (n == sn)
+                               d.start = p;
+
+                       if (n == en) {
+                               d.end = p;
+                               return d;
+                       }
+
+                       p += n.nodeValue ? n.nodeValue.length : 0;
+               }
+
+               return null;
+       },
+
+       _getTextPos : function(r, sp, ep) {
+               var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};
+
+               while ((n = w.nextNode()) != null) {
+                       p += n.nodeValue ? n.nodeValue.length : 0;
+
+                       if (p >= sp && !d.startNode) {
+                               d.startNode = n;
+                               d.startOffset = sp - (p - n.nodeValue.length);
+                       }
+
+                       if (p >= ep) {
+                               d.endNode = n;
+                               d.endOffset = ep - (p - n.nodeValue.length);
+
+                               return d;
+                       }
+               }
+
+               return null;
+       },
+
+       selectNode : function(node, collapse, select_text_node, to_start) {
+               var inst = this.instance, sel, rng, nodes;
+
+               if (!node)
+                       return;
+
+               if (typeof(collapse) == "undefined")
+                       collapse = true;
+
+               if (typeof(select_text_node) == "undefined")
+                       select_text_node = false;
+
+               if (typeof(to_start) == "undefined")
+                       to_start = true;
+
+               if (inst.settings.auto_resize)
+                       inst.resizeToContent();
+
+               if (tinyMCE.isRealIE) {
+                       rng = inst.getDoc().body.createTextRange();
+
+                       try {
+                               rng.moveToElementText(node);
+
+                               if (collapse)
+                                       rng.collapse(to_start);
+
+                               rng.select();
+                       } catch (e) {
+                               // Throws illigal agrument in MSIE some times
+                       }
+               } else {
+                       sel = this.getSel();
+
+                       if (!sel)
+                               return;
+
+                       if (tinyMCE.isSafari) {
+                               sel.setBaseAndExtent(node, 0, node, node.innerText.length);
+
+                               if (collapse) {
+                                       if (to_start)
+                                               sel.collapseToStart();
+                                       else
+                                               sel.collapseToEnd();
+                               }
+
+                               this.scrollToNode(node);
+
+                               return;
+                       }
+
+                       rng = inst.getDoc().createRange();
+
+                       if (select_text_node) {
+                               // Find first textnode in tree
+                               nodes = tinyMCE.getNodeTree(node, [], 3);
+                               if (nodes.length > 0)
+                                       rng.selectNodeContents(nodes[0]);
+                               else
+                                       rng.selectNodeContents(node);
+                       } else
+                               rng.selectNode(node);
+
+                       if (collapse) {
+                               // Special treatment of textnode collapse
+                               if (!to_start && node.nodeType == 3) {
+                                       rng.setStart(node, node.nodeValue.length);
+                                       rng.setEnd(node, node.nodeValue.length);
+                               } else
+                                       rng.collapse(to_start);
+                       }
+
+                       sel.removeAllRanges();
+                       sel.addRange(rng);
+               }
+
+               this.scrollToNode(node);
+
+               // Set selected element
+               tinyMCE.selectedElement = null;
+               if (node.nodeType == 1)
+                       tinyMCE.selectedElement = node;
+       },
+
+       scrollToNode : function(node) {
+               var inst = this.instance, w = inst.getWin(), vp = inst.getViewPort(), pos = tinyMCE.getAbsPosition(node), cvp, p, cwin;
+
+               // Only scroll if out of visible area
+               if (pos.absLeft < vp.left || pos.absLeft > vp.left + vp.width || pos.absTop < vp.top || pos.absTop > vp.top + (vp.height-25))
+                       w.scrollTo(pos.absLeft, pos.absTop - vp.height + 25);
+
+               // Scroll container window
+               if (inst.settings.auto_resize) {
+                       cwin = inst.getContainerWin();
+                       cvp = tinyMCE.getViewPort(cwin);
+                       p = this.getAbsPosition(node);
+
+                       if (p.absLeft < cvp.left || p.absLeft > cvp.left + cvp.width || p.absTop < cvp.top || p.absTop > cvp.top + cvp.height)
+                               cwin.scrollTo(p.absLeft, p.absTop - cvp.height + 25);
+               }
+       },
+
+       getAbsPosition : function(n) {
+               var pos = tinyMCE.getAbsPosition(n), ipos = tinyMCE.getAbsPosition(this.instance.iframeElement);
+
+               return {
+                       absLeft : ipos.absLeft + pos.absLeft,
+                       absTop : ipos.absTop + pos.absTop
+               };
+       },
+
+       getSel : function() {
+               var inst = this.instance;
+
+               if (tinyMCE.isRealIE)
+                       return inst.getDoc().selection;
+
+               return inst.contentWindow.getSelection();
+       },
+
+       getRng : function() {
+               var s = this.getSel();
+
+               if (s == null)
+                       return null;
+
+               if (tinyMCE.isRealIE)
+                       return s.createRange();
+
+               if (tinyMCE.isSafari && !s.getRangeAt)
+                       return '' + window.getSelection();
+
+               if (s.rangeCount > 0)
+                       return s.getRangeAt(0);
+
+               return null;
+       },
+
+       isCollapsed : function() {
+               var r = this.getRng();
+
+               if (r.item)
+                       return false;
+
+               return r.boundingWidth == 0 || this.getSel().isCollapsed;
+       },
+
+       collapse : function(b) {
+               var r = this.getRng(), s = this.getSel();
+
+               if (r.select) {
+                       r.collapse(b);
+                       r.select();
+               } else {
+                       if (b)
+                               s.collapseToStart();
+                       else
+                               s.collapseToEnd();
+               }
+       },
+
+       getFocusElement : function() {
+               var inst = this.instance, doc, rng, sel, elm;
+
+               if (tinyMCE.isRealIE) {
+                       doc = inst.getDoc();
+                       rng = doc.selection.createRange();
+
+       //              if (rng.collapse)
+       //                      rng.collapse(true);
+
+                       elm = rng.item ? rng.item(0) : rng.parentElement();
+               } else {
+                       if (!tinyMCE.isSafari && inst.isHidden())
+                               return inst.getBody();
+
+                       sel = this.getSel();
+                       rng = this.getRng();
+
+                       if (!sel || !rng)
+                               return null;
+
+                       elm = rng.commonAncestorContainer;
+                       //elm = (sel && sel.anchorNode) ? sel.anchorNode : null;
+
+                       // Handle selection a image or other control like element such as anchors
+                       if (!rng.collapsed) {
+                               // Is selection small
+                               if (rng.startContainer == rng.endContainer) {
+                                       if (rng.startOffset - rng.endOffset < 2) {
+                                               if (rng.startContainer.hasChildNodes())
+                                                       elm = rng.startContainer.childNodes[rng.startOffset];
+                                       }
+                               }
+                       }
+
+                       // Get the element parent of the node
+                       elm = tinyMCE.getParentElement(elm);
+
+                       //if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")
+                       //      elm = tinyMCE.selectedElement;
+               }
+
+               return elm;
+       }
+
+       };
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_UndoRedo.class.js */
+
+function TinyMCE_UndoRedo(inst) {
+       this.instance = inst;
+       this.undoLevels = [];
+       this.undoIndex = 0;
+       this.typingUndoIndex = -1;
+       this.undoRedo = true;
+};
+
+TinyMCE_UndoRedo.prototype = {
+       add : function(l) {
+               var b, customUndoLevels, newHTML, inst = this.instance, i, ul, ur;
+
+               if (l) {
+                       this.undoLevels[this.undoLevels.length] = l;
+                       return true;
+               }
+
+               if (this.typingUndoIndex != -1) {
+                       this.undoIndex = this.typingUndoIndex;
+
+                       if (tinyMCE.typingUndoIndex != -1)
+                               tinyMCE.undoIndex = tinyMCE.typingUndoIndex;
+               }
+
+               newHTML = tinyMCE.trim(inst.getBody().innerHTML);
+               if (this.undoLevels[this.undoIndex] && newHTML != this.undoLevels[this.undoIndex].content) {
+                       //tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex].content);
+
+                       // Is dirty again
+                       inst.isNotDirty = false;
+
+                       tinyMCE.dispatchCallback(inst, 'onchange_callback', 'onChange', inst);
+
+                       // Time to compress
+                       customUndoLevels = tinyMCE.settings.custom_undo_redo_levels;
+                       if (customUndoLevels != -1 && this.undoLevels.length > customUndoLevels) {
+                               for (i=0; i<this.undoLevels.length-1; i++)
+                                       this.undoLevels[i] = this.undoLevels[i+1];
+
+                               this.undoLevels.length--;
+                               this.undoIndex--;
+
+                               // Todo: Implement global undo/redo logic here
+                       }
+
+                       b = inst.undoBookmark;
+
+                       if (!b)
+                               b = inst.selection.getBookmark();
+
+                       this.undoIndex++;
+                       this.undoLevels[this.undoIndex] = {
+                               content : newHTML,
+                               bookmark : b
+                       };
+
+                       // Remove all above from global undo/redo
+                       ul = tinyMCE.undoLevels;
+                       for (i=tinyMCE.undoIndex + 1; i<ul.length; i++) {
+                               ur = ul[i].undoRedo;
+
+                               if (ur.undoIndex == ur.undoLevels.length -1)
+                                       ur.undoIndex--;
+
+                               ur.undoLevels.length--;
+                       }
+
+                       // Add global undo level
+                       tinyMCE.undoLevels[tinyMCE.undoIndex++] = inst;
+                       tinyMCE.undoLevels.length = tinyMCE.undoIndex;
+
+                       this.undoLevels.length = this.undoIndex + 1;
+
+                       return true;
+               }
+
+               return false;
+       },
+
+       undo : function() {
+               var inst = this.instance;
+
+               // Do undo
+               if (this.undoIndex > 0) {
+                       this.undoIndex--;
+
+                       tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content);
+                       inst.repaint();
+
+                       if (inst.settings.custom_undo_redo_restore_selection)
+                               inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);
+               }
+       },
+
+       redo : function() {
+               var inst = this.instance;
+
+               tinyMCE.execCommand("mceEndTyping");
+
+               if (this.undoIndex < (this.undoLevels.length-1)) {
+                       this.undoIndex++;
+
+                       tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content);
+                       inst.repaint();
+
+                       if (inst.settings.custom_undo_redo_restore_selection)
+                               inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);
+               }
+
+               tinyMCE.triggerNodeChange();
+       }
+
+       };
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_ForceParagraphs.class.js */
+
+var TinyMCE_ForceParagraphs = {
+       _insertPara : function(inst, e) {
+               var doc = inst.getDoc(), sel = inst.getSel(), body = inst.getBody(), win = inst.contentWindow, rng = sel.getRangeAt(0);
+               var rootElm = doc.documentElement, blockName = "P", startNode, endNode, startBlock, endBlock;
+               var rngBefore, rngAfter, direct, startNode, startOffset, endNode, endOffset, b = tinyMCE.isOpera ? inst.selection.getBookmark() : null;
+               var paraBefore, paraAfter, startChop, endChop, contents, i;
+
+               function isEmpty(para) {
+                       var nodes;
+
+                       function isEmptyHTML(html) {
+                               return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == '';
+                       }
+
+                       // Check for images
+                       if (para.getElementsByTagName("img").length > 0)
+                               return false;
+
+                       // Check for tables
+                       if (para.getElementsByTagName("table").length > 0)
+                               return false;
+
+                       // Check for HRs
+                       if (para.getElementsByTagName("hr").length > 0)
+                               return false;
+
+                       // Check all textnodes
+                       nodes = tinyMCE.getNodeTree(para, [], 3);
+                       for (i=0; i<nodes.length; i++) {
+                               if (!isEmptyHTML(nodes[i].nodeValue))
+                                       return false;
+                       }
+
+                       // No images, no tables, no hrs, no text content then it's empty
+                       return true;
+               }
+
+       //      tinyMCE.debug(body.innerHTML);
+
+       //      debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());
+
+               // Setup before range
+               rngBefore = doc.createRange();
+               rngBefore.setStart(sel.anchorNode, sel.anchorOffset);
+               rngBefore.collapse(true);
+
+               // Setup after range
+               rngAfter = doc.createRange();
+               rngAfter.setStart(sel.focusNode, sel.focusOffset);
+               rngAfter.collapse(true);
+
+               // Setup start/end points
+               direct = rngBefore.compareBoundaryPoints(rngBefore.START_TO_END, rngAfter) < 0;
+               startNode = direct ? sel.anchorNode : sel.focusNode;
+               startOffset = direct ? sel.anchorOffset : sel.focusOffset;
+               endNode = direct ? sel.focusNode : sel.anchorNode;
+               endOffset = direct ? sel.focusOffset : sel.anchorOffset;
+
+               startNode = startNode.nodeName == "HTML" ? doc.body : startNode; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes
+               startNode = startNode.nodeName == "BODY" ? startNode.firstChild : startNode;
+               endNode = endNode.nodeName == "BODY" ? endNode.firstChild : endNode;
+
+               // Get block elements
+               startBlock = inst.getParentBlockElement(startNode);
+               endBlock = inst.getParentBlockElement(endNode);
+
+               // If absolute force paragraph generation within
+               if (startBlock && (startBlock.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(startBlock.style.position)))
+                       startBlock = null;
+
+               if (endBlock && (endBlock.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(endBlock.style.position)))
+                       endBlock = null;
+
+               // Use current block name
+               if (startBlock != null) {
+                       blockName = startBlock.nodeName;
+
+                       // Use P instead
+                       if (/(TD|TABLE|TH|CAPTION)/.test(blockName) || (blockName == "DIV" && /left|right/gi.test(startBlock.style.cssFloat)))
+                               blockName = "P";
+               }
+
+               // Within a list use normal behaviour
+               if (tinyMCE.getParentElement(startBlock, "OL,UL", null, body) != null)
+                       return false;
+
+               // Within a table create new paragraphs
+               if ((startBlock != null && startBlock.nodeName == "TABLE") || (endBlock != null && endBlock.nodeName == "TABLE"))
+                       startBlock = endBlock = null;
+
+               // Setup new paragraphs
+               paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);
+               paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);
+
+               // Is header, then force paragraph under
+               if (/^(H[1-6])$/.test(blockName))
+                       paraAfter = doc.createElement("p");
+
+               // Setup chop nodes
+               startChop = startNode;
+               endChop = endNode;
+
+               // Get startChop node
+               node = startChop;
+               do {
+                       if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
+                               break;
+
+                       startChop = node;
+               } while ((node = node.previousSibling ? node.previousSibling : node.parentNode));
+
+               // Get endChop node
+               node = endChop;
+               do {
+                       if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))
+                               break;
+
+                       endChop = node;
+               } while ((node = node.nextSibling ? node.nextSibling : node.parentNode));
+
+               // Fix when only a image is within the TD
+               if (startChop.nodeName == "TD")
+                       startChop = startChop.firstChild;
+
+               if (endChop.nodeName == "TD")
+                       endChop = endChop.lastChild;
+
+               // If not in a block element
+               if (startBlock == null) {
+                       // Delete selection
+                       rng.deleteContents();
+
+                       if (!tinyMCE.isSafari)
+                               sel.removeAllRanges();
+
+                       if (startChop != rootElm && endChop != rootElm) {
+                               // Insert paragraph before
+                               rngBefore = rng.cloneRange();
+
+                               if (startChop == body)
+                                       rngBefore.setStart(startChop, 0);
+                               else
+                                       rngBefore.setStartBefore(startChop);
+
+                               paraBefore.appendChild(rngBefore.cloneContents());
+
+                               // Insert paragraph after
+                               if (endChop.parentNode.nodeName == blockName)
+                                       endChop = endChop.parentNode;
+
+                               // If not after image
+                               //if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")
+                                       rng.setEndAfter(endChop);
+
+                               if (endChop.nodeName != "#text" && endChop.nodeName != "BODY")
+                                       rngBefore.setEndAfter(endChop);
+
+                               contents = rng.cloneContents();
+                               if (contents.firstChild && (contents.firstChild.nodeName == blockName || contents.firstChild.nodeName == "BODY"))
+                                       paraAfter.innerHTML = contents.firstChild.innerHTML;
+                               else
+                                       paraAfter.appendChild(contents);
+
+                               // Check if it's a empty paragraph
+                               if (isEmpty(paraBefore))
+                                       paraBefore.innerHTML = "&nbsp;";
+
+                               // Check if it's a empty paragraph
+                               if (isEmpty(paraAfter))
+                                       paraAfter.innerHTML = "&nbsp;";
+
+                               // Delete old contents
+                               rng.deleteContents();
+                               rngAfter.deleteContents();
+                               rngBefore.deleteContents();
+
+                               // Insert new paragraphs
+                               if (tinyMCE.isOpera) {
+                                       paraBefore.normalize();
+                                       rngBefore.insertNode(paraBefore);
+                                       paraAfter.normalize();
+                                       rngBefore.insertNode(paraAfter);
+                               } else {
+                                       paraAfter.normalize();
+                                       rngBefore.insertNode(paraAfter);
+                                       paraBefore.normalize();
+                                       rngBefore.insertNode(paraBefore);
+                               }
+
+                               //tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);
+                       } else {
+                               body.innerHTML = "<" + blockName + ">&nbsp;</" + blockName + "><" + blockName + ">&nbsp;</" + blockName + ">";
+                               paraAfter = body.childNodes[1];
+                       }
+
+                       inst.selection.moveToBookmark(b);
+                       inst.selection.selectNode(paraAfter, true, true);
+
+                       return true;
+               }
+
+               // Place first part within new paragraph
+               if (startChop.nodeName == blockName)
+                       rngBefore.setStart(startChop, 0);
+               else
+                       rngBefore.setStartBefore(startChop);
+
+               rngBefore.setEnd(startNode, startOffset);
+               paraBefore.appendChild(rngBefore.cloneContents());
+
+               // Place secound part within new paragraph
+               rngAfter.setEndAfter(endChop);
+               rngAfter.setStart(endNode, endOffset);
+               contents = rngAfter.cloneContents();
+
+               if (contents.firstChild && contents.firstChild.nodeName == blockName) {
+       /*              var nodes = contents.firstChild.childNodes;
+                       for (i=0; i<nodes.length; i++) {
+                               //tinyMCE.debug(nodes[i].nodeName);
+                               if (nodes[i].nodeName != "BODY")
+                                       paraAfter.appendChild(nodes[i]);
+                       }
+       */
+                       paraAfter.innerHTML = contents.firstChild.innerHTML;
+               } else
+                       paraAfter.appendChild(contents);
+
+               // Check if it's a empty paragraph
+               if (isEmpty(paraBefore))
+                       paraBefore.innerHTML = "&nbsp;";
+
+               // Check if it's a empty paragraph
+               if (isEmpty(paraAfter))
+                       paraAfter.innerHTML = "&nbsp;";
+
+               // Create a range around everything
+               rng = doc.createRange();
+
+               if (!startChop.previousSibling && startChop.parentNode.nodeName.toUpperCase() == blockName) {
+                       rng.setStartBefore(startChop.parentNode);
+               } else {
+                       if (rngBefore.startContainer.nodeName.toUpperCase() == blockName && rngBefore.startOffset == 0)
+                               rng.setStartBefore(rngBefore.startContainer);
+                       else
+                               rng.setStart(rngBefore.startContainer, rngBefore.startOffset);
+               }
+
+               if (!endChop.nextSibling && endChop.parentNode.nodeName.toUpperCase() == blockName)
+                       rng.setEndAfter(endChop.parentNode);
+               else
+                       rng.setEnd(rngAfter.endContainer, rngAfter.endOffset);
+
+               // Delete all contents and insert new paragraphs
+               rng.deleteContents();
+
+               if (tinyMCE.isOpera) {
+                       rng.insertNode(paraBefore);
+                       rng.insertNode(paraAfter);
+               } else {
+                       rng.insertNode(paraAfter);
+                       rng.insertNode(paraBefore);
+               }
+
+               //tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);
+
+               // Normalize
+               paraAfter.normalize();
+               paraBefore.normalize();
+
+               inst.selection.moveToBookmark(b);
+               inst.selection.selectNode(paraAfter, true, true);
+
+               return true;
+       },
+
+       _handleBackSpace : function(inst) {
+               var r = inst.getRng(), sn = r.startContainer, nv, s = false;
+
+               // Added body check for bug #1527787
+               if (sn && sn.nextSibling && sn.nextSibling.nodeName == "BR" && sn.parentNode.nodeName != "BODY") {
+                       nv = sn.nodeValue;
+
+                       // Handle if a backspace is pressed after a space character #bug 1466054 removed since fix for #1527787
+                       /*if (nv != null && nv.length >= r.startOffset && nv.charAt(r.startOffset - 1) == ' ')
+                               s = true;*/
+
+                       // Only remove BRs if we are at the end of line #bug 1464152
+                       if (nv != null && r.startOffset == nv.length)
+                               sn.nextSibling.parentNode.removeChild(sn.nextSibling);
+               }
+
+               if (inst.settings.auto_resize)
+                       inst.resizeToContent();
+
+               return s;
+       }
+
+       };
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Layer.class.js */
+
+function TinyMCE_Layer(id, bm) {
+       this.id = id;
+       this.blockerElement = null;
+       this.events = false;
+       this.element = null;
+       this.blockMode = typeof(bm) != 'undefined' ? bm : true;
+       this.doc = document;
+};
+
+TinyMCE_Layer.prototype = {
+       moveRelativeTo : function(re, p) {
+               var rep = this.getAbsPosition(re), e = this.getElement(), x, y;
+               var w = parseInt(re.offsetWidth), h = parseInt(re.offsetHeight);
+               var ew = parseInt(e.offsetWidth), eh = parseInt(e.offsetHeight);
+
+               switch (p) {
+                       case "tl":
+                               x = rep.absLeft;
+                               y = rep.absTop;
+                               break;
+
+                       case "tr":
+                               x = rep.absLeft + w;
+                               y = rep.absTop;
+                               break;
+
+                       case "bl":
+                               x = rep.absLeft;
+                               y = rep.absTop + h;
+                               break;
+
+                       case "br":
+                               x = rep.absLeft + w;
+                               y = rep.absTop + h;
+                               break;
+
+                       case "cc":
+                               x = rep.absLeft + (w / 2) - (ew / 2);
+                               y = rep.absTop + (h / 2) - (eh / 2);
+                               break;
+               }
+
+               this.moveTo(x, y);
+       },
+
+       moveBy : function(x, y) {
+               var e = this.getElement();
+               this.moveTo(parseInt(e.style.left) + x, parseInt(e.style.top) + y);
+       },
+
+       moveTo : function(x, y) {
+               var e = this.getElement();
+
+               e.style.left = x + "px";
+               e.style.top = y + "px";
+
+               this.updateBlocker();
+       },
+
+       resizeBy : function(w, h) {
+               var e = this.getElement();
+               this.resizeTo(parseInt(e.style.width) + w, parseInt(e.style.height) + h);
+       },
+
+       resizeTo : function(w, h) {
+               var e = this.getElement();
+
+               if (w != null)
+                       e.style.width = w + "px";
+
+               if (h != null)
+                       e.style.height = h + "px";
+
+               this.updateBlocker();
+       },
+
+       show : function() {
+               var el = this.getElement();
+
+               if (el) {
+                       el.style.display = 'block';
+                       this.updateBlocker();
+               }
+       },
+
+       hide : function() {
+               var el = this.getElement();
+
+               if (el) {
+                       el.style.display = 'none';
+                       this.updateBlocker();
+               }
+       },
+
+       isVisible : function() {
+               return this.getElement().style.display == 'block';
+       },
+
+       getElement : function() {
+               if (!this.element)
+                       this.element = this.doc.getElementById(this.id);
+
+               return this.element;
+       },
+
+       setBlockMode : function(s) {
+               this.blockMode = s;
+       },
+
+       updateBlocker : function() {
+               var e, b, x, y, w, h;
+
+               b = this.getBlocker();
+               if (b) {
+                       if (this.blockMode) {
+                               e = this.getElement();
+                               x = this.parseInt(e.style.left);
+                               y = this.parseInt(e.style.top);
+                               w = this.parseInt(e.offsetWidth);
+                               h = this.parseInt(e.offsetHeight);
+
+                               b.style.left = x + 'px';
+                               b.style.top = y + 'px';
+                               b.style.width = w + 'px';
+                               b.style.height = h + 'px';
+                               b.style.display = e.style.display;
+                       } else
+                               b.style.display = 'none';
+               }
+       },
+
+       getBlocker : function() {
+               var d, b;
+
+               if (!this.blockerElement && this.blockMode) {
+                       d = this.doc;
+                       b = d.getElementById(this.id + "_blocker");
+
+                       if (!b) {
+                               b = d.createElement("iframe");
+
+                               b.setAttribute('id', this.id + "_blocker");
+                               b.style.cssText = 'display: none; position: absolute; left: 0; top: 0';
+                               b.src = 'javascript:false;';
+                               b.frameBorder = '0';
+                               b.scrolling = 'no';
+       
+                               d.body.appendChild(b);
+                       }
+
+                       this.blockerElement = b;
+               }
+
+               return this.blockerElement;
+       },
+
+       getAbsPosition : function(n) {
+               var p = {absLeft : 0, absTop : 0};
+
+               while (n) {
+                       p.absLeft += n.offsetLeft;
+                       p.absTop += n.offsetTop;
+                       n = n.offsetParent;
+               }
+
+               return p;
+       },
+
+       create : function(n, c, p, h) {
+               var d = this.doc, e = d.createElement(n);
+
+               e.setAttribute('id', this.id);
+
+               if (c)
+                       e.className = c;
+
+               if (!p)
+                       p = d.body;
+
+               if (h)
+                       e.innerHTML = h;
+
+               p.appendChild(e);
+
+               return this.element = e;
+       },
+
+       exists : function() {
+               return this.doc.getElementById(this.id) != null;
+       },
+
+       parseInt : function(s) {
+               if (s == null || s == '')
+                       return 0;
+
+               return parseInt(s);
+       },
+
+       remove : function() {
+               var e = this.getElement(), b = this.getBlocker();
+
+               if (e)
+                       e.parentNode.removeChild(e);
+
+               if (b)
+                       b.parentNode.removeChild(b);
+       }
+
+       };
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Menu.class.js */
+
+function TinyMCE_Menu() {
+       var id;
+
+       if (typeof(tinyMCE.menuCounter) == "undefined")
+               tinyMCE.menuCounter = 0;
+
+       id = "mc_menu_" + tinyMCE.menuCounter++;
+
+       TinyMCE_Layer.call(this, id, true);
+
+       this.id = id;
+       this.items = [];
+       this.needsUpdate = true;
+};
+
+TinyMCE_Menu.prototype = tinyMCE.extend(TinyMCE_Layer.prototype, {
+       init : function(s) {
+               var n;
+
+               // Default params
+               this.settings = {
+                       separator_class : 'mceMenuSeparator',
+                       title_class : 'mceMenuTitle',
+                       disabled_class : 'mceMenuDisabled',
+                       menu_class : 'mceMenu',
+                       drop_menu : true
+               };
+
+               for (n in s)
+                       this.settings[n] = s[n];
+
+               this.create('div', this.settings.menu_class);
+       },
+
+       clear : function() {
+               this.items = [];
+       },
+
+       addTitle : function(t) {
+               this.add({type : 'title', text : t});
+       },
+
+       addDisabled : function(t) {
+               this.add({type : 'disabled', text : t});
+       },
+
+       addSeparator : function() {
+               this.add({type : 'separator'});
+       },
+
+       addItem : function(t, js) {
+               this.add({text : t, js : js});
+       },
+
+       add : function(mi) {
+               this.items[this.items.length] = mi;
+               this.needsUpdate = true;
+       },
+
+       update : function() {
+               var e = this.getElement(), h = '', i, t, m = this.items, s = this.settings;
+
+               if (this.settings.drop_menu)
+                       h += '<span class="mceMenuLine"></span>';
+
+               h += '<table border="0" cellpadding="0" cellspacing="0">';
+
+               for (i=0; i<m.length; i++) {
+                       t = tinyMCE.xmlEncode(m[i].text);
+                       c = m[i].class_name ? ' class="' + m[i].class_name + '"' : '';
+
+                       switch (m[i].type) {
+                               case 'separator':
+                                       h += '<tr class="' + s.separator_class + '"><td>';
+                                       break;
+
+                               case 'title':
+                                       h += '<tr class="' + s.title_class + '"><td><span' + c +'>' + t + '</span>';
+                                       break;
+
+                               case 'disabled':
+                                       h += '<tr class="' + s.disabled_class + '"><td><span' + c +'>' + t + '</span>';
+                                       break;
+
+                               default:
+                                       h += '<tr><td><a href="' + tinyMCE.xmlEncode(m[i].js) + '" onmousedown="' + tinyMCE.xmlEncode(m[i].js) + ';return tinyMCE.cancelEvent(event);" onclick="return tinyMCE.cancelEvent(event);" onmouseup="return tinyMCE.cancelEvent(event);"><span' + c +'>' + t + '</span></a>';
+                       }
+
+                       h += '</td></tr>';
+               }
+
+               h += '</table>';
+
+               e.innerHTML = h;
+
+               this.needsUpdate = false;
+               this.updateBlocker();
+       },
+
+       show : function() {
+               var nl, i;
+
+               if (tinyMCE.lastMenu == this)
+                       return;
+
+               if (this.needsUpdate)
+                       this.update();
+
+               if (tinyMCE.lastMenu && tinyMCE.lastMenu != this)
+                       tinyMCE.lastMenu.hide();
+
+               TinyMCE_Layer.prototype.show.call(this);
+
+               if (!tinyMCE.isOpera) {
+                       // Accessibility stuff
+/*                     nl = this.getElement().getElementsByTagName("a");
+                       if (nl.length > 0)
+                               nl[0].focus();*/
+               }
+
+               tinyMCE.lastMenu = this;
+       }
+
+       });
+
+/* file:jscripts/tiny_mce/classes/TinyMCE_Debug.class.js */
+
+tinyMCE.add(TinyMCE_Engine, {
+       debug : function() {
+               var m = "", a, i, l = tinyMCE.log.length;
+
+               for (i=0, a = this.debug.arguments; i<a.length; i++) {
+                       m += a[i];
+
+                       if (i<a.length-1)
+                               m += ', ';
+               }
+
+               if (l < 1000)
+                       tinyMCE.log[l] = "[debug] " + m;
+       }
+
+       });
+
index e72336541ebe28cc8e8196e8d9a6390d88b358b8..add2aa5a1a185e82ea58cd000b3b5d782fa83e07 100644 (file)
@@ -1,61 +1,61 @@
-/**\r
- * $Id: editable_selects.js 162 2007-01-03 16:16:52Z spocke $\r
- *\r
- * Makes select boxes editable.\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-var TinyMCE_EditableSelects = {\r
-       editSelectElm : null,\r
-\r
-       init : function() {\r
-               var nl = document.getElementsByTagName("select"), i, d = document, o;\r
-\r
-               for (i=0; i<nl.length; i++) {\r
-                       if (nl[i].className.indexOf('mceEditableSelect') != -1) {\r
-                               o = new Option('(value)', '__mce_add_custom__');\r
-\r
-                               o.className = 'mceAddSelectValue';\r
-\r
-                               nl[i].options[nl[i].options.length] = o;\r
-                               nl[i].setAttribute('onchange', 'TinyMCE_EditableSelects.onChangeEditableSelect(this);');\r
-                       }\r
-               }\r
-       },\r
-\r
-       onChangeEditableSelect : function(se) {\r
-               var d = document, ne;\r
-\r
-               if (se.options[se.selectedIndex].value == '__mce_add_custom__') {\r
-                       ne = d.createElement("input");\r
-                       ne.id = se.id + "_custom";\r
-                       ne.name = se.name + "_custom";\r
-                       ne.type = "text";\r
-\r
-                       ne.style.width = se.clientWidth;\r
-                       se.parentNode.insertBefore(ne, se);\r
-                       se.style.display = 'none';\r
-                       ne.focus();\r
-                       ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput;\r
-                       TinyMCE_EditableSelects.editSelectElm = se;\r
-               }\r
-       },\r
-\r
-       onBlurEditableSelectInput : function() {\r
-               var se = TinyMCE_EditableSelects.editSelectElm;\r
-\r
-               if (se) {\r
-                       if (se.previousSibling.value != '') {\r
-                               addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value);\r
-                               selectByValue(document.forms[0], se.id, se.previousSibling.value);\r
-                       } else\r
-                               selectByValue(document.forms[0], se.id, '');\r
-\r
-                       se.style.display = 'inline';\r
-                       se.parentNode.removeChild(se.previousSibling);\r
-                       TinyMCE_EditableSelects.editSelectElm = null;\r
-               }\r
-       }\r
-};\r
+/**
+ * $Id: editable_selects.js 162 2007-01-03 16:16:52Z spocke $
+ *
+ * Makes select boxes editable.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2007, 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;
+               }
+       }
+};
index ec9dbb3b6d284a93ec70f261679dd184ba1997c5..110a720e03db872580cda078400ee30218215f6c 100644 (file)
-/**\r
- * $Id: form_utils.js 162 2007-01-03 16:16:52Z spocke $\r
- *\r
- * Various form utilitiy functions.\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-var themeBaseURL = tinyMCE.baseURL + '/themes/' + tinyMCE.getParam("theme");\r
-\r
-function getColorPickerHTML(id, target_form_element) {\r
-       var h = "";\r
-\r
-       h += '<a id="' + id + '_link" href="javascript:void(0);" onkeydown="pickColor(event,\'' + target_form_element +'\');" onmousedown="pickColor(event,\'' + target_form_element +'\');return false;">';\r
-       h += '<img id="' + id + '" src="' + themeBaseURL + '/images/color.gif"';\r
-       h += ' onmouseover="this.className=\'mceButtonOver\'"';\r
-       h += ' onmouseout="this.className=\'mceButtonNormal\'"';\r
-       h += ' onmousedown="this.className=\'mceButtonDown\'"';\r
-       h += ' width="20" height="16" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';\r
-       h += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';\r
-\r
-       return h;\r
-}\r
-\r
-function pickColor(e, target_form_element) {\r
-       if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown")\r
-               tinyMCEPopup.pickColor(e, target_form_element);\r
-}\r
-\r
-function updateColor(img_id, form_element_id) {\r
-       document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;\r
-}\r
-\r
-function setBrowserDisabled(id, state) {\r
-       var img = document.getElementById(id);\r
-       var lnk = document.getElementById(id + "_link");\r
-\r
-       if (lnk) {\r
-               if (state) {\r
-                       lnk.setAttribute("realhref", lnk.getAttribute("href"));\r
-                       lnk.removeAttribute("href");\r
-                       tinyMCE.switchClass(img, 'mceButtonDisabled', true);\r
-               } else {\r
-                       lnk.setAttribute("href", lnk.getAttribute("realhref"));\r
-                       tinyMCE.switchClass(img, 'mceButtonNormal', false);\r
-               }\r
-       }\r
-}\r
-\r
-function getBrowserHTML(id, target_form_element, type, prefix) {\r
-       var option = prefix + "_" + type + "_browser_callback";\r
-       var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));\r
-       if (cb == null)\r
-               return "";\r
-\r
-       var html = "";\r
-\r
-       html += '<a id="' + id + '_link" href="javascript:openBrower(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;">';\r
-       html += '<img id="' + id + '" src="' + themeBaseURL + '/images/browse.gif"';\r
-       html += ' onmouseover="this.className=\'mceButtonOver\';"';\r
-       html += ' onmouseout="this.className=\'mceButtonNormal\';"';\r
-       html += ' onmousedown="this.className=\'mceButtonDown\';"';\r
-       html += ' width="20" height="18" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';\r
-       html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';\r
-\r
-       return html;\r
-}\r
-\r
-function openBrower(img_id, target_form_element, type, option) {\r
-       var img = document.getElementById(img_id);\r
-\r
-       if (img.className != "mceButtonDisabled")\r
-               tinyMCEPopup.openBrowser(target_form_element, type, option);\r
-}\r
-\r
-function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {\r
-       if (!form_obj || !form_obj.elements[field_name])\r
-               return;\r
-\r
-       var sel = form_obj.elements[field_name];\r
-\r
-       var found = false;\r
-       for (var i=0; i<sel.options.length; i++) {\r
-               var option = sel.options[i];\r
-\r
-               if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) {\r
-                       option.selected = true;\r
-                       found = true;\r
-               } else\r
-                       option.selected = false;\r
-       }\r
-\r
-       if (!found && add_custom && value != '') {\r
-               var option = new Option(value, value);\r
-               option.selected = true;\r
-               sel.options[sel.options.length] = option;\r
-               sel.selectedIndex = sel.options.length - 1;\r
-       }\r
-\r
-       return found;\r
-}\r
-\r
-function getSelectValue(form_obj, field_name) {\r
-       var elm = form_obj.elements[field_name];\r
-\r
-       if (elm == null || elm.options == null)\r
-               return "";\r
-\r
-       return elm.options[elm.selectedIndex].value;\r
-}\r
-\r
-function addSelectValue(form_obj, field_name, name, value) {\r
-       var s = form_obj.elements[field_name];\r
-       var o = new Option(name, value);\r
-       s.options[s.options.length] = o;\r
-}\r
-\r
-function addClassesToList(list_id, specific_option) {\r
-       // Setup class droplist\r
-       var styleSelectElm = document.getElementById(list_id);\r
-       var styles = tinyMCE.getParam('theme_advanced_styles', false);\r
-       styles = tinyMCE.getParam(specific_option, styles);\r
-\r
-       if (styles) {\r
-               var stylesAr = styles.split(';');\r
-\r
-               for (var i=0; i<stylesAr.length; i++) {\r
-                       if (stylesAr != "") {\r
-                               var key, value;\r
-\r
-                               key = stylesAr[i].split('=')[0];\r
-                               value = stylesAr[i].split('=')[1];\r
-\r
-                               styleSelectElm.options[styleSelectElm.length] = new Option(key, value);\r
-                       }\r
-               }\r
-       } else {\r
-               // Use auto impored classes\r
-               var csses = tinyMCE.getCSSClasses(tinyMCE.getWindowArg('editor_id'));\r
-               for (var i=0; i<csses.length; i++)\r
-                       styleSelectElm.options[styleSelectElm.length] = new Option(csses[i], csses[i]);\r
-       }\r
-}\r
-\r
-function isVisible(element_id) {\r
-       var elm = document.getElementById(element_id);\r
-\r
-       return elm && elm.style.display != "none";\r
-}\r
-\r
-function convertRGBToHex(col) {\r
-       var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");\r
-\r
-       var rgb = col.replace(re, "$1,$2,$3").split(',');\r
-       if (rgb.length == 3) {\r
-               r = parseInt(rgb[0]).toString(16);\r
-               g = parseInt(rgb[1]).toString(16);\r
-               b = parseInt(rgb[2]).toString(16);\r
-\r
-               r = r.length == 1 ? '0' + r : r;\r
-               g = g.length == 1 ? '0' + g : g;\r
-               b = b.length == 1 ? '0' + b : b;\r
-\r
-               return "#" + r + g + b;\r
-       }\r
-\r
-       return col;\r
-}\r
-\r
-function convertHexToRGB(col) {\r
-       if (col.indexOf('#') != -1) {\r
-               col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');\r
-\r
-               r = parseInt(col.substring(0, 2), 16);\r
-               g = parseInt(col.substring(2, 4), 16);\r
-               b = parseInt(col.substring(4, 6), 16);\r
-\r
-               return "rgb(" + r + "," + g + "," + b + ")";\r
-       }\r
-\r
-       return col;\r
-}\r
-\r
-function trimSize(size) {\r
-       return size.replace(new RegExp('[^0-9%]', 'gi'), '');\r
-}\r
-\r
-function getCSSSize(size) {\r
-       size = trimSize(size);\r
-\r
-       if (size == "")\r
-               return "";\r
-\r
-       return size.indexOf('%') != -1 ? size : size + "px";\r
-}\r
-\r
-function getStyle(elm, attrib, style) {\r
-       var val = tinyMCE.getAttrib(elm, attrib);\r
-\r
-       if (val != '')\r
-               return '' + val;\r
-\r
-       if (typeof(style) == 'undefined')\r
-               style = attrib;\r
-\r
-       val = eval('elm.style.' + style);\r
-\r
-       return val == null ? '' : '' + val;\r
-}\r
+/**
+ * $Id: form_utils.js 162 2007-01-03 16:16:52Z spocke $
+ *
+ * Various form utilitiy functions.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+var themeBaseURL = tinyMCE.baseURL + '/themes/' + tinyMCE.getParam("theme");
+
+function getColorPickerHTML(id, target_form_element) {
+       var h = "";
+
+       h += '<a id="' + id + '_link" href="javascript:void(0);" onkeydown="pickColor(event,\'' + target_form_element +'\');" onmousedown="pickColor(event,\'' + target_form_element +'\');return false;">';
+       h += '<img id="' + id + '" src="' + themeBaseURL + '/images/color.gif"';
+       h += ' onmouseover="this.className=\'mceButtonOver\'"';
+       h += ' onmouseout="this.className=\'mceButtonNormal\'"';
+       h += ' onmousedown="this.className=\'mceButtonDown\'"';
+       h += ' width="20" height="16" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';
+       h += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';
+
+       return h;
+}
+
+function pickColor(e, target_form_element) {
+       if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown")
+               tinyMCEPopup.pickColor(e, target_form_element);
+}
+
+function updateColor(img_id, form_element_id) {
+       document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;
+}
+
+function setBrowserDisabled(id, state) {
+       var img = document.getElementById(id);
+       var lnk = document.getElementById(id + "_link");
+
+       if (lnk) {
+               if (state) {
+                       lnk.setAttribute("realhref", lnk.getAttribute("href"));
+                       lnk.removeAttribute("href");
+                       tinyMCE.switchClass(img, 'mceButtonDisabled', true);
+               } else {
+                       lnk.setAttribute("href", lnk.getAttribute("realhref"));
+                       tinyMCE.switchClass(img, 'mceButtonNormal', false);
+               }
+       }
+}
+
+function getBrowserHTML(id, target_form_element, type, prefix) {
+       var option = prefix + "_" + type + "_browser_callback";
+       var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));
+       if (cb == null)
+               return "";
+
+       var html = "";
+
+       html += '<a id="' + id + '_link" href="javascript:openBrower(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;">';
+       html += '<img id="' + id + '" src="' + themeBaseURL + '/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;
+}
index 1b347f75ca1fa18ac80f7c4ceb6ec47e04c082ef..23982db19728b9b7188331803e1e755fe706abb8 100644 (file)
-/**\r
- * $Id: mclayer.js 162 2007-01-03 16:16:52Z spocke $\r
- *\r
- * Moxiecode floating layer script.\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-function MCLayer(id) {\r
-       this.id = id;\r
-       this.settings = new Array();\r
-       this.blockerElement = null;\r
-       this.isMSIE = navigator.appName == "Microsoft Internet Explorer";\r
-       this.events = false;\r
-       this.autoHideCallback = null;\r
-}\r
-\r
-MCLayer.prototype = {\r
-       moveRelativeTo : function(re, p, a) {\r
-               var rep = this.getAbsPosition(re);\r
-               var w = parseInt(re.offsetWidth);\r
-               var h = parseInt(re.offsetHeight);\r
-               var x, y;\r
-\r
-               switch (p) {\r
-                       case "tl":\r
-                               break;\r
-\r
-                       case "tr":\r
-                               x = rep.absLeft + w;\r
-                               y = rep.absTop;\r
-                               break;\r
-\r
-                       case "bl":\r
-                               break;\r
-\r
-                       case "br":\r
-                               break;\r
-               }\r
-\r
-               this.moveTo(x, y);\r
-       },\r
-\r
-       moveBy : function(dx, dy) {\r
-               var e = this.getElement();\r
-               var x = parseInt(e.style.left);\r
-               var y = parseInt(e.style.top);\r
-\r
-               e.style.left = (x + dx) + "px";\r
-               e.style.top = (y + dy) + "px";\r
-\r
-               this.updateBlocker();\r
-       },\r
-\r
-       moveTo : function(x, y) {\r
-               var e = this.getElement();\r
-\r
-               e.style.left = x + "px";\r
-               e.style.top = y + "px";\r
-\r
-               this.updateBlocker();\r
-       },\r
-\r
-       show : function() {\r
-               MCLayer.visibleLayer = this;\r
-\r
-               this.getElement().style.display = 'block';\r
-               this.updateBlocker();\r
-       },\r
-\r
-       hide : function() {\r
-               this.getElement().style.display = 'none';\r
-               this.updateBlocker();\r
-       },\r
-\r
-       setAutoHide : function(s, cb) {\r
-               this.autoHideCallback = cb;\r
-               this.registerEventHandlers();\r
-       },\r
-\r
-       getElement : function() {\r
-               return document.getElementById(this.id);\r
-       },\r
-\r
-       updateBlocker : function() {\r
-               if (!this.isMSIE)\r
-                       return;\r
-\r
-               var e = this.getElement();\r
-               var b = this.getBlocker();\r
-               var x = this.parseInt(e.style.left);\r
-               var y = this.parseInt(e.style.top);\r
-               var w = this.parseInt(e.offsetWidth);\r
-               var h = this.parseInt(e.offsetHeight);\r
-\r
-               b.style.left = x + 'px';\r
-               b.style.top = y + 'px';\r
-               b.style.width = w + 'px';\r
-               b.style.height = h + 'px';\r
-               b.style.display = e.style.display;\r
-       },\r
-\r
-       getBlocker : function() {\r
-               if (!this.blockerElement) {\r
-                       var d = document, b = d.createElement("iframe");\r
-\r
-                       b.style.cssText = 'display: none; left: 0px; position: absolute; top: 0';\r
-                       b.src = 'javascript:false;';\r
-                       b.frameBorder = '0';\r
-                       b.scrolling = 'no';\r
-\r
-                       d.body.appendChild(b);\r
-                       this.blockerElement = b;\r
-               }\r
-\r
-               return this.blockerElement;\r
-       },\r
-\r
-       getAbsPosition : function(n) {\r
-               var p = {absLeft : 0, absTop : 0};\r
-\r
-               while (n) {\r
-                       p.absLeft += n.offsetLeft;\r
-                       p.absTop += n.offsetTop;\r
-                       n = n.offsetParent;\r
-               }\r
-\r
-               return p;\r
-       },\r
-\r
-       registerEventHandlers : function() {\r
-               if (!this.events) {\r
-                       var d = document;\r
-\r
-                       this.addEvent(d, 'mousedown', MCLayer.prototype.onMouseDown);\r
-\r
-                       this.events = true;\r
-               }\r
-       },\r
-\r
-       addEvent : function(o, n, h) {\r
-               if (o.attachEvent)\r
-                       o.attachEvent("on" + n, h);\r
-               else\r
-                       o.addEventListener(n, h, false);\r
-       },\r
-\r
-       onMouseDown : function(e) {\r
-               e = typeof(e) == "undefined" ? window.event : e;\r
-               var b = document.body;\r
-               var l = MCLayer.visibleLayer;\r
-\r
-               if (l) {\r
-                       var mx = l.isMSIE ? e.clientX + b.scrollLeft : e.pageX;\r
-                       var my = l.isMSIE ? e.clientY + b.scrollTop : e.pageY;\r
-                       var el = l.getElement();\r
-                       var x = parseInt(el.style.left);\r
-                       var y = parseInt(el.style.top);\r
-                       var w = parseInt(el.offsetWidth);\r
-                       var h = parseInt(el.offsetHeight);\r
-\r
-                       if (!(mx > x && mx < x + w && my > y && my < y + h)) {\r
-                               MCLayer.visibleLayer = null;\r
-\r
-                               if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my))\r
-                                       return true;\r
-\r
-                               l.hide();\r
-                       }\r
-               }\r
-       },\r
-\r
-       addCSSClass : function(e, c) {\r
-               this.removeCSSClass(e, c);\r
-               var a = this.explode(' ', e.className);\r
-               a[a.length] = c;\r
-               e.className = a.join(' ');\r
-       },\r
-\r
-       removeCSSClass : function(e, c) {\r
-               var a = this.explode(' ', e.className), i;\r
-\r
-               for (i=0; i<a.length; i++) {\r
-                       if (a[i] == c)\r
-                               a[i] = '';\r
-               }\r
-\r
-               e.className = a.join(' ');\r
-       },\r
-\r
-       explode : function(d, s) {\r
-               var ar = s.split(d);\r
-               var oar = new Array();\r
-\r
-               for (var i = 0; i<ar.length; i++) {\r
-                       if (ar[i] != "")\r
-                               oar[oar.length] = ar[i];\r
-               }\r
-\r
-               return oar;\r
-       },\r
-\r
-       parseInt : function(s) {\r
-               if (s == null || s == '')\r
-                       return 0;\r
-\r
-               return parseInt(s);\r
-       }\r
-}\r
+/**
+ * $Id: mclayer.js 162 2007-01-03 16:16:52Z spocke $
+ *
+ * Moxiecode floating layer script.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2007, 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);
+       }
+}
index fae038d6af82d1341aaba18b469e4f8445020a88..d6434028340f9ec652dc856b1728f8aa828e33f2 100644 (file)
@@ -1,74 +1,74 @@
-/**\r
- * $Id: mctabs.js 162 2007-01-03 16:16:52Z spocke $\r
- *\r
- * Moxiecode DHTML Tabs script.\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-function MCTabs() {\r
-       this.settings = new Array();\r
-};\r
-\r
-MCTabs.prototype.init = function(settings) {\r
-       this.settings = settings;\r
-};\r
-\r
-MCTabs.prototype.getParam = function(name, default_value) {\r
-       var value = null;\r
-\r
-       value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];\r
-\r
-       // Fix bool values\r
-       if (value == "true" || value == "false")\r
-               return (value == "true");\r
-\r
-       return value;\r
-};\r
-\r
-MCTabs.prototype.displayTab = function(tab_id, panel_id) {\r
-       var panelElm = document.getElementById(panel_id);\r
-       var panelContainerElm = panelElm ? panelElm.parentNode : null;\r
-       var tabElm = document.getElementById(tab_id);\r
-       var tabContainerElm = tabElm ? tabElm.parentNode : null;\r
-       var selectionClass = this.getParam('selection_class', 'current');\r
-\r
-       if (tabElm && tabContainerElm) {\r
-               var nodes = tabContainerElm.childNodes;\r
-\r
-               // Hide all other tabs\r
-               for (var i=0; i<nodes.length; i++) {\r
-                       if (nodes[i].nodeName == "LI")\r
-                               nodes[i].className = '';\r
-               }\r
-\r
-               // Show selected tab\r
-               tabElm.className = 'current';\r
-       }\r
-\r
-       if (panelElm && panelContainerElm) {\r
-               var nodes = panelContainerElm.childNodes;\r
-\r
-               // Hide all other panels\r
-               for (var i=0; i<nodes.length; i++) {\r
-                       if (nodes[i].nodeName == "DIV")\r
-                               nodes[i].className = 'panel';\r
-               }\r
-\r
-               // Show selected panel\r
-               panelElm.className = 'current';\r
-       }\r
-};\r
-\r
-MCTabs.prototype.getAnchor = function() {\r
-       var pos, url = document.location.href;\r
-\r
-       if ((pos = url.lastIndexOf('#')) != -1)\r
-               return url.substring(pos + 1);\r
-\r
-       return "";\r
-};\r
-\r
-// Global instance\r
-var mcTabs = new MCTabs();\r
+/**
+ * $Id: mctabs.js 162 2007-01-03 16:16:52Z spocke $
+ *
+ * Moxiecode DHTML Tabs script.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2007, 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();
index b8931f4373dfb4359c58173328871155403098e0..92b44edc02e7cf52a4067217b4cc3047054013ee 100644 (file)
-/**\r
- * $Id: validate.js 162 2007-01-03 16:16:52Z spocke $\r
- *\r
- * Various form validation methods.\r
- *\r
- * @author Moxiecode\r
- * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
- */\r
-\r
-/**\r
-       // String validation:\r
-\r
-       if (!Validator.isEmail('myemail'))\r
-               alert('Invalid email.');\r
-\r
-       // Form validation:\r
-\r
-       var f = document.forms['myform'];\r
-\r
-       if (!Validator.isEmail(f.myemail))\r
-               alert('Invalid email.');\r
-*/\r
-\r
-var Validator = {\r
-       isEmail : function(s) {\r
-               return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$');\r
-       },\r
-\r
-       isAbsUrl : function(s) {\r
-               return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$');\r
-       },\r
-\r
-       isSize : function(s) {\r
-               return this.test(s, '^[0-9]+(px|%)?$');\r
-       },\r
-\r
-       isId : function(s) {\r
-               return this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$');\r
-       },\r
-\r
-       isEmpty : function(s) {\r
-               var nl, i;\r
-\r
-               if (s.nodeName == 'SELECT' && s.selectedIndex < 1)\r
-                       return true;\r
-\r
-               if (s.type == 'checkbox' && !s.checked)\r
-                       return true;\r
-\r
-               if (s.type == 'radio') {\r
-                       for (i=0, nl = s.form.elements; i<nl.length; i++) {\r
-                               if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked)\r
-                                       return false;\r
-                       }\r
-\r
-                       return true;\r
-               }\r
-\r
-               return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s);\r
-       },\r
-\r
-       isNumber : function(s, d) {\r
-               return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$'));\r
-       },\r
-\r
-       test : function(s, p) {\r
-               s = s.nodeType == 1 ? s.value : s;\r
-\r
-               return s == '' || new RegExp(p).test(s);\r
-       }\r
-};\r
-\r
-var AutoValidator = {\r
-       settings : {\r
-               id_cls : 'id',\r
-               int_cls : 'int',\r
-               url_cls : 'url',\r
-               number_cls : 'number',\r
-               email_cls : 'email',\r
-               size_cls : 'size',\r
-               required_cls : 'required',\r
-               invalid_cls : 'invalid',\r
-               min_cls : 'min',\r
-               max_cls : 'max'\r
-       },\r
-\r
-       init : function(s) {\r
-               var n;\r
-\r
-               for (n in s)\r
-                       this.settings[n] = s[n];\r
-       },\r
-\r
-       validate : function(f) {\r
-               var i, nl, s = this.settings, c = 0;\r
-\r
-               nl = this.tags(f, 'label');\r
-               for (i=0; i<nl.length; i++)\r
-                       this.removeClass(nl[i], s.invalid_cls);\r
-\r
-               c += this.validateElms(f, 'input');\r
-               c += this.validateElms(f, 'select');\r
-               c += this.validateElms(f, 'textarea');\r
-\r
-               return c == 3;\r
-       },\r
-\r
-       invalidate : function(n) {\r
-               this.mark(n.form, n);\r
-       },\r
-\r
-       reset : function(e) {\r
-               var t = new Array('label', 'input', 'select', 'textarea');\r
-               var i, j, nl, s = this.settings;\r
-\r
-               if (e == null)\r
-                       return;\r
-\r
-               for (i=0; i<t.length; i++) {\r
-                       nl = this.tags(e.form ? e.form : e, t[i]);\r
-                       for (j=0; j<nl.length; j++)\r
-                               this.removeClass(nl[j], s.invalid_cls);\r
-               }\r
-       },\r
-\r
-       validateElms : function(f, e) {\r
-               var nl, i, n, s = this.settings, st = true, va = Validator, v;\r
-\r
-               nl = this.tags(f, e);\r
-               for (i=0; i<nl.length; i++) {\r
-                       n = nl[i];\r
-\r
-                       this.removeClass(n, s.invalid_cls);\r
-\r
-                       if (this.hasClass(n, s.required_cls) && va.isEmpty(n))\r
-                               st = this.mark(f, n);\r
-\r
-                       if (this.hasClass(n, s.number_cls) && !va.isNumber(n))\r
-                               st = this.mark(f, n);\r
-\r
-                       if (this.hasClass(n, s.int_cls) && !va.isNumber(n, true))\r
-                               st = this.mark(f, n);\r
-\r
-                       if (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n))\r
-                               st = this.mark(f, n);\r
-\r
-                       if (this.hasClass(n, s.email_cls) && !va.isEmail(n))\r
-                               st = this.mark(f, n);\r
-\r
-                       if (this.hasClass(n, s.size_cls) && !va.isSize(n))\r
-                               st = this.mark(f, n);\r
-\r
-                       if (this.hasClass(n, s.id_cls) && !va.isId(n))\r
-                               st = this.mark(f, n);\r
-\r
-                       if (this.hasClass(n, s.min_cls, true)) {\r
-                               v = this.getNum(n, s.min_cls);\r
-\r
-                               if (isNaN(v) || parseInt(n.value) < parseInt(v))\r
-                                       st = this.mark(f, n);\r
-                       }\r
-\r
-                       if (this.hasClass(n, s.max_cls, true)) {\r
-                               v = this.getNum(n, s.max_cls);\r
-\r
-                               if (isNaN(v) || parseInt(n.value) > parseInt(v))\r
-                                       st = this.mark(f, n);\r
-                       }\r
-               }\r
-\r
-               return st;\r
-       },\r
-\r
-       hasClass : function(n, c, d) {\r
-               return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className);\r
-       },\r
-\r
-       getNum : function(n, c) {\r
-               c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0];\r
-               c = c.replace(/[^0-9]/g, '');\r
-\r
-               return c;\r
-       },\r
-\r
-       addClass : function(n, c, b) {\r
-               var o = this.removeClass(n, c);\r
-               n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c;\r
-       },\r
-\r
-       removeClass : function(n, c) {\r
-               c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');\r
-               return n.className = c != ' ' ? c : '';\r
-       },\r
-\r
-       tags : function(f, s) {\r
-               return f.getElementsByTagName(s);\r
-       },\r
-\r
-       mark : function(f, n) {\r
-               var s = this.settings;\r
-\r
-               this.addClass(n, s.invalid_cls);\r
-               this.markLabels(f, n, s.invalid_cls);\r
-\r
-               return false;\r
-       },\r
-\r
-       markLabels : function(f, n, ic) {\r
-               var nl, i;\r
-\r
-               nl = this.tags(f, "label");\r
-               for (i=0; i<nl.length; i++) {\r
-                       if (nl[i].getAttribute("for") == n.id || nl[i].htmlFor == n.id)\r
-                               this.addClass(nl[i], ic);\r
-               }\r
-\r
-               return null;\r
-       }\r
-};\r
+/**
+ * $Id: validate.js 162 2007-01-03 16:16:52Z spocke $
+ *
+ * Various form validation methods.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+/**
+       // String validation:
+
+       if (!Validator.isEmail('myemail'))
+               alert('Invalid email.');
+
+       // Form validation:
+
+       var f = document.forms['myform'];
+
+       if (!Validator.isEmail(f.myemail))
+               alert('Invalid email.');
+*/
+
+var Validator = {
+       isEmail : function(s) {
+               return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$');
+       },
+
+       isAbsUrl : function(s) {
+               return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$');
+       },
+
+       isSize : function(s) {
+               return this.test(s, '^[0-9]+(px|%)?$');
+       },
+
+       isId : function(s) {
+               return this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$');
+       },
+
+       isEmpty : function(s) {
+               var nl, i;
+
+               if (s.nodeName == 'SELECT' && s.selectedIndex < 1)
+                       return true;
+
+               if (s.type == 'checkbox' && !s.checked)
+                       return true;
+
+               if (s.type == 'radio') {
+                       for (i=0, nl = s.form.elements; i<nl.length; i++) {
+                               if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked)
+                                       return false;
+                       }
+
+                       return true;
+               }
+
+               return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s);
+       },
+
+       isNumber : function(s, d) {
+               return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$'));
+       },
+
+       test : function(s, p) {
+               s = s.nodeType == 1 ? s.value : s;
+
+               return s == '' || new RegExp(p).test(s);
+       }
+};
+
+var AutoValidator = {
+       settings : {
+               id_cls : 'id',
+               int_cls : 'int',
+               url_cls : 'url',
+               number_cls : 'number',
+               email_cls : 'email',
+               size_cls : 'size',
+               required_cls : 'required',
+               invalid_cls : 'invalid',
+               min_cls : 'min',
+               max_cls : 'max'
+       },
+
+       init : function(s) {
+               var n;
+
+               for (n in s)
+                       this.settings[n] = s[n];
+       },
+
+       validate : function(f) {
+               var i, nl, s = this.settings, c = 0;
+
+               nl = this.tags(f, 'label');
+               for (i=0; i<nl.length; i++)
+                       this.removeClass(nl[i], s.invalid_cls);
+
+               c += this.validateElms(f, 'input');
+               c += this.validateElms(f, 'select');
+               c += this.validateElms(f, 'textarea');
+
+               return c == 3;
+       },
+
+       invalidate : function(n) {
+               this.mark(n.form, n);
+       },
+
+       reset : function(e) {
+               var t = new Array('label', 'input', 'select', 'textarea');
+               var i, j, nl, s = this.settings;
+
+               if (e == null)
+                       return;
+
+               for (i=0; i<t.length; i++) {
+                       nl = this.tags(e.form ? e.form : e, t[i]);
+                       for (j=0; j<nl.length; j++)
+                               this.removeClass(nl[j], s.invalid_cls);
+               }
+       },
+
+       validateElms : function(f, e) {
+               var nl, i, n, s = this.settings, st = true, va = Validator, v;
+
+               nl = this.tags(f, e);
+               for (i=0; i<nl.length; i++) {
+                       n = nl[i];
+
+                       this.removeClass(n, s.invalid_cls);
+
+                       if (this.hasClass(n, s.required_cls) && va.isEmpty(n))
+                               st = this.mark(f, n);
+
+                       if (this.hasClass(n, s.number_cls) && !va.isNumber(n))
+                               st = this.mark(f, n);
+
+                       if (this.hasClass(n, s.int_cls) && !va.isNumber(n, true))
+                               st = this.mark(f, n);
+
+                       if (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n))
+                               st = this.mark(f, n);
+
+                       if (this.hasClass(n, s.email_cls) && !va.isEmail(n))
+                               st = this.mark(f, n);
+
+                       if (this.hasClass(n, s.size_cls) && !va.isSize(n))
+                               st = this.mark(f, n);
+
+                       if (this.hasClass(n, s.id_cls) && !va.isId(n))
+                               st = this.mark(f, n);
+
+                       if (this.hasClass(n, s.min_cls, true)) {
+                               v = this.getNum(n, s.min_cls);
+
+                               if (isNaN(v) || parseInt(n.value) < parseInt(v))
+                                       st = this.mark(f, n);
+                       }
+
+                       if (this.hasClass(n, s.max_cls, true)) {
+                               v = this.getNum(n, s.max_cls);
+
+                               if (isNaN(v) || parseInt(n.value) > parseInt(v))
+                                       st = this.mark(f, n);
+                       }
+               }
+
+               return st;
+       },
+
+       hasClass : function(n, c, d) {
+               return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className);
+       },
+
+       getNum : function(n, c) {
+               c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0];
+               c = c.replace(/[^0-9]/g, '');
+
+               return c;
+       },
+
+       addClass : function(n, c, b) {
+               var o = this.removeClass(n, c);
+               n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c;
+       },
+
+       removeClass : function(n, c) {
+               c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');
+               return n.className = c != ' ' ? c : '';
+       },
+
+       tags : function(f, s) {
+               return f.getElementsByTagName(s);
+       },
+
+       mark : function(f, n) {
+               var s = this.settings;
+
+               this.addClass(n, s.invalid_cls);
+               this.markLabels(f, n, s.invalid_cls);
+
+               return false;
+       },
+
+       markLabels : function(f, n, ic) {
+               var nl, i;
+
+               nl = this.tags(f, "label");
+               for (i=0; i<nl.length; i++) {
+                       if (nl[i].getAttribute("for") == n.id || nl[i].htmlFor == n.id)
+                               this.addClass(nl[i], ic);
+               }
+
+               return null;
+       }
+};
index 05b1c00e13030a1fbbdaf2df94ba8f2155804700..e9b46847d7c6ab8f7de9b7d7fce6df96e2da00ff 100644 (file)
                - Sanity check of $message_set in iil_C_FetchHeaders(), iil_C_FetchHeaderIndex(), iil_C_FetchThreadHeaders()
                - Implemented UID FETCH in iil_C_FetchHeaders()
                - Abort do-loop on socket errors (fgets returns false)
+               - $ICL_SSL is not boolean anymore but contains the connection schema (ssl or tls)
                - Removed some debuggers (echo ...)
 
 ********************************************************/
 
+/**
+ * @todo Possibly clean up more CS.
+ * @todo Try to replace most double-quotes with single-quotes.
+ * @todo Split this file into smaller files.
+ * @todo Refactor code.
+ * @todo Replace echo-debugging (make it adhere to config setting and log)
+ */
 
 // changed path to work within roundcube webmail
-include_once("lib/icl_commons.inc");
+include_once 'lib/icl_commons.inc';
 
 
-if (!$IMAP_USE_HEADER_DATE) $IMAP_USE_INTERNAL_DATE = true;
-$IMAP_MONTHS=array("Jan"=>1,"Feb"=>2,"Mar"=>3,"Apr"=>4,"May"=>5,"Jun"=>6,"Jul"=>7,"Aug"=>8,"Sep"=>9,"Oct"=>10,"Nov"=>11,"Dec"=>12);
-$IMAP_SERVER_TZ = date('Z');
+if (!isset($IMAP_USE_HEADER_DATE) || !$IMAP_USE_HEADER_DATE) {
+    $IMAP_USE_INTERNAL_DATE = true;
+}
+
+/**
+ * @todo Maybe use date() to generate this.
+ */
+$GLOBALS['IMAP_MONTHS'] = array("Jan" => 1, "Feb" => 2, "Mar" => 3, "Apr" => 4,
+    "May" => 5, "Jun" => 6, "Jul" => 7, "Aug" => 8, "Sep" => 9, "Oct" => 10,
+    "Nov" => 11, "Dec" => 12);
+
+$GLOBALS['IMAP_SERVER_TZ'] = date('Z');
 
 $iil_error;
 $iil_errornum;
 $iil_selected;
 
-class iilConnection{
+/**
+ * @todo Change class vars to public/private
+ */
+class iilConnection
+{
        var $fp;
        var $error;
        var $errorNum;
@@ -83,7 +104,11 @@ class iilConnection{
        var $capability = array();
 }
 
-class iilBasicHeader{
+/**
+ * @todo Change class vars to public/private
+ */
+class iilBasicHeader
+{
        var $id;
        var $uid;
        var $subject;
@@ -96,21 +121,29 @@ class iilBasicHeader{
        var $messageID;
        var $size;
        var $encoding;
+       var $charset;
        var $ctype;
        var $flags;
        var $timestamp;
        var $f;
-       var $seen;
-       var $deleted;
-       var $recent;
-       var $answered;
-       var $junk;
        var $internaldate;
-       var $is_reply;
-}
-
-
-class iilThreadHeader{
+       var $references;
+       var $priority;
+       var $mdn_to;
+       var $mdn_sent = false;
+       var $is_reply = false;
+       var $seen = false;
+       var $deleted = false;
+       var $recent = false;
+       var $answered = false;
+       var $junk = false;
+}
+
+/**
+ * @todo Change class vars to public/private
+ */
+class iilThreadHeader
+{
        var $id;
        var $sbj;
        var $irt;
@@ -118,205 +151,254 @@ class iilThreadHeader{
 }
 
 
-function iil_xor($string, $string2){
-    $result = "";
+function iil_xor($string, $string2) {
+    $result = '';
     $size = strlen($string);
-    for ($i=0; $i<$size; $i++) $result .= chr(ord($string[$i]) ^ ord($string2[$i]));
-        
+    for ($i=0; $i<$size; $i++) {
+       $result .= chr(ord($string[$i]) ^ ord($string2[$i]));
+    }
     return $result;
 }
 
-function iil_ReadLine($fp, $size){
-       $line="";
-       if ($fp){
-               do{
+function iil_ReadLine($fp, $size) {
+       $line = '';
+       if ($fp) {
+               do {
+                   // FIXME: hardcode size?
                        $buffer = fgets($fp, 2048);
-                       if ($buffer === false)
+                       if ($buffer === false) {
                                break;
-                       $line.=$buffer;
-               }while($buffer[strlen($buffer)-1]!="\n");
+            }
+                       $line .= $buffer;
+               } while ($buffer[strlen($buffer)-1]!="\n");
        }
        return $line;
 }
 
-function iil_MultLine($fp, $line){
+function iil_MultLine($fp, $line) {
        $line = chop($line);
-       if (ereg('\{[0-9]+\}$', $line)){
-               $out = "";
+       if (ereg('\{[0-9]+\}$', $line)) {
+               $out = '';
+        
                preg_match_all('/(.*)\{([0-9]+)\}$/', $line, $a);
                $bytes = $a[2][0];
-               while(strlen($out)<$bytes){
-                       $out.=chop(iil_ReadLine($fp, 1024));
+               while (strlen($out) < $bytes) {
+                   $line = iil_ReadLine($fp, 1024); 
+                       $out .= chop($line);
                }
-               $line = $a[1][0]."\"$out\"";
+               $line = $a[1][0] . "\"$out\"";
        }
        return $line;
 }
 
-function iil_ReadBytes($fp, $bytes){
-       $data = "";
-       $len = 0;
-       do{
+function iil_ReadBytes($fp, $bytes) {
+       $data = '';
+       $len  = 0;
+       do {
                $data.=fread($fp, $bytes-$len);
                $len = strlen($data);
-       }while($len<$bytes);
+       } while ($len<$bytes);
        return $data;
 }
 
-function iil_ReadReply($fp){
-       do{
+function iil_ReadReply($fp) {
+       do {
                $line = chop(trim(iil_ReadLine($fp, 1024)));
-       }while($line[0]=="*");
+       } while ($line[0] == '*');
        
        return $line;
 }
 
-function iil_ParseResult($string){
-       $a=explode(" ", $string);
-       if (count($a) > 2){
-               if (strcasecmp($a[1], "OK")==0) return 0;
-               else if (strcasecmp($a[1], "NO")==0) return -1;
-               else if (strcasecmp($a[1], "BAD")==0) return -2;
-       }else return -3;
+function iil_ParseResult($string) {
+       $a=explode(' ', $string);
+       if (count($a) > 2) {
+               if (strcasecmp($a[1], 'OK') == 0) {
+                   return 0;
+               } else if (strcasecmp($a[1], 'NO') == 0) {
+                   return -1;
+               } else if (strcasecmp($a[1], 'BAD') == 0) {
+                   return -2;
+        }
+       }
+    return -3;
 }
 
 // check if $string starts with $match
-function iil_StartsWith($string, $match){
+function iil_StartsWith($string, $match) {
        $len = strlen($match);
-       if ($len==0) return false;
-       if (strncmp($string, $match, $len)==0) return true;
-       else return false;
+       if ($len == 0) {
+           return false;
+    }
+       if (strncmp($string, $match, $len) == 0) {
+           return true;
+    }
+       return false;
 }
 
-function iil_StartsWithI($string, $match){
+function iil_StartsWithI($string, $match) {
        $len = strlen($match);
-       if ($len==0) return false;
-       if (strncasecmp($string, $match, $len)==0) return true;
-       else return false;
+       if ($len == 0) {
+           return false;
+    }
+       if (strncasecmp($string, $match, $len) == 0) {
+           return true;
+    }
+       return false;
 }
 
 
-function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge){
+function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
+    
+    $ipad = '';
+    $opad = '';
     
     // initialize ipad, opad
-    for ($i=0;$i<64;$i++){
-        $ipad.=chr(0x36);
-        $opad.=chr(0x5C);
+    for ($i=0;$i<64;$i++) {
+        $ipad .= chr(0x36);
+        $opad .= chr(0x5C);
     }
     // pad $pass so it's 64 bytes
     $padLen = 64 - strlen($pass);
-    for ($i=0;$i<$padLen;$i++) $pass .= chr(0);
+    for ($i=0;$i<$padLen;$i++) {
+        $pass .= chr(0);
+    }
+    
     // generate hash
-    $hash = md5(iil_xor($pass,$opad).pack("H*",md5(iil_xor($pass, $ipad).base64_decode($encChallenge))));
+    $hash  = iil_xor($pass,$opad);
+    $hash .= pack("H*", md5(iil_xor($pass, $ipad) . base64_decode($encChallenge)));
+    $hash  = md5($hash);
+    
     // generate reply
-    $reply = base64_encode($user." ".$hash);
+    $reply = base64_encode('"' . $user . '" "' . $hash . '"');
     
     // send result, get reply
-    fputs($conn->fp, $reply."\r\n");
+    fputs($conn->fp, $reply . "\r\n");
     $line = iil_ReadLine($conn->fp, 1024);
     
     // process result
-    if (iil_ParseResult($line)==0){
-        $conn->error .= "";
-        $conn->errorNum = 0;
+    if (iil_ParseResult($line) == 0) {
+        $conn->error    .= '';
+        $conn->errorNum  = 0;
         return $conn->fp;
-    }else{
-        $conn->error .= 'Authentication for '.$user.' failed (AUTH): "'.htmlspecialchars($line)."\"";
-        $conn->errorNum = -2;
-        return false;
     }
+    $conn->error    .= 'Authentication for ' . $user . ' failed (AUTH): "';
+    $conn->error    .= htmlspecialchars($line) . '"';
+    $conn->errorNum  = -2;
+    return false;
 }
 
-function iil_C_Login(&$conn, $user, $password){
+function iil_C_Login(&$conn, $user, $password) {
 
     $password = strtr($password, array('"'=>'\\"', '\\' => '\\\\'));  
     fputs($conn->fp, "a001 LOGIN $user \"$password\"\r\n");
 
-  do{
-    $line = iil_ReadReply($conn->fp);
-    if ($line === false)
-      break;
-  }while(!iil_StartsWith($line, "a001 "));
-    $a=explode(" ", $line);
-    if (strcmp($a[1],"OK")==0){
-        $result=$conn->fp;
-        $conn->error.="";
-        $conn->errorNum = 0;
-    }else{
-        $result=false;
-        fclose($conn->fp);
-        $conn->error .= 'Authentication for '.$user.' failed (LOGIN): "'.htmlspecialchars($line)."\"";
-        $conn->errorNum = -2;
+    do {
+        $line = iil_ReadReply($conn->fp);
+        if ($line === false) {
+            break;
+        }
+    } while (!iil_StartsWith($line, "a001 "));
+    $a = explode(' ', $line);
+    if (strcmp($a[1], 'OK') == 0) {
+        $result          = $conn->fp;
+        $conn->error    .= '';
+        $conn->errorNum  = 0;
+        return $result;
     }
+    $result = false;
+    fclose($conn->fp);
+    
+    $conn->error    .= 'Authentication for ' . $user . ' failed (LOGIN): "';
+    $conn->error    .= htmlspecialchars($line)."\"";
+    $conn->errorNum  = -2;
+
     return $result;
 }
 
-function iil_ParseNamespace2($str, &$i, $len=0, $l){
-       if (!$l) $str = str_replace("NIL", "()", $str);
-       if (!$len) $len = strlen($str);
-       $data = array();
+function iil_ParseNamespace2($str, &$i, $len=0, $l) {
+       if (!$l) {
+           $str = str_replace('NIL', '()', $str);
+    }
+       if (!$len) {
+           $len = strlen($str);
+    }
+       $data      = array();
        $in_quotes = false;
-       $elem = 0;
-       for($i;$i<$len;$i++){
+       $elem      = 0;
+       for ($i;$i<$len;$i++) {
                $c = (string)$str[$i];
-               if ($c=='(' && !$in_quotes){
+               if ($c == '(' && !$in_quotes) {
                        $i++;
                        $data[$elem] = iil_ParseNamespace2($str, $i, $len, $l++);
                        $elem++;
-               }else if ($c==')' && !$in_quotes) return $data;
-               else if ($c=="\\"){
+               } else if ($c == ')' && !$in_quotes) {
+                   return $data;
+        } else if ($c == '\\') {
                        $i++;
-                       if ($in_quotes) $data[$elem].=$c.$str[$i];
-               }else if ($c=='"'){
+                       if ($in_quotes) {
+                           $data[$elem] .= $c.$str[$i];
+            }
+               } else if ($c == '"') {
                        $in_quotes = !$in_quotes;
-                       if (!$in_quotes) $elem++;
-               }else if ($in_quotes){
+                       if (!$in_quotes) {
+                           $elem++;
+            }
+               } else if ($in_quotes) {
                        $data[$elem].=$c;
                }
        }
        return $data;
 }
 
-function iil_C_NameSpace(&$conn){
+function iil_C_NameSpace(&$conn) {
        global $my_prefs;
        
-       if (!in_array('NAMESPACE', $conn->capability))
-         return false;
-       
-       if ($my_prefs["rootdir"]) return true;
-       
+       if (!in_array('NAMESPACE', $conn->capability)) {
+           return false;
+       }
+    
+       if ($my_prefs["rootdir"]) {
+           return true;
+       }
+    
        fputs($conn->fp, "ns1 NAMESPACE\r\n");
-       do{
+       do {
                $line = iil_ReadLine($conn->fp, 1024);
-               if (iil_StartsWith($line, "* NAMESPACE")){
-                       $i = 0;
+               if (iil_StartsWith($line, '* NAMESPACE')) {
+                       $i    = 0;
                        $data = iil_ParseNamespace2(substr($line,11), $i, 0, 0);
                }
-       }while(!iil_StartsWith($line, "ns1"));
-       
-       if (!is_array($data)) return false;
+       } while (!iil_StartsWith($line, "ns1"));
        
+       if (!is_array($data)) {
+           return false;
+       }
+    
        $user_space_data = $data[0];
-       if (!is_array($user_space_data)) return false;
-       
+       if (!is_array($user_space_data)) {
+           return false;
+       }
+    
        $first_userspace = $user_space_data[0];
-       if (count($first_userspace)!=2) return false;
-       
-       $conn->rootdir = $first_userspace[0];
-       $conn->delimiter = $first_userspace[1];
+       if (count($first_userspace)!=2) {
+           return false;
+       }
+    
+       $conn->rootdir       = $first_userspace[0];
+       $conn->delimiter     = $first_userspace[1];
        $my_prefs["rootdir"] = substr($conn->rootdir, 0, -1);
        
        return true;
 
 }
 
-function iil_Connect($host, $user, $password){ 
+function iil_Connect($host, $user, $password) {        
     global $iil_error, $iil_errornum;
        global $ICL_SSL, $ICL_PORT;
        global $IMAP_NO_CACHE;
        global $my_prefs, $IMAP_USE_INTERNAL_DATE;
        
-       $iil_error = "";
+       $iil_error = '';
        $iil_errornum = 0;
        
        //strip slashes
@@ -324,97 +406,123 @@ function iil_Connect($host, $user, $password){
        // $password = stripslashes($password);
        
        //set auth method
-       $auth_method = "plain";
-       if (func_num_args() >= 4){
+       $auth_method = 'plain';
+       if (func_num_args() >= 4) {
                $auth_array = func_get_arg(3);
-               if (is_array($auth_array)) $auth_method = $auth_array["imap"];
-               if (empty($auth_method)) $auth_method = "plain";
+               if (is_array($auth_array)) {
+                   $auth_method = $auth_array['imap'];
+        }
+               if (empty($auth_method)) {
+            $auth_method = "plain";
+        }
        }
        $message = "INITIAL: $auth_method\n";
                
        $result = false;
        
        //initialize connection
-       $conn = new iilConnection;
-       $conn->error="";
-       $conn->errorNum=0;
-       $conn->selected="";
-       $conn->user = $user;
-       $conn->host = $host;
-       $conn->cache = array();
-       $conn->do_cache = (function_exists("cache_write")&&!$IMAP_NO_CACHE);
+       $conn              = new iilConnection;
+       $conn->error       = '';
+       $conn->errorNum    = 0;
+       $conn->selected    = '';
+       $conn->user        = $user;
+       $conn->host        = $host;
+       $conn->cache       = array();
+       $conn->do_cache    = (function_exists("cache_write")&&!$IMAP_NO_CACHE);
        $conn->cache_dirty = array();
        
-       if ($my_prefs['sort_field']=='INTERNALDATE') $IMAP_USE_INTERNAL_DATE = true;
-       else if ($my_prefs['sort_field']=='DATE') $IMAP_USE_INTERNAL_DATE = false;
+       if ($my_prefs['sort_field'] == 'INTERNALDATE') {
+           $IMAP_USE_INTERNAL_DATE = true;
+    } else if ($my_prefs['sort_field'] == 'DATE') {
+        $IMAP_USE_INTERNAL_DATE = false;
+    }
        //echo '<!-- conn sort_field: '.$my_prefs['sort_field'].' //-->';
        
        //check input
-       if (empty($host)) $iil_error .= "Invalid host\n";
-       if (empty($user)) $iil_error .= "Invalid user\n";
-       if (empty($password)) $iil_error .= "Invalid password\n";
-       if (!empty($iil_error)) return false;
-       if (!$ICL_PORT) $ICL_PORT = 143;
-       
+       if (empty($host)) {
+           $iil_error .= "Invalid host\n";
+    }
+       if (empty($user)) {
+           $iil_error .= "Invalid user\n";
+    }
+       if (empty($password)) {
+           $iil_error .= "Invalid password\n";
+    }
+       if (!empty($iil_error)) {
+           return false;
+    }
+       if (!$ICL_PORT) {
+           $ICL_PORT = 143;
+       }
+    
        //check for SSL
-       if ($ICL_SSL){
-               $host = "ssl://".$host;
+       if ($ICL_SSL) {
+               $host = $ICL_SSL . '://' . $host;
        }
        
        //open socket connection
-       $conn->fp = @fsockopen($host, $ICL_PORT, $errno, $errstr, 10);
-       if (!$conn->fp){
-        $iil_error = "Could not connect to $host at port $ICL_PORT: $errstr";
+       $conn->fp = fsockopen($host, $ICL_PORT, $errno, $errstr, 10);
+       if (!$conn->fp) {
+        $iil_error    = "Could not connect to $host at port $ICL_PORT: $errstr";
         $iil_errornum = -1;
                return false;
        }
 
-       $iil_error.="Socket connection established\r\n";
-       $line=iil_ReadLine($conn->fp, 300);
+       $iil_error .= "Socket connection established\r\n";
+       $line       = iil_ReadLine($conn->fp, 300);
 
-       if (strcasecmp($auth_method, "check")==0){
+       if (strcasecmp($auth_method, "check") == 0) {
                //check for supported auth methods
                
                //default to plain text auth
-               $auth_method = "plain";
+               $auth_method = 'plain';
                        
                //check for CRAM-MD5
                fputs($conn->fp, "cp01 CAPABILITY\r\n");
-               do{
-               $line = trim(chop(iil_ReadLine($conn->fp, 100)));
-               $conn->message.="$line\n";
-                       $a = explode(" ", $line);
-                       if ($line[0]=="*"){
-                               while ( list($k, $w) = each($a) ){
-                                   if ($w!='*' && $w!='CAPABILITY')
+               do {
+                   $line = trim(chop(iil_ReadLine($conn->fp, 100)));
+
+                   $conn->message .= "$line\n";
+
+                       $a = explode(' ', $line);
+                       if ($line[0] == '*') {
+                               while (list($k, $w) = each($a)) {
+                                   if ($w != '*' && $w != 'CAPABILITY') {
                                        $conn->capability[] = $w;
-                                       if ((strcasecmp($w, "AUTH=CRAM_MD5")==0)||
-                                               (strcasecmp($w, "AUTH=CRAM-MD5")==0)){
-                                                       $auth_method = "auth";
-                                               }
+                    }
+                                       if ((strcasecmp($w, "AUTH=CRAM_MD5") == 0)||
+                                               (strcasecmp($w, "AUTH=CRAM-MD5") == 0)) {
+                                           $auth_method = "auth";
+                                       }
                                }
                        }
-               }while($a[0]!="cp01");
+               } while ($a[0] != 'cp01');
        }
 
-       if (strcasecmp($auth_method, "auth")==0){
-               $conn->message.="Trying CRAM-MD5\n";
+       if (strcasecmp($auth_method, 'auth') == 0) {
+               $conn->message .= "Trying CRAM-MD5\n";
+
                //do CRAM-MD5 authentication
                fputs($conn->fp, "a000 AUTHENTICATE CRAM-MD5\r\n");
                $line = trim(chop(iil_ReadLine($conn->fp, 1024)));
-               $conn->message.="$line\n";
-               if ($line[0]=="+"){
-                       $conn->message.='Got challenge: '.htmlspecialchars($line)."\n";
+        
+               $conn->message .= "$line\n";
+        
+               if ($line[0] == '+') {
+                       $conn->message .= 'Got challenge: ' . htmlspecialchars($line) . "\n";
+
                        //got a challenge string, try CRAM-5
                        $result = iil_C_Authenticate($conn, $user, $password, substr($line,2));
-                       $conn->message.= "Tried CRAM-MD5: $result \n";
-               }else{
-                       $conn->message.='No challenge ('.htmlspecialchars($line)."), try plain\n";
-                       $auth = "plain";
+            
+                       $conn->message .= "Tried CRAM-MD5: $result \n";
+               } else {
+                       $conn->message .='No challenge ('.htmlspecialchars($line)."), try plain\n";
+                       
+            $auth = 'plain';            
                }
        }
                
-       if ((!$result)||(strcasecmp($auth, "plain")==0)){
+       if ((!$result)||(strcasecmp($auth, "plain") == 0)) {
                //do plain text auth
                $result = iil_C_Login($conn, $user, $password);
                $conn->message.="Tried PLAIN: $result \n";
@@ -422,36 +530,36 @@ function iil_Connect($host, $user, $password){
                
        $conn->message .= $auth;
                        
-       if ($result){
+       if ($result) {
                iil_C_Namespace($conn);
                return $conn;
-       }else{
+       } else {
                $iil_error = $conn->error;
                $iil_errornum = $conn->errorNum;
                return false;
        }
 }
 
-function iil_Close(&$conn){
+function iil_Close(&$conn) {
        iil_C_WriteCache($conn);
-       if (@fputs($conn->fp, "I LOGOUT\r\n")){
+       if (fputs($conn->fp, "I LOGOUT\r\n")) {
                fgets($conn->fp, 1024);
                fclose($conn->fp);
                $conn->fp = false;
        }
 }
 
-function iil_ClearCache($user, $host){
+function iil_ClearCache($user, $host) {
 }
 
 
-function iil_C_WriteCache(&$conn){
+function iil_C_WriteCache(&$conn) {
        //echo "<!-- doing iil_C_WriteCache //-->\n";
        if (!$conn->do_cache) return false;
        
-       if (is_array($conn->cache)){
-               while(list($folder,$data)=each($conn->cache)){
-                       if ($folder && is_array($data) && $conn->cache_dirty[$folder]){
+       if (is_array($conn->cache)) {
+               while (list($folder,$data)=each($conn->cache)) {
+                       if ($folder && is_array($data) && $conn->cache_dirty[$folder]) {
                                $key = $folder.".imap";
                                $result = cache_write($conn->user, $conn->host, $key, $data, true);
                                //echo "<!-- writing $key $data: $result //-->\n";
@@ -460,35 +568,43 @@ function iil_C_WriteCache(&$conn){
        }
 }
 
-function iil_C_EnableCache(&$conn){
+function iil_C_EnableCache(&$conn) {
        $conn->do_cache = true;
 }
 
-function iil_C_DisableCache(&$conn){
+function iil_C_DisableCache(&$conn) {
        $conn->do_cache = false;
 }
 
-function iil_C_LoadCache(&$conn, $folder){
-       if (!$conn->do_cache) return false;
-       
-       $key = $folder.".imap";
-       if (!is_array($conn->cache[$folder])){
-               $conn->cache[$folder] = cache_read($conn->user, $conn->host, $key);
+function iil_C_LoadCache(&$conn, $folder) {
+       if (!$conn->do_cache) {
+           return false;
+       }
+    
+       $key = $folder.'.imap';
+       if (!is_array($conn->cache[$folder])) {
+               $conn->cache[$folder]       = cache_read($conn->user, $conn->host, $key);
                $conn->cache_dirty[$folder] = false;
        }
 }
 
-function iil_C_ExpireCachedItems(&$conn, $folder, $message_set){
+function iil_C_ExpireCachedItems(&$conn, $folder, $message_set) {
        
-       if (!$conn->do_cache) return;   //caching disabled
-       if (!is_array($conn->cache[$folder])) return;   //cache not initialized|empty
-       if (count($conn->cache[$folder])==0) return;    //cache not initialized|empty
-               
-       $uids = iil_C_FetchHeaderIndex($conn, $folder, $message_set, "UID");
+       if (!$conn->do_cache) {
+           return;     //caching disabled
+       }
+    if (!is_array($conn->cache[$folder])) {
+        return;        //cache not initialized|empty
+       }
+    if (count($conn->cache[$folder]) == 0) {
+        return;        //cache not initialized|empty
+    }
+    
+       $uids = iil_C_FetchHeaderIndex($conn, $folder, $message_set, 'UID');
        $num_removed = 0;
-       if (is_array($uids)){
+       if (is_array($uids)) {
                //echo "<!-- unsetting: ".implode(",",$uids)." //-->\n";
-               while(list($n,$uid)=each($uids)){
+               while (list($n,$uid)=each($uids)) {
                        unset($conn->cache[$folder][$uid]);
                        //$conn->cache[$folder][$uid] = false;
                        //$num_removed++;
@@ -498,15 +614,15 @@ function iil_C_ExpireCachedItems(&$conn, $folder, $message_set){
                //echo '<!--'."\n";
                //print_r($conn->cache);
                //echo "\n".'//-->'."\n";
-       }else{
+       } else {
                echo "<!-- failed to get uids: $message_set //-->\n";
        }
        
        /*
-       if ($num_removed>0){
+       if ($num_removed>0) {
                $new_cache;
                reset($conn->cache[$folder]);
-               while(list($uid,$item)=each($conn->cache[$folder])){
+               while (list($uid,$item)=each($conn->cache[$folder])) {
                        if ($item) $new_cache[$uid] = $conn->cache[$folder][$uid];
                }
                $conn->cache[$folder] = $new_cache;
@@ -514,125 +630,153 @@ function iil_C_ExpireCachedItems(&$conn, $folder, $message_set){
        */
 }
 
-function iil_ExplodeQuotedString($delimiter, $string){
-       $quotes=explode("\"", $string);
-       while ( list($key, $val) = each($quotes))
-               if (($key % 2) == 1) 
+function iil_ExplodeQuotedString($delimiter, $string) {
+       $quotes=explode('"', $string);
+       while ( list($key, $val) = each($quotes)) {
+               if (($key % 2) == 1) {
                        $quotes[$key] = str_replace($delimiter, "_!@!_", $quotes[$key]);
-       $string=implode("\"", $quotes);
+        }
+    }
+       $string=implode('"', $quotes);
        
        $result=explode($delimiter, $string);
-       while ( list($key, $val) = each($result) )
-               $result[$key] = str_replace("_!@!_", $delimiter, $result[$key]);
-       
+       while ( list($key, $val) = each($result) ) {
+               $result[$key] = str_replace('_!@!_', $delimiter, $result[$key]);
+       }
+    
        return $result;
 }
 
-function iil_CheckForRecent($host, $user, $password, $mailbox){
-       if (empty($mailbox)) $mailbox="INBOX";
-       
-       $conn=iil_Connect($host, $user, $password, "plain");
-       $fp = $conn->fp;
-       if ($fp){
+function iil_CheckForRecent($host, $user, $password, $mailbox) {
+       if (empty($mailbox)) {
+           $mailbox = 'INBOX';
+       }
+    
+       $conn = iil_Connect($host, $user, $password, 'plain');
+       $fp   = $conn->fp;
+       if ($fp) {
                fputs($fp, "a002 EXAMINE \"$mailbox\"\r\n");
-               do{
+               do {
                        $line=chop(iil_ReadLine($fp, 300));
-                       $a=explode(" ", $line);
-                       if (($a[0]=="*") && (strcasecmp($a[2], "RECENT")==0))  $result=(int)$a[1];
-               }while (!iil_StartsWith($a[0],"a002"));
+                       $a=explode(' ', $line);
+                       if (($a[0] == '*') && (strcasecmp($a[2], 'RECENT') == 0)) {
+                           $result = (int) $a[1];
+            }
+               } while (!iil_StartsWith($a[0], 'a002'));
 
                fputs($fp, "a003 LOGOUT\r\n");
                fclose($fp);
-       }else $result=-2;
-       
+       } else {
+           $result = -2;
+       }
+    
        return $result;
 }
 
-function iil_C_Select(&$conn, $mailbox){
+function iil_C_Select(&$conn, $mailbox) {
        $fp = $conn->fp;
        
-       if (empty($mailbox)) return false;
-       if (strcmp($conn->selected, $mailbox)==0) return true;
-       
+       if (empty($mailbox)) {
+           return false;
+       }
+    if (strcmp($conn->selected, $mailbox) == 0) {
+        return true;
+       }
+    
        iil_C_LoadCache($conn, $mailbox);
        
-       if (fputs($fp, "sel1 SELECT \"$mailbox\"\r\n")){
-               do{
+       if (fputs($fp, "sel1 SELECT \"$mailbox\"\r\n")) {
+               do {
                        $line=chop(iil_ReadLine($fp, 300));
-                       $a=explode(" ", $line);
-                       if (count($a) == 3){
-                               if (strcasecmp($a[2], "EXISTS")==0) $conn->exists=(int)$a[1];
-                               if (strcasecmp($a[2], "RECENT")==0) $conn->recent=(int)$a[1];
+                       $a=explode(' ', $line);
+                       if (count($a) == 3) {
+                               if (strcasecmp($a[2], 'EXISTS') == 0) {
+                                   $conn->exists = (int) $a[1];
+                               }
+                if (strcasecmp($a[2], 'RECENT') == 0) {
+                    $conn->recent = (int) $a[1];
+                }
                        }
-               }while (!iil_StartsWith($line, "sel1"));
+               } while (!iil_StartsWith($line, 'sel1'));
 
-               $a=explode(" ", $line);
+               $a=explode(' ', $line);
 
-               if (strcasecmp($a[1],"OK")==0){
+               if (strcasecmp($a[1], 'OK') == 0) {
                        $conn->selected = $mailbox;
                        return true;
-               }else return false;
-       }else{
-               return false;
+               }
        }
+    return false;
 }
 
-function iil_C_CheckForRecent(&$conn, $mailbox){
-       if (empty($mailbox)) $mailbox="INBOX";
-       
+function iil_C_CheckForRecent(&$conn, $mailbox) {
+       if (empty($mailbox)) {
+           $mailbox = 'INBOX';
+       }
+    
        iil_C_Select($conn, $mailbox);
-       if ($conn->selected==$mailbox) return $conn->recent;
-       else return false;
+       if ($conn->selected == $mailbox) {
+           return $conn->recent;
+       }
+    return false;
 }
 
-function iil_C_CountMessages(&$conn, $mailbox, $refresh=false){
-       if ($refresh) $conn->selected="";
+function iil_C_CountMessages(&$conn, $mailbox, $refresh = false) {
+       if ($refresh) {
+               $conn->selected= '';
+       }
        iil_C_Select($conn, $mailbox);
-       if ($conn->selected==$mailbox) return $conn->exists;
-       else return false;
+       if ($conn->selected == $mailbox) {
+               return $conn->exists;
+       }
+       return false;
 }
 
-function iil_SplitHeaderLine($string){
-       $pos=strpos($string, ":");
-       if ($pos>0){
-               $res[0]=substr($string, 0, $pos);
-               $res[1]=trim(substr($string, $pos+1));
+function iil_SplitHeaderLine($string) {
+       $pos=strpos($string, ':');
+       if ($pos>0) {
+               $res[0] = substr($string, 0, $pos);
+               $res[1] = trim(substr($string, $pos+1));
                return $res;
-       }else{
-               return $string;
        }
+    return $string;
 }
 
-function iil_StrToTime($str){
-       global $IMAP_MONTHS,$IMAP_SERVER_TZ;
+function iil_StrToTime($str) {
+       $IMAP_MONTHS    = $GLOBALS['IMAP_MONTHS'];
+    $IMAP_SERVER_TZ = $GLOBALS['IMAP_SERVER_TR'];
                
-       if ($str) $time1 = strtotime($str);
-       if ($time1 && $time1!=-1) return $time1-$IMAP_SERVER_TZ;
-       
+       if ($str) {
+        $time1 = strtotime($str);
+    }
+       if ($time1 && $time1 != -1) {
+           return $time1-$IMAP_SERVER_TZ;
+       }
        //echo '<!--'.$str.'//-->';
        
        //replace double spaces with single space
        $str = trim($str);
-       $str = str_replace("  ", " ", $str);
+       $str = str_replace('  ', ' ', $str);
        
        //strip off day of week
-       $pos=strpos($str, " ");
-       if (!is_numeric(substr($str, 0, $pos))) $str = substr($str, $pos+1);
-
+       $pos = strpos($str, ' ');
+       if (!is_numeric(substr($str, 0, $pos))) {
+           $str = substr($str, $pos+1);
+    }
        //explode, take good parts
-       $a=explode(" ",$str);
-       //$month_a=array("Jan"=>1,"Feb"=>2,"Mar"=>3,"Apr"=>4,"May"=>5,"Jun"=>6,"Jul"=>7,"Aug"=>8,"Sep"=>9,"Oct"=>10,"Nov"=>11,"Dec"=>12);
-       $month_str=$a[1];
-       $month=$IMAP_MONTHS[$month_str];
-       $day=(int)$a[0];
-       $year=(int)$a[2];
-       $time=$a[3];
-       $tz_str = $a[4];
-       $tz = substr($tz_str, 0, 3);
-       $ta = explode(":",$time);
-       $hour=(int)$ta[0]-(int)$tz;
-       $minute=(int)$ta[1];
-       $second=(int)$ta[2];
+       $a = explode(' ', $str);
+
+       $month_str = $a[1];
+       $month     = $IMAP_MONTHS[$month_str];
+       $day       = (int)$a[0];
+       $year      = (int)$a[2];
+       $time      = $a[3];
+       $tz_str    = $a[4];
+       $tz        = substr($tz_str, 0, 3);
+       $ta        = explode(':', $time);
+       $hour      = (int)$ta[0]-(int)$tz;
+       $minute    = (int)$ta[1];
+       $second    = (int)$ta[2];
        
        //make UNIX timestamp
        $time2 = mktime($hour, $minute, $second, $month, $day, $year);
@@ -640,33 +784,45 @@ function iil_StrToTime($str){
        return $time2;
 }
 
-function iil_C_Sort(&$conn, $mailbox, $field, $add='', $is_uid=FALSE, $encoding='US-ASCII'){
+function iil_C_Sort(&$conn, $mailbox, $field, $add='', $is_uid=FALSE,
+    $encoding = 'US-ASCII') {
        /*  Do "SELECT" command */
-       if (!iil_C_Select($conn, $mailbox)) return false;
-       
+       if (!iil_C_Select($conn, $mailbox)) {
+           return false;
+       }
        $field = strtoupper($field);
-       if ($field=='INTERNALDATE') $field='ARRIVAL';
-       $fields = array('ARRIVAL'=>1,'CC'=>1,'DATE'=>1,'FROM'=>1,'SIZE'=>1,'SUBJECT'=>1,'TO'=>1);
-       
-       if (!$fields[$field])
-         return false;
+       if ($field == 'INTERNALDATE') {
+           $field = 'ARRIVAL';
+    }
+       $fields = array('ARRIVAL' => 1,'CC' => 1,'DATE' => 1,
+        'FROM' => 1, 'SIZE' => 1, 'SUBJECT' => 1, 'TO' => 1);
        
+       if (!$fields[$field]) {
+           return false;
+       }
+    
        $is_uid = $is_uid ? 'UID ' : '';
        
-       if (!empty($add))
-         $add = " $add";
+       if (!empty($add)) {
+           $add = " $add";
+    }
 
-       $fp = $conn->fp;
-       $command = 's '. $is_uid .'SORT ('.$field.') '.$encoding.' ALL'."$add\r\n";
-       $line = $data = '';
+       $fp       = $conn->fp;
+       $command  = 's ' . $is_uid . 'SORT (' . $field . ') ';
+    $command .= $encoding . ' ALL' . "$add\r\n";
+       $line     = $data = '';
        
-       if (!fputs($fp, $command)) return false;
-       do{
+       if (!fputs($fp, $command)) {
+           return false;
+    }
+       do {
                $line = chop(iil_ReadLine($fp, 1024));
-               if (iil_StartsWith($line, '* SORT')) $data.=($data?' ':'').substr($line,7);
-       }while($line[0]!='s');
+               if (iil_StartsWith($line, '* SORT')) {
+                   $data .= ($data?' ':'') . substr($line, 7);
+        }
+       } while ($line[0]!='s');
        
-       if (empty($data)){
+       if (empty($data)) {
                $conn->error = $line;
                return false;
        }
@@ -675,67 +831,81 @@ function iil_C_Sort(&$conn, $mailbox, $field, $add='', $is_uid=FALSE, $encoding=
        return $out;
 }
 
-function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field, $normalize=true){
+function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field,
+    $normalize=true) {
        global $IMAP_USE_INTERNAL_DATE;
        
        $c=0;
        $result=array();
        $fp = $conn->fp;
                
-       if (empty($index_field)) $index_field="DATE";
+       if (empty($index_field)) {
+           $index_field = 'DATE';
+    }
        $index_field = strtoupper($index_field);
        
        list($from_idx, $to_idx) = explode(':', $message_set);
-       if (empty($message_set) || (isset($to_idx) && (int)$from_idx > (int)$to_idx))
+       if (empty($message_set) || (isset($to_idx)
+        && (int)$from_idx > (int)$to_idx)) {
                return false;
+    }
        
-       //$fields_a["DATE"] = ($IMAP_USE_INTERNAL_DATE?6:1);
-       $fields_a['DATE'] = 1;
+       //$fields_a['DATE'] = ($IMAP_USE_INTERNAL_DATE?6:1);
+       $fields_a['DATE']         = 1;
        $fields_a['INTERNALDATE'] = 6;
-       $fields_a['FROM'] = 1;
-       $fields_a['REPLY-TO'] = 1;
-       $fields_a['SENDER'] = 1;
-       $fields_a['TO'] = 1;
-       $fields_a['SUBJECT'] = 1;
-       $fields_a['UID'] = 2;
-       $fields_a['SIZE'] = 2;
-       $fields_a['SEEN'] = 3;
-       $fields_a['RECENT'] = 4;
-       $fields_a['DELETED'] = 5;
+       $fields_a['FROM']         = 1;
+       $fields_a['REPLY-TO']     = 1;
+       $fields_a['SENDER']       = 1;
+       $fields_a['TO']           = 1;
+       $fields_a['SUBJECT']      = 1;
+       $fields_a['UID']          = 2;
+       $fields_a['SIZE']         = 2;
+       $fields_a['SEEN']         = 3;
+       $fields_a['RECENT']       = 4;
+       $fields_a['DELETED']      = 5;
        
        $mode=$fields_a[$index_field];
-       if (!($mode > 0)) return false;
-       
+       if (!($mode > 0)) {
+           return false;
+       }
+    
        /*  Do "SELECT" command */
-       if (!iil_C_Select($conn, $mailbox)) return false;
-               
+       if (!iil_C_Select($conn, $mailbox)) {
+           return false;
+    }
+    
        /* FETCH date,from,subject headers */
-       if ($mode==1){
-               $key="fhi".($c++);
-               $request=$key." FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)])\r\n";
-               if (!fputs($fp, $request)) return false;
-               do{
+       if ($mode == 1) {
+               $key     = 'fhi' . ($c++);
+               $request = $key . " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)])\r\n";
+               if (!fputs($fp, $request)) {
+                   return false;
+        }
+               do {
                        
                        $line=chop(iil_ReadLine($fp, 200));
-                       $a=explode(" ", $line);
-                       if (($line[0]=="*") && ($a[2]=="FETCH") && ($line[strlen($line)-1]!=")")){
+                       $a=explode(' ', $line);
+                       if (($line[0] == '*') && ($a[2] == 'FETCH')
+                && ($line[strlen($line)-1] != ')')) {
                                $id=$a[1];
 
                                $str=$line=chop(iil_ReadLine($fp, 300));
 
-                               while($line[0]!=")"){                                   //caution, this line works only in this particular case
+                               while ($line[0] != ')') {                                       //caution, this line works only in this particular case
                                        $line=chop(iil_ReadLine($fp, 300));
-                                       if ($line[0]!=")"){
-                                               if (ord($line[0]) <= 32)                      //continuation from previous header line
-                                                       $str.=" ".trim($line);
+                                       if ($line[0] != ')') {
+                                               if (ord($line[0]) <= 32) {                      //continuation from previous header line
+                                                       $str.= ' ' . trim($line);
                                                }
-                                               if ((ord($line[0]) > 32) || (strlen($line[0]) == 0)){
+                                               if ((ord($line[0]) > 32) || (strlen($line[0]) == 0)) {
                                                        list($field, $string) = iil_SplitHeaderLine($str);
-                                                       if (strcasecmp($field, "date")==0){
-                                                               $result[$id]=iil_StrToTime($string);
-                                                       }else{
-                                                               $result[$id] = str_replace("\"", "", $string);
-                                                               if ($normalize) $result[$id]=strtoupper($result[$id]);
+                                                       if (strcasecmp($field, 'date') == 0) {
+                                                               $result[$id] = iil_StrToTime($string);
+                                                       } else {
+                                                               $result[$id] = str_replace('"', '', $string);
+                                                               if ($normalize) {
+                                                                   $result[$id] = strtoupper($result[$id]);
+                                }
                                                        }
                                                        $str=$line;
                                                }
@@ -744,277 +914,349 @@ function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field, $n
                        }
                        /*
                        $end_pos = strlen($line)-1;
-                       if (($line[0]=="*") && ($a[2]=="FETCH") && ($line[$end_pos]=="}")){
+                       if (($line[0]=="*") && ($a[2]=="FETCH") && ($line[$end_pos]=="}")) {
                                $id = $a[1];
                                $pos = strrpos($line, "{")+1;
                                $bytes = (int)substr($line, $pos, $end_pos-$pos);
                                $received = 0;
-                               do{
-                                       $line = iil_ReadLine($fp, 0);
-                                       $received+=strlen($line);
-                                       $line = chop($line);
-                                       
-                                       if ($received>$bytes) break;
-                                       else if (!$line) continue;
+                               do {
+                                       $line      = iil_ReadLine($fp, 0);
+                                       $received += strlen($line);
+                                       $line      = chop($line);
                                        
-                                       list($field,$string)=explode(": ", $line);
+                                       if ($received>$bytes) {
+                        break;
+                                       } else if (!$line) {
+                        continue;
+                                       }
+
+                                       list($field, $string) = explode(': ', $line);
                                        
-                                       if (strcasecmp($field, "date")==0)
+                                       if (strcasecmp($field, 'date') == 0) {
                                                $result[$id] = iil_StrToTime($string);
-                                       else if ($index_field!="DATE")
-                                               $result[$id]=strtoupper(str_replace("\"", "", $string));
-                               }while($line[0]!=")");
-                       }else{
+                                       } else if ($index_field != 'DATE') {
+                                               $result[$id]=strtoupper(str_replace('"', '', $string));
+                    }
+                               } while ($line[0] != ')');
+                       } else {
                                //one line response, not expected so ignore                             
                        }
                        */
-               }while(!iil_StartsWith($line, $key));
-       }else if ($mode==6){
-               $key="fhi".($c++);
-               $request = $key." FETCH $message_set (INTERNALDATE)\r\n";
-               if (!fputs($fp, $request)) return false;
-               do{
+               } while (!iil_StartsWith($line, $key));
+
+       }else if ($mode == 6) {
+
+               $key     = 'fhi' . ($c++);
+               $request = $key . " FETCH $message_set (INTERNALDATE)\r\n";
+               if (!fputs($fp, $request)) {
+                   return false;
+        }
+               do {
                        $line=chop(iil_ReadLine($fp, 200));
-                       if ($line[0]=="*"){
-                               //original: "* 10 FETCH (INTERNALDATE "31-Jul-2002 09:18:02 -0500")"
-                               $paren_pos = strpos($line, "(");
-                               $foo = substr($line, 0, $paren_pos);
-                               $a = explode(" ", $foo);
-                               $id = $a[1];
+                       if ($line[0] == '*') {
+                               /*
+                                * original:
+                                * "* 10 FETCH (INTERNALDATE "31-Jul-2002 09:18:02 -0500")"
+                                */
+                               $paren_pos = strpos($line, '(');
+                               $foo       = substr($line, 0, $paren_pos);
+                               $a         = explode(' ', $foo);
+                               $id        = $a[1];
                                
-                               $open_pos = strpos($line, "\"") + 1;
-                               $close_pos = strrpos($line, "\"");
-                               if ($open_pos && $close_pos){
-                                       $len = $close_pos - $open_pos;
-                                       $time_str = substr($line, $open_pos, $len);
+                               $open_pos  = strpos($line, '"') + 1;
+                               $close_pos = strrpos($line, '"');
+                               if ($open_pos && $close_pos) {
+                                       $len         = $close_pos - $open_pos;
+                                       $time_str    = substr($line, $open_pos, $len);
                                        $result[$id] = strtotime($time_str);
                                }
-                       }else{
-                               $a = explode(" ", $line);
+                       } else {
+                               $a = explode(' ', $line);
                        }
-               }while(!iil_StartsWith($a[0], $key));
-       }else{
-               if ($mode >= 3) $field_name="FLAGS";
-               else if ($index_field=="SIZE") $field_name="RFC822.SIZE";
-               else $field_name=$index_field;
-
+               } while (!iil_StartsWith($a[0], $key));
+       } else {
+               if ($mode >= 3) {
+                   $field_name = 'FLAGS';
+               } else if ($index_field == 'SIZE') {
+                   $field_name = 'RFC822.SIZE';
+               } else {
+                   $field_name = $index_field;
+        }
+        
                /*                      FETCH uid, size, flags          */
-               $key="fhi".($c++);
-               $request=$key." FETCH $message_set ($field_name)\r\n";
+               $key     = 'fhi' .($c++);
+               $request = $key . " FETCH $message_set ($field_name)\r\n";
 
-               if (!fputs($fp, $request)) return false;
-               do{
+               if (!fputs($fp, $request)) {
+                   return false;
+        }
+               do {
                        $line=chop(iil_ReadLine($fp, 200));
-                       $a = explode(" ", $line);
-                       if (($line[0]=="*") && ($a[2]=="FETCH")){
-                               $line=str_replace("(", "", $line);
-                               $line=str_replace(")", "", $line);
-                               $a=explode(" ", $line);
+                       $a = explode(' ', $line);
+                       if (($line[0] == '*') && ($a[2] == 'FETCH')) {
+                               $line = str_replace('(', '', $line);
+                               $line = str_replace(')', '', $line);
+                               $a    = explode(' ', $line);
                                
-                               $id=$a[1];
+                               $id = $a[1];
 
-                               if (isset($result[$id])) continue; //if we already got the data, skip forward
-                               if ($a[3]!=$field_name) continue;  //make sure it's returning what we requested
-                       
+                               if (isset($result[$id])) {
+                                   continue; //if we already got the data, skip forward
+                               }
+                if ($a[3]!=$field_name) {
+                    continue;  //make sure it's returning what we requested
+                           }
+                
                                /*  Caution, bad assumptions, next several lines */
-                               if ($mode==2) $result[$id]=$a[4];
-                               else{
-                                       $haystack=strtoupper($line);
-                                       $result[$id]=(strpos($haystack, $index_field) > 0 ? "F" : "N");
+                               if ($mode == 2) {
+                                   $result[$id] = $a[4];
+                               } else {
+                                       $haystack    = strtoupper($line);
+                                       $result[$id] = (strpos($haystack, $index_field) > 0 ? "F" : "N");
                                }
                        }
-               }while(!iil_StartsWith($line, $key));
+               } while (!iil_StartsWith($line, $key));
        }
 
        //check number of elements...
-       list($start_mid,$end_mid)=explode(':',$message_set);
-       if (is_numeric($start_mid) && is_numeric($end_mid)){
+       list($start_mid, $end_mid) = explode(':', $message_set);
+       if (is_numeric($start_mid) && is_numeric($end_mid)) {
                //count how many we should have
                $should_have = $end_mid - $start_mid +1;
                
                //if we have less, try and fill in the "gaps"
-               if (count($result)<$should_have){
-                       for($i=$start_mid;$i<=$end_mid;$i++) if (!isset($result[$i])) $result[$i] = '';
+               if (count($result) < $should_have) {
+                       for ($i=$start_mid; $i<=$end_mid; $i++) {
+                           if (!isset($result[$i])) {
+                               $result[$i] = '';
+                }
+            }
                }
        }
-       
        return $result; 
-
 }
 
-function iil_CompressMessageSet($message_set){
+function iil_CompressMessageSet($message_set) {
        //given a comma delimited list of independent mid's, 
        //compresses by grouping sequences together
        
        //if less than 255 bytes long, let's not bother
-       if (strlen($message_set)<255) return $message_set;
-       
+       if (strlen($message_set)<255) {
+           return $message_set;
+       }
+    
        //see if it's already been compress
-       if (strpos($message_set,':')!==false) return $message_set;
-       
+       if (strpos($message_set, ':') !== false) {
+           return $message_set;
+       }
+    
        //separate, then sort
-       $ids = explode(',',$message_set);
+       $ids = explode(',', $message_set);
        sort($ids);
        
        $result = array();
-       $start = $prev = $ids[0];
-       foreach($ids as $id){
+       $start  = $prev = $ids[0];
+
+       foreach ($ids as $id) {
                $incr = $id - $prev;
-               if ($incr>1){                   //found a gap
-                       if ($start==$prev) $result[] = $prev;   //push single id
-                       else $result[] = $start.':'.$prev;              //push sequence as start_id:end_id
-                       $start = $id;                                                   //start of new sequence
+               if ($incr > 1) {                        //found a gap
+                       if ($start == $prev) {
+                           $result[] = $prev;  //push single id
+                       } else {
+                           $result[] = $start . ':' . $prev;   //push sequence as start_id:end_id
+                       }
+            $start = $id;                                                      //start of new sequence
                }
                $prev = $id;
        }
        //handle the last sequence/id
-       if ($start==$prev) $result[] = $prev;
-       else $result[] = $start.':'.$prev;
-
+       if ($start==$prev) {
+           $result[] = $prev;
+    } else {
+        $result[] = $start.':'.$prev;
+    }
+    
        //return as comma separated string
-       return implode(',',$result);
+       return implode(',', $result);
 }
 
-function iil_C_UIDsToMIDs(&$conn, $mailbox, $uids){
-       if (!is_array($uids) || count($uids)==0) return array();
-       return iil_C_Search($conn, $mailbox, "UID ".implode(",", $uids));
+function iil_C_UIDsToMIDs(&$conn, $mailbox, $uids) {
+       if (!is_array($uids) || count($uids) == 0) {
+           return array();
+    }
+       return iil_C_Search($conn, $mailbox, 'UID ' . implode(',', $uids));
 }
 
-function iil_C_UIDToMID(&$conn, $mailbox, $uid){
+function iil_C_UIDToMID(&$conn, $mailbox, $uid) {
        $result = iil_C_UIDsToMIDs($conn, $mailbox, array($uid));
-       if (count($result)==1) return $result[0];
-       else return false;
+       if (count($result) == 1) {
+           return $result[0];
+       }
+    return false;
 }
 
-function iil_C_FetchUIDs(&$conn,$mailbox){
+function iil_C_FetchUIDs(&$conn,$mailbox) {
        global $clock;
        
        $num = iil_C_CountMessages($conn, $mailbox);
-       if ($num==0) return array();
-       $message_set = '1'.($num>1?':'.$num:'');
+       if ($num == 0) {
+           return array();
+    }
+       $message_set = '1' . ($num>1?':' . $num:'');
        
        //if cache not enabled, just call iil_C_FetchHeaderIndex on 'UID' field
        if (!$conn->do_cache)
                return iil_C_FetchHeaderIndex($conn, $mailbox, $message_set, 'UID');
 
        //otherwise, let's check cache first
-       $key = $mailbox.'.uids';
+       $key        = $mailbox.'.uids';
        $cache_good = true;
-       if ($conn->uid_cache) $data = $conn->uid_cache;
-       else $data = cache_read($conn->user, $conn->host, $key);
-       
+       if ($conn->uid_cache) {
+           $data = $conn->uid_cache;
+       } else {
+           $data = cache_read($conn->user, $conn->host, $key);
+       }
+    
        //was anything cached at all?
-       if ($data===false) $cache_good = -1;
-       
+       if ($data === false) {
+           $cache_good = -1;
+       }
+    
        //make sure number of messages were the same
-       if ($cache_good>0 && $data['n']!=$num) $cache_good = -2;
-       
+       if ($cache_good > 0 && $data['n'] != $num) {
+           $cache_good = -2;
+       }
+    
        //if everything's okay so far...
-       if ($cache_good>0){
+       if ($cache_good > 0) {
                //check UIDs of highest mid with current and cached
-               $temp = iil_C_Search($conn, $mailbox, 'UID '.$data['d'][$num]);
-               if (!$temp || !is_array($temp) || $temp[0]!=$num) $cache_good=-3;
+               $temp = iil_C_Search($conn, $mailbox, 'UID ' . $data['d'][$num]);
+               if (!$temp || !is_array($temp) || $temp[0] != $num) {
+                   $cache_good = -3;
+        }
        }
 
        //if cached data's good, return it
-       if ($cache_good>0){
+       if ($cache_good > 0) {
                return $data['d'];
        }
 
        //otherwise, we need to fetch it
-       $data = array('n'=>$num,'d'=>array());
+       $data      = array('n' => $num, 'd' => array());
        $data['d'] = iil_C_FetchHeaderIndex($conn, $mailbox, $message_set, 'UID');
+    
        cache_write($conn->user, $conn->host, $key, $data);
        $conn->uid_cache = $data;
        return $data['d'];
 }
 
-function iil_SortThreadHeaders($headers, $index_a, $uids){
+function iil_SortThreadHeaders($headers, $index_a, $uids) {
        asort($index_a);
        $result = array();
-       foreach($index_a as $mid=>$foobar){
+       foreach ($index_a as $mid=>$foobar) {
                $uid = $uids[$mid];
                $result[$uid] = $headers[$uid];
        }
        return $result;
 }
 
-function iil_C_FetchThreadHeaders(&$conn, $mailbox, $message_set){
+function iil_C_FetchThreadHeaders(&$conn, $mailbox, $message_set) {
        global $clock;
        global $index_a;
        
        list($from_idx, $to_idx) = explode(':', $message_set);
-       if (empty($message_set) || (isset($to_idx) && (int)$from_idx > (int)$to_idx))
+       if (empty($message_set) || (isset($to_idx)
+        && (int)$from_idx > (int)$to_idx)) {
                return false;
+    }
 
        $result = array();
-       $uids = iil_C_FetchUIDs($conn, $mailbox);
-       $debug = false;
+       $uids   = iil_C_FetchUIDs($conn, $mailbox);
+       $debug  = false;
        
        /* Get cached records where possible */
-       if ($conn->do_cache){
+       if ($conn->do_cache) {
                $cached = cache_read($conn->user, $conn->host, $mailbox.'.thhd');
-               if ($cached && is_array($uids) && count($uids)>0){
-                       $needed_set = "";
-                       foreach($uids as $id=>$uid){
-                               if ($cached[$uid]){
-                                       $result[$uid] = $cached[$uid];
+               if ($cached && is_array($uids) && count($uids)>0) {
+                       $needed_set = '';
+                       foreach ($uids as $id=>$uid) {
+                               if ($cached[$uid]) {
+                                       $result[$uid]     = $cached[$uid];
                                        $result[$uid]->id = $id;
-                               }else $needed_set.=($needed_set?",":"").$id;
+                               } else {
+                                   $needed_set .= ($needed_set ? ',' : '') . $id;
+                }
                        }
-                       if ($needed_set) $message_set = $needed_set;
-                       else $message_set = '';
+                       if ($needed_set) {
+                           $message_set = $needed_set;
+                       } else {
+                           $message_set = '';
+            }
                }
        }
        $message_set = iil_CompressMessageSet($message_set);
-       if ($debug) echo "Still need: ".$message_set;
-       
+       if ($debug) {
+           echo "Still need: ".$message_set;
+       }
+    
        /* if we're missing any, get them */
-       if ($message_set){
+       if ($message_set) {
                /* FETCH date,from,subject headers */
-               $key="fh";
-               $fp = $conn->fp;
-               $request=$key." FETCH $message_set (BODY.PEEK[HEADER.FIELDS (SUBJECT MESSAGE-ID IN-REPLY-TO)])\r\n";
-               $mid_to_id = array();
-               if (!fputs($fp, $request)) return false;
-               do{
+               $key        = 'fh';
+               $fp         = $conn->fp;
+               $request    = $key . " FETCH $message_set ";
+        $request   .= "(BODY.PEEK[HEADER.FIELDS (SUBJECT MESSAGE-ID IN-REPLY-TO)])\r\n";
+               $mid_to_id  = array();
+               if (!fputs($fp, $request)) {
+                   return false;
+        }
+               do {
                        $line = chop(iil_ReadLine($fp, 1024));
-                       if ($debug) echo $line."\n";
-                       if (ereg('\{[0-9]+\}$', $line)){
-                               $a = explode(" ", $line);
+                       if ($debug) {
+                           echo $line . "\n";
+            }
+                       if (ereg('\{[0-9]+\}$', $line)) {
+                               $a       = explode(' ', $line);
                                $new = array();
 
                                $new_thhd = new iilThreadHeader;
                                $new_thhd->id = $a[1];
-                               do{
-                                       $line=chop(iil_ReadLine($fp, 1024),"\r\n");
-                                       if (iil_StartsWithI($line,'Message-ID:') || (iil_StartsWithI($line,'In-Reply-To:')) || (iil_StartsWithI($line,'SUBJECT:'))){
-                                               $pos = strpos($line, ":");
+                               do {
+                                       $line = chop(iil_ReadLine($fp, 1024), "\r\n");
+                                       if (iil_StartsWithI($line, 'Message-ID:')
+                        || (iil_StartsWithI($line,'In-Reply-To:'))
+                        || (iil_StartsWithI($line,'SUBJECT:'))) {
+
+                                               $pos        = strpos($line, ':');
                                                $field_name = substr($line, 0, $pos);
-                                               $field_val = substr($line, $pos+1);
+                                               $field_val  = substr($line, $pos+1);
+
                                                $new[strtoupper($field_name)] = trim($field_val);
-                                       }else if (ereg('^[[:space:]]', $line)){
-                                               $new[strtoupper($field_name)].= trim($line);
+
+                                       } else if (ereg('^[[:space:]]', $line)) {
+                                               $new[strtoupper($field_name)] .= trim($line);
                                        }
-                               }while($line[0]!=')');
+                               } while ($line[0] != ')');
+                
                                $new_thhd->sbj = $new['SUBJECT'];
                                $new_thhd->mid = substr($new['MESSAGE-ID'], 1, -1);
                                $new_thhd->irt = substr($new['IN-REPLY-TO'], 1, -1);
                                
                                $result[$uids[$new_thhd->id]] = $new_thhd;
                        }
-               }while(!iil_StartsWith($line, "fh"));
+               } while (!iil_StartsWith($line, 'fh'));
        }
        
        /* sort headers */
-       if (is_array($index_a)){
+       if (is_array($index_a)) {
                $result = iil_SortThreadHeaders($result, $index_a, $uids);      
        }
        
        /* write new set to cache */
-       if ($conn->do_cache){
-               if (count($result)!=count($cached))
-                       cache_write($conn->user, $conn->host, $mailbox.'.thhd', $result);               
+       if ($conn->do_cache) {
+               if (count($result)!=count($cached)) {
+                       cache_write($conn->user, $conn->host, $mailbox . '.thhd', $result);
+        }
        }
        
        //echo 'iil_FetchThreadHeaders:'."\n";
@@ -1023,129 +1265,165 @@ function iil_C_FetchThreadHeaders(&$conn, $mailbox, $message_set){
        return $result;
 }
 
-function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock){
+function iil_C_BuildThreads2(&$conn, $mailbox, $message_set, &$clock) {
        global $index_a;
 
        list($from_idx, $to_idx) = explode(':', $message_set);
-       if (empty($message_set) || (isset($to_idx) && (int)$from_idx > (int)$to_idx))
+       if (empty($message_set) || (isset($to_idx)
+        && (int)$from_idx > (int)$to_idx)) {
                return false;
-       
-       $result=array();
-       $roots=array();
+       }
+    
+       $result    = array();
+       $roots     = array();
        $root_mids = array();
-       $sub_mids = array();
-       $strays = array();
-       $messages = array();
-       $fp = $conn->fp;
-       $debug = false;
+       $sub_mids  = array();
+       $strays    = array();
+       $messages  = array();
+       $fp        = $conn->fp;
+       $debug     = false;
        
        $sbj_filter_pat = '[a-zA-Z]{2,3}(\[[0-9]*\])?:([[:space:]]*)';
        
        /*  Do "SELECT" command */
-       if (!iil_C_Select($conn, $mailbox)) return false;
-
+       if (!iil_C_Select($conn, $mailbox)) {
+           return false;
+    }
+    
        /* FETCH date,from,subject headers */
        $mid_to_id = array();
-       $messages = array();
-       $headers = iil_C_FetchThreadHeaders($conn, $mailbox, $message_set);
-       if ($clock) $clock->register('fetched headers');
-       
-       if ($debug) print_r($headers);
-       
+       $messages  = array();
+       $headers   = iil_C_FetchThreadHeaders($conn, $mailbox, $message_set);
+       if ($clock) {
+           $clock->register('fetched headers');
+       }
+    
+       if ($debug) {
+           print_r($headers);
+       }
+    
        /* go through header records */
-       foreach($headers as $header){
+       foreach ($headers as $header) {
                //$id = $header['i'];
                //$new = array('id'=>$id, 'MESSAGE-ID'=>$header['m'], 
                //                      'IN-REPLY-TO'=>$header['r'], 'SUBJECT'=>$header['s']);
-               $id = $header->id;
-               $new = array('id'=>$id, 'MESSAGE-ID'=>$header->mid, 
-                                       'IN-REPLY-TO'=>$header->irt, 'SUBJECT'=>$header->sbj);
+               $id  = $header->id;
+               $new = array('id' => $id, 'MESSAGE-ID' => $header->mid, 
+            'IN-REPLY-TO' => $header->irt, 'SUBJECT' => $header->sbj);
 
                /* add to message-id -> mid lookup table */
                $mid_to_id[$new['MESSAGE-ID']] = $id;
                
                /* if no subject, use message-id */
-               if (empty($new['SUBJECT'])) $new['SUBJECT'] = $new['MESSAGE-ID'];
-               
+               if (empty($new['SUBJECT'])) {
+                   $new['SUBJECT'] = $new['MESSAGE-ID'];
+               }
+        
                /* if subject contains 'RE:' or has in-reply-to header, it's a reply */
                $sbj_pre ='';
                $has_re = false;
-               if (eregi($sbj_filter_pat, $new['SUBJECT'])) $has_re = true;
-               if ($has_re||$new['IN-REPLY-TO']) $sbj_pre = 'RE:';
-               
+               if (eregi($sbj_filter_pat, $new['SUBJECT'])) {
+                   $has_re = true;
+               }
+        if ($has_re||$new['IN-REPLY-TO']) {
+            $sbj_pre = 'RE:';
+               }
+        
                /* strip out 're:', 'fw:' etc */
-               if ($has_re) $sbj = ereg_replace($sbj_filter_pat,'', $new['SUBJECT']);
-               else $sbj = $new['SUBJECT'];
-               $new['SUBJECT'] = $sbj_pre.$sbj;
+               if ($has_re) {
+                   $sbj = ereg_replace($sbj_filter_pat, '', $new['SUBJECT']);
+               } else {
+                   $sbj = $new['SUBJECT'];
+               }
+        $new['SUBJECT'] = $sbj_pre.$sbj;
                
                
                /* if subject not a known thread-root, add to list */
-               if ($debug) echo $id.' '.$new['SUBJECT']."\t".$new['MESSAGE-ID']."\n";
-               $root_id = $roots[$sbj];
+               if ($debug) {
+                   echo $id . ' ' . $new['SUBJECT'] . "\t" . $new['MESSAGE-ID'] . "\n";
+               }
+        $root_id = $roots[$sbj];
                
-               if ($root_id && ($has_re || !$root_in_root[$root_id])){
-                       if ($debug) echo "\tfound root: $root_id\n";
-                       $sub_mids[$new['MESSAGE-ID']] = $root_id;
-                       $result[$root_id][] = $id;
-               }else if (!isset($roots[$sbj])||(!$has_re&&$root_in_root[$root_id])){
+               if ($root_id && ($has_re || !$root_in_root[$root_id])) {
+                       if ($debug) {
+                           echo "\tfound root: $root_id\n";
+                       }
+            $sub_mids[$new['MESSAGE-ID']] = $root_id;
+                       $result[$root_id][]           = $id;
+               }else if (!isset($roots[$sbj]) || (!$has_re && $root_in_root[$root_id])) {
                        /* try to use In-Reply-To header to find root 
                                unless subject contains 'Re:' */
-                       if ($has_re&&$new['IN-REPLY-TO']){
-                               if ($debug) echo "\tlooking: ".$new['IN-REPLY-TO']."\n";
-                               
+                       if ($has_re&&$new['IN-REPLY-TO']) {
+                               if ($debug) {
+                                   echo "\tlooking: ".$new['IN-REPLY-TO']."\n";
+                               }
                                //reply to known message?
                                $temp = $sub_mids[$new['IN-REPLY-TO']];
                                
-                               if ($temp){
+                               if ($temp) {
                                        //found it, root:=parent's root
-                                       if ($debug) echo "\tfound parent: ".$new['SUBJECT']."\n";
-                                       $result[$temp][] = $id;
+                                       if ($debug) {
+                                           echo "\tfound parent: ".$new['SUBJECT']."\n";
+                                       }
+                    $result[$temp][]              = $id;
                                        $sub_mids[$new['MESSAGE-ID']] = $temp;
-                                       $sbj = '';
-                               }else{
+                                       $sbj                          = '';
+                               } else {
                                        //if we can't find referenced parent, it's a "stray"
                                        $strays[$id] = $new['IN-REPLY-TO'];
                                }
                        }
                        
                        //add subject as root
-                       if ($sbj){
-                               if ($debug) echo "\t added to root\n";
-                               $roots[$sbj] = $id;
-                               $root_in_root[$id] = !$has_re;
+                       if ($sbj) {
+                               if ($debug) {
+                                   echo "\t added to root\n";
+                               }
+                $roots[$sbj]                  = $id;
+                               $root_in_root[$id]            = !$has_re;
                                $sub_mids[$new['MESSAGE-ID']] = $id;
-                               $result[$id] = array($id);
+                               $result[$id]                  = array($id);
                        }
-                       if ($debug) echo $new['MESSAGE-ID']."\t".$sbj."\n";
+                       if ($debug) {
+                           echo $new['MESSAGE-ID'] . "\t" . $sbj . "\n";
+            }
                }
                        
        }
        
        //now that we've gone through all the messages,
        //go back and try and link up the stray threads
-       if (count($strays)>0){
-               foreach($strays as $id=>$irt){
+       if (count($strays) > 0) {
+               foreach ($strays as $id=>$irt) {
                        $root_id = $sub_mids[$irt];
-                       if (!$root_id || $root_id==$id) continue;
-                       $result[$root_id] = array_merge($result[$root_id],$result[$id]);
+                       if (!$root_id || $root_id==$id) {
+                           continue;
+                       }
+            $result[$root_id] = array_merge($result[$root_id],$result[$id]);
                        unset($result[$id]);
                }
        }
        
-       if ($clock) $clock->register('data prepped');
-       
-       if ($debug) print_r($roots);
-       //print_r($result);
+       if ($clock) {
+           $clock->register('data prepped');
+       }
+    
+       if ($debug) {
+           print_r($roots);
+       }
+    //print_r($result);
        return $result;
 }
 
 
-function iil_SortThreads(&$tree, $index, $sort_order='ASC'){
-       if (!is_array($tree) || !is_array($index)) return false;
-
+function iil_SortThreads(&$tree, $index, $sort_order = 'ASC') {
+       if (!is_array($tree) || !is_array($index)) {
+           return false;
+    }
+    
        //create an id to position lookup table
        $i = 0;
-       foreach($index as $id=>$val){
+       foreach ($index as $id=>$val) {
                $i++;
                $index[$id] = $i;
        }
@@ -1153,19 +1431,21 @@ function iil_SortThreads(&$tree, $index, $sort_order='ASC'){
        
        //for each tree, set array key to position
        $itree = array();
-       foreach($tree as $id=>$node){
-               if (count($tree[$id])<=1){
+       foreach ($tree as $id=>$node) {
+               if (count($tree[$id])<=1) {
                        //for "threads" with only one message, key is position of that message
-                       $n = $index[$id];
+                       $n         = $index[$id];
                        $itree[$n] = array($n=>$id);
-               }else{
+               } else {
                        //for "threads" with multiple messages, 
-                       $min = $max;
+                       $min   = $max;
                        $new_a = array();
-                       foreach($tree[$id] as $mid){
+                       foreach ($tree[$id] as $mid) {
                                $new_a[$index[$mid]] = $mid;            //create new sub-array mapping position to id
-                               $pos = $index[$mid];
-                               if ($pos&&$pos<$min) $min = $index[$mid];       //find smallest position
+                               $pos                 = $index[$mid];
+                               if ($pos&&$pos<$min) {
+                                   $min = $index[$mid];        //find smallest position
+                               }
                        }
                        $n = $min;      //smallest position of child is thread position
                        
@@ -1179,9 +1459,9 @@ function iil_SortThreads(&$tree, $index, $sort_order='ASC'){
        
        //sort by key, this basically sorts all threads
        ksort($itree);
-       $i=0;
-       $out=array();
-       foreach($itree as $k=>$node){
+       $i   = 0;
+       $out = array();
+       foreach ($itree as $k=>$node) {
                $out[$i] = $itree[$k];
                $i++;
        }
@@ -1190,149 +1470,220 @@ function iil_SortThreads(&$tree, $index, $sort_order='ASC'){
        return $out;
 }
 
-function iil_IndexThreads(&$tree){
+function iil_IndexThreads(&$tree) {
        /* creates array mapping mid to thread id */
        
-       if (!is_array($tree)) return false;
-       
+       if (!is_array($tree)) {
+           return false;
+       }
+    
        $t_index = array();
-       foreach($tree as $pos=>$kids){
-               foreach($kids as $kid) $t_index[$kid] = $pos;
+       foreach ($tree as $pos=>$kids) {
+               foreach ($kids as $kid) $t_index[$kid] = $pos;
        }
        
        return $t_index;
 }
 
-function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false){
+function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false)
+{
        global $IMAP_USE_INTERNAL_DATE;
        
-       $c=0;
-       $result=array();
-       $fp = $conn->fp;
+       $c      = 0;
+       $result = array();
+       $fp     = $conn->fp;
        
        list($from_idx, $to_idx) = explode(':', $message_set);
-       if (empty($message_set) || (isset($to_idx) && (int)$from_idx > (int)$to_idx))
+       if (empty($message_set) || (isset($to_idx)
+               && (int)$from_idx > (int)$to_idx)) {
                return false;
+       }
                
        /*  Do "SELECT" command */
-       if (!iil_C_Select($conn, $mailbox)){
+       if (!iil_C_Select($conn, $mailbox)) {
                $conn->error = "Couldn't select $mailbox";
                return false;
        }
                
        /* Get cached records where possible */
-       if ($conn->do_cache){
+       if ($conn->do_cache) {
                $uids = iil_C_FetchHeaderIndex($conn, $mailbox, $message_set, "UID");
-               if (is_array($uids) && count($conn->cache[$mailbox]>0)){
-                       $needed_set = "";
-                       while(list($id,$uid)=each($uids)){
-                               if ($conn->cache[$mailbox][$uid]){
-                                       $result[$id] = $conn->cache[$mailbox][$uid];
+               if (is_array($uids) && count($conn->cache[$mailbox]>0)) {
+                       $needed_set = '';
+                       while (list($id,$uid)=each($uids)) {
+                               if ($conn->cache[$mailbox][$uid]) {
+                                       $result[$id]     = $conn->cache[$mailbox][$uid];
                                        $result[$id]->id = $id;
-                               }else $needed_set.=($needed_set?",":"").$id;
+                               } else {
+                                   $needed_set.=($needed_set ? ',': '') . $id;
+                               }
                        }
                        //echo "<!-- iil_C_FetchHeader\nMessage Set: $message_set\nNeeded Set:$needed_set\n//-->\n";
-                       if ($needed_set) $message_set = iil_CompressMessageSet($needed_set);
-                       else return $result;
+                       if ($needed_set) {
+                               $message_set = iil_CompressMessageSet($needed_set);
+                       } else {
+                               return $result;
+                       }
                }
        }
 
        /* FETCH date,from,subject headers */
-       $key="fh".($c++);
-       $prefix=$uidfetch?" UID":"";
-       $request=$key.$prefix." FETCH $message_set (BODY.PEEK[HEADER.FIELDS (DATE FROM TO SUBJECT REPLY-TO IN-REPLY-TO CC BCC CONTENT-TRANSFER-ENCODING CONTENT-TYPE MESSAGE-ID REFERENCE)])\r\n";
-
-       if (!fputs($fp, $request)) return false;
-       do{
-               $line=chop(iil_ReadLine($fp, 200));
-               $a=explode(" ", $line);
-               if (($line[0]=="*") && ($a[2]=="FETCH")){
-                       $id=$a[1];
-                       $result[$id]=new iilBasicHeader;
-                       $result[$id]->id = $id;
-                       $result[$id]->subject = "";
+       $key      = 'fh' . ($c++);
+       $prefix   = $uidfetch?' UID':'';
+       $request  = $key . $prefix;
+       $request .= " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ";
+       $request .= "(DATE FROM TO SUBJECT REPLY-TO IN-REPLY-TO CC BCC ";
+       $request .= "CONTENT-TRANSFER-ENCODING CONTENT-TYPE MESSAGE-ID ";
+       $request .= "REFERENCES DISPOSITION-NOTIFICATION-TO X-PRIORITY)])\r\n";
+
+       if (!fputs($fp, $request)) {
+               return false;
+       }
+       do {
+               $line = chop(iil_ReadLine($fp, 200));
+               $a    = explode(' ', $line);
+               if (($line[0] == '*') && ($a[2] == 'FETCH')) {
+                       $id = $a[1];
+            
+                       $result[$id]            = new iilBasicHeader;
+                       $result[$id]->id        = $id;
+                       $result[$id]->subject   = '';
+                       $result[$id]->messageID = 'mid:' . $id;
+
                        /*
                                Start parsing headers.  The problem is, some header "lines" take up multiple lines.
                                So, we'll read ahead, and if the one we're reading now is a valid header, we'll
                                process the previous line.  Otherwise, we'll keep adding the strings until we come
                                to the next valid header line.
                        */
-                       $i = 0;
+                       $i     = 0;
                        $lines = array();
-                       do{
-                               $line = chop(iil_ReadLine($fp, 300),"\r\n");
-                               if (ord($line[0])<=32) $lines[$i].=(empty($lines[$i])?"":"\n").trim(chop($line));
-                               else{
+                       do {
+                               $line = chop(iil_ReadLine($fp, 300), "\r\n");
+                               if (ord($line[0])<=32) {
+                                   $lines[$i] .= (empty($lines[$i])?'':"\n").trim(chop($line));
+                               } else {
                                        $i++;
                                        $lines[$i] = trim(chop($line));
                                }
-                       }while($line[0]!=")" && strncmp($line, $key, strlen($key)));  // patch from "Maksim Rubis" <siburny@hotmail.com>
-                       
-            if(strncmp($line, $key, strlen($key)))
-            { 
-                       //process header, fill iilBasicHeader obj.
-                       //      initialize
-                       if (is_array($headers)){
-                               reset($headers);
-                               while ( list($k, $bar) = each($headers) ) $headers[$k] = "";
-                       }
-
-                       //      create array with header field:data
-                       $headers = array();
-                       while ( list($lines_key, $str) = each($lines) ){
-                               list($field, $string) = iil_SplitHeaderLine($str);
-                               $field = strtolower($field);
-                               $headers[$field] = $string;
-                       }
-                       $result[$id]->date = $headers["date"];
-                       $result[$id]->timestamp = iil_StrToTime($headers["date"]);
-                       $result[$id]->from = $headers["from"];
-                       $result[$id]->to = str_replace("\n", " ", $headers["to"]);
-                       $result[$id]->subject = str_replace("\n", "", $headers["subject"]);
-                       $result[$id]->replyto = str_replace("\n", " ", $headers["reply-to"]);
-                       $result[$id]->cc = str_replace("\n", " ", $headers["cc"]);
-                       $result[$id]->bcc = str_replace("\n", " ", $headers["bcc"]);
-                       $result[$id]->encoding = str_replace("\n", " ", $headers["content-transfer-encoding"]);
-                       $result[$id]->ctype = str_replace("\n", " ", $headers["content-type"]);
-                       $result[$id]->in_reply_to = ereg_replace("[\n<>]",'', $headers['in-reply-to']);
-                       $result[$id]->reference = $headers["reference"];
+                               /* 
+                                       The preg_match below works around communigate imap, which outputs " UID <number>)".
+                                       Without this, the while statement continues on and gets the "fh0 OK completed" message.
+                                       If this loop gets the ending message, then the outer loop does not receive it from radline on line 1249.  
+                                       This in causes the if statement on line 1278 to never be true, which causes the headers to end up missing
+                                       If the if statement was changed to pick up the fh0 from this loop, then it causes the outer loop to spin
+                                       An alternative might be:
+                                       if (!preg_match("/:/",$line) && preg_match("/\)$/",$line)) break;
+                                       however, unsure how well this would work with all imap clients.
+                               */
+                               if (preg_match("/^\s*UID [0-9]+\)$/", $line)) {
+                                   break;
+                               }
+                       // patch from "Maksim Rubis" <siburny@hotmail.com>
+                       } while (trim($line[0]) != ')' && strncmp($line, $key, strlen($key)));
                        
-                       list($result[$id]->ctype, $ctype_add) = explode(";", $headers["content-type"]);
-
-                       if (preg_match('/charset="?([a-z0-9\-]+)"?/i', $ctype_add, $regs))
-                               $result[$id]->charset = $regs[1];
-
-                       $messageID = $headers["message-id"];
-                       if (!$messageID) "mid:".$id;
-                       $result[$id]->messageID = $messageID;
+                       if (strncmp($line, $key, strlen($key))) { 
+                               //process header, fill iilBasicHeader obj.
+                               //      initialize
+                               if (is_array($headers)) {
+                                       reset($headers);
+                                       while (list($k, $bar) = each($headers)) {
+                                               $headers[$k] = '';
+                                       }
+                               }
+       
+                               //      create array with header field:data
+                               while ( list($lines_key, $str) = each($lines) ) {
+                                       list($field, $string) = iil_SplitHeaderLine($str);
+                                       
+                                       $field = strtolower($field);
+                                       
+                                       switch ($field) {
+                                       case 'date';
+                                               $result[$id]->date = $string;
+                                               $result[$id]->timestamp = iil_StrToTime($string);
+                                               break;
+                                       case 'from':
+                                               $result[$id]->from = $string;
+                                               break;
+                                       case 'to':
+                                               $result[$id]->to = str_replace("\n", " ", $string);
+                                               break;
+                                       case 'subject':
+                                               $result[$id]->subject = str_replace("\n", '', $string);
+                                               break;
+                                       case 'reply-to':
+                                               $result[$id]->replyto = str_replace("\n", " ", $string);
+                                               break;
+                                       case 'cc':
+                                               $result[$id]->cc = str_replace("\n", " ", $string);
+                                               break;
+                                       case 'bcc':
+                                               $result[$id]->bcc = str_replace("\n", " ", $string);
+                                               break;
+                                       case 'content-transfer-encoding':
+                                               $result[$id]->encoding = str_replace("\n", " ", $string);
+                                               break;
+                                       case 'content-type':
+                                               $ctype_parts = explode(";", $string);
+                                               $result[$id]->ctype = array_shift($ctype_parts);
+                                               foreach ($ctype_parts as $ctype_add) {
+                                                       if (preg_match('/charset="?([a-z0-9\-\.\_]+)"?/i',
+                                                               $ctype_add, $regs)) {
+                                                               $result[$id]->charset = $regs[1];
+                                                       }
+                                               }
+                                               break;
+                                       case 'in-reply-to':
+                                               $result[$id]->in_reply_to = ereg_replace("[\n<>]", '', $string);
+                                               break;
+                                       case 'references':
+                                               $result[$id]->references = $string;
+                                               break;
+                                       case 'return-receipt-to':
+                                       case 'disposition-notification-to':
+                                       case 'x-confirm-reading-to':
+                                               $result[$id]->mdn_to = str_replace("\n", " ", $string);
+                                               break;
+                                       case 'message-id':
+                                               $result[$id]->messageID = $string;
+                                               break;
+                                       case 'x-priority':
+                                               if (preg_match('/^(\d+)/', $string, $matches))
+                                                       $result[$id]->priority = intval($matches[1]);
+                                               break;
+                                       } // end switch ()
+                               } // end while ()
+                       } else {
+                               $a = explode(' ', $line);
                        }
-            else {
-            $a=explode(" ", $line);
-            } 
-                       
                }
-       }while(strcmp($a[0], $key)!=0);
-               
+       } while (strcmp($a[0], $key) != 0);
+
        /* 
                FETCH uid, size, flags
                Sample reply line: "* 3 FETCH (UID 2417 RFC822.SIZE 2730 FLAGS (\Seen \Deleted))"
        */
-       $command_key="fh".($c++);
-       $request= $command_key.$prefix." FETCH $message_set (UID RFC822.SIZE FLAGS INTERNALDATE)\r\n";
-       if (!fputs($fp, $request)) return false;
-       do{
-               $line=chop(iil_ReadLine($fp, 200));
-               //$a = explode(" ", $line);
-               //if (($line[0]=="*") && ($a[2]=="FETCH")){
-               if ($line[0]=="*"){
+       $command_key = 'fh' . ($c++);
+       $request     = $command_key . $prefix;
+       $request    .= " FETCH $message_set (UID RFC822.SIZE FLAGS INTERNALDATE)\r\n";
+       
+       if (!fputs($fp, $request)) {
+           return false;
+       }
+    do {
+               $line = chop(iil_ReadLine($fp, 200));
+               //$a = explode(' ', $line);
+               //if (($line[0]=="*") && ($a[2]=="FETCH")) {
+               if ($line[0] == '*') {
                        //echo "<!-- $line //-->\n";
                        //get outter most parens
                        $open_pos = strpos($line, "(") + 1;
                        $close_pos = strrpos($line, ")");
-                       if ($open_pos && $close_pos){
+                       if ($open_pos && $close_pos) {
                                //extract ID from pre-paren
                                $pre_str = substr($line, 0, $open_pos);
-                               $pre_a = explode(" ", $line);
+                               $pre_a = explode(' ', $line);
                                $id = $pre_a[1];
                                
                                //get data
@@ -1341,93 +1692,114 @@ function iil_C_FetchHeaders(&$conn, $mailbox, $message_set, $uidfetch=false){
                                
                                //swap parents with quotes, then explode
                                $str = eregi_replace("[()]", "\"", $str);
-                               $a = iil_ExplodeQuotedString(" ", $str);
+                               $a = iil_ExplodeQuotedString(' ', $str);
                                
                                //did we get the right number of replies?
                                $parts_count = count($a);
-                               if ($parts_count>=8){
-                                       for ($i=0;$i<$parts_count;$i=$i+2){
-                                               if (strcasecmp($a[$i],"UID")==0) $result[$id]->uid=$a[$i+1];
-                                               else if (strcasecmp($a[$i],"RFC822.SIZE")==0) $result[$id]->size=$a[$i+1];
-                                               else if (strcasecmp($a[$i],"INTERNALDATE")==0) $time_str = $a[$i+1];
-                                               else if (strcasecmp($a[$i],"FLAGS")==0) $flags_str = $a[$i+1];
+                               if ($parts_count>=8) {
+                                       for ($i=0;$i<$parts_count;$i=$i+2) {
+                                               if (strcasecmp($a[$i],"UID") == 0) $result[$id]->uid=$a[$i+1];
+                                               else if (strcasecmp($a[$i],"RFC822.SIZE") == 0) $result[$id]->size=$a[$i+1];
+                                               else if (strcasecmp($a[$i],"INTERNALDATE") == 0) $time_str = $a[$i+1];
+                                               else if (strcasecmp($a[$i],"FLAGS") == 0) $flags_str = $a[$i+1];
                                        }
 
                                        // process flags
-                                       $flags_str = eregi_replace('[\\\"]', "", $flags_str);
-                                       $flags_a = explode(" ", $flags_str);
-                                       //echo "<!-- ID: $id FLAGS: ".implode(",", $flags_a)." //-->\n";
+                                       $flags_str = eregi_replace('[\\\"]', '', $flags_str);
+                                       $flags_a   = explode(' ', $flags_str);
+
+                    /*
+                    trigger_error("<!-- ID: $id FLAGS: ".implode(",", $flags_a)." //-->\n",
+                        E_USER_WARNING);
+                    */
                                        
-                                       $result[$id]->seen = false;
-                                       $result[$id]->recent = false;
-                                       $result[$id]->deleted = false;
-                                       $result[$id]->answered = false;
-                                       if (is_array($flags_a)){
+                                       if (is_array($flags_a)) {
                                                reset($flags_a);
-                                               while (list($key,$val)=each($flags_a)){
-                                                       if (strcasecmp($val,"Seen")==0) $result[$id]->seen = true;
-                                                       else if (strcasecmp($val, "Deleted")==0) $result[$id]->deleted=true;
-                                                       else if (strcasecmp($val, "Recent")==0) $result[$id]->recent = true;
-                                                       else if (strcasecmp($val, "Answered")==0) $result[$id]->answered = true;
+                                               while (list($key,$val)=each($flags_a)) {
+                                                       if (strcasecmp($val,'Seen') == 0) {
+                                                           $result[$id]->seen = true;
+                                                       } else if (strcasecmp($val, 'Deleted') == 0) {
+                                                           $result[$id]->deleted=true;
+                                                       } else if (strcasecmp($val, 'Recent') == 0) {
+                                                           $result[$id]->recent = true;
+                                                       } else if (strcasecmp($val, 'Answered') == 0) {
+                                                           $result[$id]->answered = true;
+                                                       } else if (strcasecmp($val, "\$MDNSent") == 0) {
+                                                           $result[$id]->mdn_sent = true;
+                            }
                                                }
-                                               $result[$id]->flags=$flags_str;
+                                               $result[$id]->flags = $flags_a;
                                        }
                        
                                        // if time is gmt...    
                                        $time_str = str_replace('GMT','+0000',$time_str);
                                        
                                        //get timezone
-                                       $time_str = substr($time_str, 0, -1);
+                                       $time_str      = substr($time_str, 0, -1);
                                        $time_zone_str = substr($time_str, -5); //extract timezone
-                                       $time_str = substr($time_str, 1, -6); //remove quotes
-                                       $time_zone = (float)substr($time_zone_str, 1, 2); //get first two digits
-                                       if ($time_zone_str[3]!='0') $time_zone += 0.5;  //handle half hour offset
-                                       if ($time_zone_str[0]=="-") $time_zone = $time_zone * -1.0; //minus?
+                                       $time_str      = substr($time_str, 1, -6); //remove quotes
+                                       $time_zone     = (float)substr($time_zone_str, 1, 2); //get first two digits
+                                       if ($time_zone_str[3] != '0') {
+                                           $time_zone += 0.5;  //handle half hour offset
+                                       }
+                                       if ($time_zone_str[0] == '-') {
+                                               $time_zone = $time_zone * -1.0; //minus?
+                                       }
                                        $result[$id]->internaldate = $time_str;
                                        
-                                       if ($IMAP_USE_INTERNAL_DATE){
+                                       if ($IMAP_USE_INTERNAL_DATE || empty($result[$id]->date)) {
                                                //calculate timestamp
-                                               $timestamp = strtotime($time_str); //return's server's time
-                                               $na_timestamp = $timestamp;
-                                               $timestamp -= $time_zone * 3600; //compensate for tz, get GMT
+                                               $timestamp     = strtotime($time_str); //return's server's time
+                                               $na_timestamp  = $timestamp;
+                                               $timestamp    -= $time_zone * 3600; //compensate for tz, get GMT
+                                               
                                                $result[$id]->timestamp = $timestamp;
+                                               $result[$id]->date = $time_str;
                                        }
                                                
-                                       if ($conn->do_cache){
+                                       if ($conn->do_cache) {
                                                $uid = $result[$id]->uid;
                                                $conn->cache[$mailbox][$uid] = $result[$id];
                                                $conn->cache_dirty[$mailbox] = true;
                                        }
                                        //echo "<!-- ID: $id : $time_str -- local: $na_timestamp (".date("F j, Y, g:i a", $na_timestamp).") tz: $time_zone -- GMT: ".$timestamp." (".date("F j, Y, g:i a", $timestamp).")  //-->\n";
-                               }else{
+                               } else {
                                        //echo "<!-- ERROR: $id : $str //-->\n";
                                }
                        }
                }
-       }while(strpos($line, $command_key)===false);
+       } while (strpos($line, $command_key) === false);
                
        return $result;
 }
 
-
-function iil_C_FetchHeader(&$conn, $mailbox, $id, $uidfetch=false){
+function iil_C_FetchHeader(&$conn, $mailbox, $id, $uidfetch=false) {
        $fp = $conn->fp;
-       $a=iil_C_FetchHeaders($conn, $mailbox, $id, $uidfetch);
-       if (is_array($a)) return array_shift($a);
-       else return false;
+       $a  = iil_C_FetchHeaders($conn, $mailbox, $id, $uidfetch);
+       if (is_array($a)) {
+               return array_shift($a);
+       }
+       return false;
 }
 
 
-function iil_SortHeaders($a, $field, $flag){
-       if (empty($field)) $field="uid";
-       $field=strtolower($field);
-       if ($field=="date"||$field=='internaldate') $field="timestamp";
-       if (empty($flag)) $flag="ASC";
-       $flag=strtoupper($flag);
-       $stripArr = ($field=='subject') ? array('Re: ','Fwd: ','Fw: ',"\"") : array("\"");
+function iil_SortHeaders($a, $field, $flag) {
+       if (empty($field)) {
+           $field = 'uid';
+    }
+       $field = strtolower($field);
+       if ($field == 'date' || $field == 'internaldate') {
+           $field = 'timestamp';
+    }
+       if (empty($flag)) {
+           $flag = 'ASC';
+    }
+    
+       $flag     = strtoupper($flag);
+       $stripArr = ($field=='subject') ? array('Re: ','Fwd: ','Fw: ','"') : array('"');
 
        $c=count($a);
-       if ($c>0){
+       if ($c > 0) {
                /*
                        Strategy:
                        First, we'll create an "index" array.
@@ -1436,33 +1808,36 @@ function iil_SortHeaders($a, $field, $flag){
                */
                 
                // create "index" array
-               $index=array();
+               $index = array();
                reset($a);
-               while (list($key, $val)=each($a)){
+               while (list($key, $val)=each($a)) {
 
-                       if ($field=="timestamp"){
+                       if ($field == 'timestamp') {
                                $data = @strtotime($val->date);
-                               if ($data == false)
+                               if ($data == false) {
                                        $data = $val->timestamp;
-                               }
-                       else {
+                }
+                       else {
                                $data = $val->$field;
-                               if (is_string($data))
-                                       $data=strtoupper(str_replace($stripArr, "", $data));
-                               }
-
+                               if (is_string($data)) {
+                                       $data=strtoupper(str_replace($stripArr, '', $data));
+                }
+                       }
                        $index[$key]=$data;
                }
                
                // sort index
-               $i=0;
-               if ($flag=="ASC") asort($index);
-               else arsort($index);
-               
+               $i = 0;
+               if ($flag == 'ASC') {
+                   asort($index);
+        } else {
+            arsort($index);
+               }
+        
                // form new array based on index 
-               $result=array();
+               $result = array();
                reset($index);
-               while (list($key, $val)=each($index)){
+               while (list($key, $val)=each($index)) {
                        $result[$key]=$a[$key];
                        $i++;
                }
@@ -1471,557 +1846,655 @@ function iil_SortHeaders($a, $field, $flag){
        return $result;
 }
 
-function iil_C_Expunge(&$conn, $mailbox){
+function iil_C_Expunge(&$conn, $mailbox) {
        $fp = $conn->fp;
-       if (iil_C_Select($conn, $mailbox)){
-               $c=0;
+       if (iil_C_Select($conn, $mailbox)) {
+               $c = 0;
                fputs($fp, "exp1 EXPUNGE\r\n");
-               do{
+               do {
                        $line=chop(iil_ReadLine($fp, 100));
-                       if ($line[0]=="*") $c++;
-               }while (!iil_StartsWith($line, "exp1"));
+                       if ($line[0] == '*') {
+                $c++;
+            }
+               } while (!iil_StartsWith($line, 'exp1'));
                
-               if (iil_ParseResult($line) == 0){
-                       $conn->selected = ""; //state has changed, need to reselect                     
+               if (iil_ParseResult($line) == 0) {
+                       $conn->selected = ''; //state has changed, need to reselect                     
                        //$conn->exists-=$c;
                        return $c;
-               }else{
-                       $conn->error = $line;
-                       return -1;
                }
+               $conn->error = $line;
        }
        
        return -1;
 }
 
-function iil_C_ModFlag(&$conn, $mailbox, $messages, $flag, $mod){
-       if ($mod!="+" && $mod!="-") return -1;
-       
-       $fp = $conn->fp;
-       $flags=array(
-                    "SEEN"=>"\\Seen",
-                    "DELETED"=>"\\Deleted",
-                    "RECENT"=>"\\Recent",
-                    "ANSWERED"=>"\\Answered",
-                    "DRAFT"=>"\\Draft",
-                                       "FLAGGED"=>"\\Flagged"
-                   );
-       $flag=strtoupper($flag);
-       $flag=$flags[$flag];
-       if (iil_C_Select($conn, $mailbox)){
-               $c=0;
-               fputs($fp, "flg STORE $messages ".$mod."FLAGS (".$flag.")\r\n");
-               do{
+function iil_C_ModFlag(&$conn, $mailbox, $messages, $flag, $mod) {
+       if ($mod != '+' && $mod != '-') {
+           return -1;
+       }
+    
+       $fp    = $conn->fp;
+       $flags = array(
+        'SEEN'     => '\\Seen',
+        'DELETED'  => '\\Deleted',
+        'RECENT'   => '\\Recent',
+        'ANSWERED' => '\\Answered',
+        'DRAFT'    => '\\Draft',
+        'FLAGGED'  => '\\Flagged',
+        'MDNSENT'  => "\$MDNSent");
+        
+       $flag = strtoupper($flag);
+       $flag = $flags[$flag];
+    
+       if (iil_C_Select($conn, $mailbox)) {
+               $c = 0;
+               fputs($fp, "flg STORE $messages " . $mod . "FLAGS (" . $flag . ")\r\n");
+               do {
                        $line=chop(iil_ReadLine($fp, 100));
-                       if ($line[0]=="*") $c++;
-               }while (!iil_StartsWith($line, "flg"));
+                       if ($line[0] == '*') {
+                           $c++;
+            }
+               } while (!iil_StartsWith($line, 'flg'));
 
-               if (iil_ParseResult($line) == 0){
+               if (iil_ParseResult($line) == 0) {
                        iil_C_ExpireCachedItems($conn, $mailbox, $messages);
                        return $c;
-               }else{
-                       $conn->error = $line;
-                       return -1;
                }
-       }else{
-               $conn->error = "Select failed";
+               $conn->error = $line;
                return -1;
        }
+       $conn->error = 'Select failed';
+       return -1;
 }
 
-function iil_C_Flag(&$conn, $mailbox, $messages, $flag){
-       return iil_C_ModFlag($conn, $mailbox, $messages, $flag, "+");
+function iil_C_Flag(&$conn, $mailbox, $messages, $flag) {
+       return iil_C_ModFlag($conn, $mailbox, $messages, $flag, '+');
 }
 
-function iil_C_Unflag(&$conn, $mailbox, $messages, $flag){
-       return iil_C_ModFlag($conn, $mailbox, $messages, $flag, "-");
+function iil_C_Unflag(&$conn, $mailbox, $messages, $flag) {
+       return iil_C_ModFlag($conn, $mailbox, $messages, $flag, '-');
 }
 
-function iil_C_Delete(&$conn, $mailbox, $messages){
-       return iil_C_ModFlag($conn, $mailbox, $messages, "DELETED", "+");
+function iil_C_Delete(&$conn, $mailbox, $messages) {
+       return iil_C_ModFlag($conn, $mailbox, $messages, 'DELETED', '+');
 }
 
-function iil_C_Undelete(&$conn, $mailbox, $messages){
-       return iil_C_ModFlag($conn, $mailbox, $messages, "DELETED", "-");
+function iil_C_Undelete(&$conn, $mailbox, $messages) {
+       return iil_C_ModFlag($conn, $mailbox, $messages, 'DELETED', '-');
 }
 
 
-function iil_C_Unseen(&$conn, $mailbox, $messages){
-       return iil_C_ModFlag($conn, $mailbox, $messages, "SEEN", "-");
+function iil_C_Unseen(&$conn, $mailbox, $messages) {
+       return iil_C_ModFlag($conn, $mailbox, $messages, 'SEEN', '-');
 }
 
 
-function iil_C_Copy(&$conn, $messages, $from, $to){
+function iil_C_Copy(&$conn, $messages, $from, $to) {
        $fp = $conn->fp;
 
-       if (empty($from) || empty($to)) return -1;
-
-       if (iil_C_Select($conn, $from)){
+       if (empty($from) || empty($to)) {
+           return -1;
+    }
+    
+       if (iil_C_Select($conn, $from)) {
                $c=0;
                
                fputs($fp, "cpy1 COPY $messages \"$to\"\r\n");
                $line=iil_ReadReply($fp);
                return iil_ParseResult($line);
-       }else{
+       } else {
                return -1;
        }
 }
 
-function iil_FormatSearchDate($month, $day, $year){
-       $month = (int)$month;
-       $months=array(
-                       1=>"Jan", 2=>"Feb", 3=>"Mar", 4=>"Apr", 
-                       5=>"May", 6=>"Jun", 7=>"Jul", 8=>"Aug", 
-                       9=>"Sep", 10=>"Oct", 11=>"Nov", 12=>"Dec"
-                       );
-       return $day."-".$months[$month]."-".$year;
+function iil_FormatSearchDate($month, $day, $year) {
+       $month  = (int) $month;
+    $months = $GLOBALS['IMAP_MONTHS'];
+       return $day . '-' . $months[$month] . '-' . $year;
 }
 
-function iil_C_CountUnseen(&$conn, $folder){
-       $index = iil_C_Search($conn, $folder, "ALL UNSEEN");
-       if (is_array($index)){
-               $str = implode(",", $index);
-               if (empty($str)) return false;
-               else return count($index);
-       }else return false;
+function iil_C_CountUnseen(&$conn, $folder) {
+       $index = iil_C_Search($conn, $folder, 'ALL UNSEEN');
+       if (is_array($index)) {
+               $str = implode(',', $index);
+               if (empty($str)) {
+                   return false;
+        }
+               return count($index);
+       }
+    return false;
 }
 
-function iil_C_UID2ID(&$conn, $folder, $uid){
-       if ($uid > 0){
+function iil_C_UID2ID(&$conn, $folder, $uid) {
+       if ($uid > 0) {
                $id_a = iil_C_Search($conn, $folder, "UID $uid");
-               if (is_array($id_a)){
+               if (is_array($id_a)) {
                        $count = count($id_a);
-                       if ($count > 1) return false;
-                       else return $id_a[0];
+                       if ($count > 1) {
+                           return false;
+            }
+                       return $id_a[0];
                }
        }
        return false;
 }
 
-function iil_C_ID2UID(&$conn, $folder, $id){
+function iil_C_ID2UID(&$conn, $folder, $id) {
        $fp = $conn->fp;
-       $result=-1;
-       if ($id > 0) {
-               if (iil_C_Select($conn, $folder)){
-                       $key = "FUID";
-                       if (fputs($fp, "$key FETCH $id (UID)\r\n")){
-                               do{
-                                       $line=chop(iil_ReadLine($fp, 1024));
-                                       if (eregi("^\* $id FETCH \(UID (.*)\)", $line, $r)){
-                                               $result = $r[1];
-                                       }
-                               } while (!preg_match("/^$key/", $line));
-                       }
+       if ($id == 0) {
+           return      -1;
+    }
+    $result = -1;
+       if (iil_C_Select($conn, $folder)) {
+               $key = 'FUID';
+               if (fputs($fp, "$key FETCH $id (UID)\r\n")) {
+                       do {
+                               $line=chop(iil_ReadLine($fp, 1024));
+                               if (eregi("^\* $id FETCH \(UID (.*)\)", $line, $r)) {
+                                       $result = $r[1];
+                               }
+                       } while (!preg_match("/^$key/", $line));
                }
        }
        return $result;
 }
 
-function iil_C_Search(&$conn, $folder, $criteria){
+function iil_C_Search(&$conn, $folder, $criteria) {
        $fp = $conn->fp;
-       if (iil_C_Select($conn, $folder)){
-               $c=0;
+       if (iil_C_Select($conn, $folder)) {
+               $c = 0;
                
-               $query = "srch1 SEARCH ".chop($criteria)."\r\n";
+               $query = 'srch1 SEARCH ' . chop($criteria) . "\r\n";
                fputs($fp, $query);
-               do{
+               do {
                        $line=trim(chop(iil_ReadLine($fp, 10000)));
-                       if (eregi("^\* SEARCH", $line)){
+                       if (eregi("^\* SEARCH", $line)) {
                                $str = trim(substr($line, 8));
-                               $messages = explode(" ", $str);
+                               $messages = explode(' ', $str);
                        }
-               }while(!iil_StartsWith($line, "srch1"));
+               } while (!iil_StartsWith($line, 'srch1'));
                
-               $result_code=iil_ParseResult($line);
-               if ($result_code==0) return $messages;
-               else{
-                       $conn->error = "iil_C_Search: ".$line."\n";
-                       return false;
+               $result_code = iil_ParseResult($line);
+               if ($result_code == 0) {
+                   return $messages;
                }
-               
-       }else{
-               $conn->error = "iil_C_Search: Couldn't select \"$folder\"\n";
+               $conn->error = 'iil_C_Search: ' . $line . "\n";
                return false;
+               
        }
+       $conn->error = "iil_C_Search: Couldn't select \"$folder\"\n";
+       return false;
 }
 
-function iil_C_Move(&$conn, $messages, $from, $to){
+function iil_C_Move(&$conn, $messages, $from, $to) {
        $fp = $conn->fp;
        
-       if (!$from || !$to) return -1;
-       
-       $r=iil_C_Copy($conn, $messages, $from,$to);
-       if ($r==0){
+       if (!$from || !$to) {
+           return -1;
+       }
+    
+       $r = iil_C_Copy($conn, $messages, $from,$to);
+       if ($r==0) {
                return iil_C_Delete($conn, $from, $messages);
-       }else{
-               return $r;
        }
-}
-
-function iil_C_GetHierarchyDelimiter(&$conn){
-       if ($conn->delimiter) return $conn->delimiter;
-       
-       $fp = $conn->fp;
+    return $r;
+}
+
+/**
+ * Gets the delimiter, for example:
+ * INBOX.foo -> .
+ * INBOX/foo -> /
+ * INBOX\foo -> \
+ * 
+ * @return mixed A delimiter (string), or false. 
+ * @param object $conn The current connection.
+ * @see iil_Connect()
+ */
+function iil_C_GetHierarchyDelimiter(&$conn) {
+       if ($conn->delimiter) {
+        return $conn->delimiter;
+       }
+    
+       $fp        = $conn->fp;
        $delimiter = false;
        
        //try (LIST "" ""), should return delimiter (RFC2060 Sec 6.3.8)
-       if (!fputs($fp, "ghd LIST \"\" \"\"\r\n")) return false;
-       do{
+       if (!fputs($fp, 'ghd LIST "" ""' . "\r\n")) {
+           return false;
+    }
+    
+       do {
                $line=iil_ReadLine($fp, 500);
-               if ($line[0]=="*"){
+               if ($line[0] == '*') {
                        $line = rtrim($line);
-                       $a=iil_ExplodeQuotedString(" ", $line);
-                       if ($a[0]=="*") $delimiter = str_replace("\"", "", $a[count($a)-2]);
+                       $a=iil_ExplodeQuotedString(' ', $line);
+                       if ($a[0] == '*') {
+                           $delimiter = str_replace('"', '', $a[count($a)-2]);
+            }
                }
-       }while (!iil_StartsWith($line, "ghd"));
+       } while (!iil_StartsWith($line, 'ghd'));
 
-       if (strlen($delimiter)>0) return $delimiter;
-       
+       if (strlen($delimiter)>0) {
+           return $delimiter;
+       }
+    
        //if that fails, try namespace extension
        //try to fetch namespace data
        fputs($conn->fp, "ns1 NAMESPACE\r\n");
-       do{
+       do {
                $line = iil_ReadLine($conn->fp, 1024);
-               if (iil_StartsWith($line, "* NAMESPACE")){
+               if (iil_StartsWith($line, '* NAMESPACE')) {
                        $i = 0;
                        $data = iil_ParseNamespace2(substr($line,11), $i, 0, 0);
                }
-       }while(!iil_StartsWith($line, "ns1"));
+       } while (!iil_StartsWith($line, 'ns1'));
                
-       if (!is_array($data)) return false;
-       
+       if (!is_array($data)) {
+           return false;
+       }
+    
        //extract user space data (opposed to global/shared space)
        $user_space_data = $data[0];
-       if (!is_array($user_space_data)) return false;
-       
+       if (!is_array($user_space_data)) {
+           return false;
+       }
+    
        //get first element
        $first_userspace = $user_space_data[0];
-       if (!is_array($first_userspace)) return false;
-
+       if (!is_array($first_userspace)) {
+           return false;
+    }
+    
        //extract delimiter
        $delimiter = $first_userspace[1];       
 
        return $delimiter;
 }
 
-function iil_C_ListMailboxes(&$conn, $ref, $mailbox){
+function iil_C_ListMailboxes(&$conn, $ref, $mailbox) {
        global $IGNORE_FOLDERS;
        
        $ignore = $IGNORE_FOLDERS[strtolower($conn->host)];
                
        $fp = $conn->fp;
-       if (empty($mailbox)) $mailbox="*";
-       if (empty($ref) && $conn->rootdir) $ref = $conn->rootdir;
-       
+       if (empty($mailbox)) {
+           $mailbox = '*';
+    }
+       if (empty($ref) && $conn->rootdir) {
+           $ref = $conn->rootdir;
+       }
+    
     // send command
-       if (!fputs($fp, "lmb LIST \"".$ref."\" \"$mailbox\"\r\n")) return false;
-       $i=0;
+       if (!fputs($fp, "lmb LIST \"".$ref."\" \"$mailbox\"\r\n")) {
+           return false;
+    }
+    
+       $i = 0;
     // get folder list
-       do{
-               $line=iil_ReadLine($fp, 500);
-               $line=iil_MultLine($fp, $line);
+       do {
+               $line = iil_ReadLine($fp, 500);
+               $line = iil_MultLine($fp, $line);
 
-               $a = explode(" ", $line);
-               if (($line[0]=="*") && ($a[1]=="LIST")){
+               $a = explode(' ', $line);
+               if (($line[0] == '*') && ($a[1] == 'LIST')) {
                        $line = rtrim($line);
             // split one line
-                       $a=iil_ExplodeQuotedString(" ", $line);
+                       $a = iil_ExplodeQuotedString(' ', $line);
+            
             // last string is folder name
-                       $folder = str_replace("\"", "", $a[count($a)-1]);
-            if (empty($ignore) || (!empty($ignore) && !eregi($ignore, $folder))) $folders[$i] = $folder;
+                       $folder = str_replace('"', '', $a[count($a)-1]);
+            
+            if (empty($ignore) || (!empty($ignore)
+                && !eregi($ignore, $folder))) {
+                $folders[$i] = $folder;
+            }
+            
             // second from last is delimiter
-            $delim = str_replace("\"", "", $a[count($a)-2]);
+            $delim = str_replace('"', '', $a[count($a)-2]);
             // is it a container?
             $i++;
                }
-       }while (!iil_StartsWith($line, "lmb"));
+       } while (!iil_StartsWith($line, 'lmb'));
 
-       if (is_array($folders)){
-        if (!empty($ref)){
+       if (is_array($folders)) {
+        if (!empty($ref)) {
             // if rootdir was specified, make sure it's the first element
             // some IMAP servers (i.e. Courier) won't return it
             if ($ref[strlen($ref)-1]==$delim) $ref = substr($ref, 0, strlen($ref)-1);
             if ($folders[0]!=$ref) array_unshift($folders, $ref);
         }
         return $folders;
-       }else if (iil_ParseResult($line)==0){
+       }else if (iil_ParseResult($line) == 0) {
                return array('INBOX');
-       }else{
+       } else {
                $conn->error = $line;
                return false;
        }
 }
 
 
-function iil_C_ListSubscribed(&$conn, $ref, $mailbox){
+function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
        global $IGNORE_FOLDERS;
        
        $ignore = $IGNORE_FOLDERS[strtolower($conn->host)];
        
        $fp = $conn->fp;
-       if (empty($mailbox)) $mailbox = "*";
-       if (empty($ref) && $conn->rootdir) $ref = $conn->rootdir;
+       if (empty($mailbox)) {
+               $mailbox = '*';
+       }
+       if (empty($ref) && $conn->rootdir) {
+               $ref = $conn->rootdir;
+       }
        $folders = array();
 
     // send command
-       if (!fputs($fp, "lsb LSUB \"".$ref."\" \"".$mailbox."\"\r\n")){
+       if (!fputs($fp, 'lsb LSUB "' . $ref . '" "' . $mailbox.'"' . "\r\n")) {
                $conn->error = "Couldn't send LSUB command\n";
                return false;
        }
-       $i=0;
+       
+       $i = 0;
+       
     // get folder list
-       do{
-               $line=iil_ReadLine($fp, 500);
-               $line=iil_MultLine($fp, $line);
-               $a = explode(" ", $line);
-               if (($line[0]=="*") && ($a[1]=="LSUB" || $a[1]=="LIST")){
+       do {
+               $line = iil_ReadLine($fp, 500);
+               $line = iil_MultLine($fp, $line);
+               $a    = explode(' ', $line);
+        
+               if (($line[0] == '*') && ($a[1] == 'LSUB' || $a[1] == 'LIST')) {
                        $line = rtrim($line);
+            
             // split one line
-                       $a=iil_ExplodeQuotedString(" ", $line);
+                       $a = iil_ExplodeQuotedString(' ', $line);
+            
             // last string is folder name
-            //$folder = UTF7DecodeString(str_replace("\"", "", $a[count($a)-1]));
-            $folder = str_replace("\"", "", $a[count($a)-1]);
-                       if ((!in_array($folder, $folders)) && (empty($ignore) || (!empty($ignore) && !eregi($ignore, $folder)))) $folders[$i] = $folder;
+            //$folder = UTF7DecodeString(str_replace('"', '', $a[count($a)-1]));
+            $folder = str_replace('"', '', $a[count($a)-1]);
+            
+                       if ((!in_array($folder, $folders)) && (empty($ignore)
+                || (!empty($ignore) && !eregi($ignore, $folder)))) {
+                           $folders[$i] = $folder;
+            }
+            
             // second from last is delimiter
-            $delim = str_replace("\"", "", $a[count($a)-2]);
+            $delim = str_replace('"', '', $a[count($a)-2]);
+            
             // is it a container?
             $i++;
                }
-       }while (!iil_StartsWith($line, "lsb"));
+       } while (!iil_StartsWith($line, 'lsb'));
 
-       if (is_array($folders)){
-        if (!empty($ref)){
+       if (is_array($folders)) {
+        if (!empty($ref)) {
             // if rootdir was specified, make sure it's the first element
             // some IMAP servers (i.e. Courier) won't return it
-            if ($ref[strlen($ref)-1]==$delim) $ref = substr($ref, 0, strlen($ref)-1);
-            if ($folders[0]!=$ref) array_unshift($folders, $ref);
+            if ($ref[strlen($ref)-1]==$delim) {
+                $ref = substr($ref, 0, strlen($ref)-1);
+            }
+            if ($folders[0]!=$ref) {
+                array_unshift($folders, $ref);
+            }
         }
         return $folders;
-       }else{
-               $conn->error = $line;
-               return false;
        }
+       $conn->error = $line;
+       return false;
 }
 
 
-function iil_C_Subscribe(&$conn, $folder){
+function iil_C_Subscribe(&$conn, $folder) {
        $fp = $conn->fp;
 
-       $query = "sub1 SUBSCRIBE \"".$folder."\"\r\n";
+       $query = 'sub1 SUBSCRIBE "' . $folder. '"' . "\r\n";
        fputs($fp, $query);
-       $line=trim(chop(iil_ReadLine($fp, 10000)));
+
+       $line = trim(chop(iil_ReadLine($fp, 10000)));
        return iil_ParseResult($line);
 }
 
 
-function iil_C_UnSubscribe(&$conn, $folder){
+function iil_C_UnSubscribe(&$conn, $folder) {
        $fp = $conn->fp;
 
-       $query = "usub1 UNSUBSCRIBE \"".$folder."\"\r\n";
+       $query = 'usub1 UNSUBSCRIBE "' . $folder . '"' . "\r\n";
        fputs($fp, $query);
-       $line=trim(chop(iil_ReadLine($fp, 10000)));
+    
+       $line = trim(chop(iil_ReadLine($fp, 10000)));
        return iil_ParseResult($line);
 }
 
 
-function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part){
-       $fp = $conn->fp;
-       $result=false;
-       if (($part==0)||(empty($part))) $part="HEADER";
-       else $part.=".MIME";
-       
-       if (iil_C_Select($conn, $mailbox)){
-               $key="fh".($c++);
-               $request=$key." FETCH $id (BODY.PEEK[$part])\r\n";
+function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part) {
+       $fp     = $conn->fp;
+       $result = false;
+       if (($part == 0) || (empty($part))) {
+           $part = 'HEADER';
+    } else {
+        $part .= '.MIME';
+       }
+    
+       if (iil_C_Select($conn, $mailbox)) {
+               $key     = 'fh' . ($c++);
+               $request = $key . " FETCH $id (BODY.PEEK[$part])\r\n";
                if (!fputs($fp, $request)) return false;
-               do{
-                       $line=chop(iil_ReadLine($fp, 200));
-                       $a=explode(" ", $line);
-                       if (($line[0]=="*") && ($a[2]=="FETCH") && ($line[strlen($line)-1]!=")")){
+               do {
+                       $line = chop(iil_ReadLine($fp, 200));
+                       $a    = explode(' ', $line);
+                       if (($line[0] == '*') && ($a[2] == 'FETCH')
+                && ($line[strlen($line)-1] != ')')) {
                                $line=iil_ReadLine($fp, 300);
-                               while(chop($line)!=")"){
-                                       $result.=$line;
+                               while (chop($line) != ')') {
+                                       $result .= $line;
                                        $line=iil_ReadLine($fp, 300);
                                }
                        }
-               }while(strcmp($a[0], $key)!=0);
+               } while (strcmp($a[0], $key) != 0);
        }
        
        return $result;
 }
 
 
-function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode){
+function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
     /* modes:
         1: return string
         2: print
         3: base64 and print
     */
-       $fp = $conn->fp;
-       $result=false;
-       if (($part==0)||(empty($part))) $part="TEXT";
-       
-       if (iil_C_Select($conn, $mailbox)){
-        $reply_key="* ".$id;
+       $fp     = $conn->fp;
+       $result = false;
+       if (($part == 0) || empty($part)) {
+           $part = 'TEXT';
+       }
+    
+       if (iil_C_Select($conn, $mailbox)) {
+        $reply_key = '* ' . $id;
+        
         // format request
-               $key="ftch".($c++)." ";
-               $request=$key."FETCH $id (BODY.PEEK[$part])\r\n";
+               $key     = 'ftch' . ($c++) . ' ';
+               $request = $key . "FETCH $id (BODY.PEEK[$part])\r\n";
         // send request
-               if (!fputs($fp, $request)) return false;
+               if (!fputs($fp, $request)) {
+                   return false;
+        }
+        
         // receive reply line
-        do{
+        do {
             $line = chop(iil_ReadLine($fp, 1000));
-            $a = explode(" ", $line);
-        }while ($a[2]!="FETCH");
+            $a    = explode(' ', $line);
+        } while ($a[2] != 'FETCH');
         $len = strlen($line);
-        if ($line[$len-1] == ")"){
+        if ($line[$len-1] == ')') {
             //one line response, get everything between first and last quotes
-            $from = strpos($line, "\"") + 1;
-            $to = strrpos($line, "\"");
-            $len = $to - $from;
-            if ($mode==1) $result = substr($line, $from, $len);
-            else if ($mode==2) echo substr($line, $from, $len);
-            else if ($mode==3) echo base64_decode(substr($line, $from, $len));
-        }else if ($line[$len-1] == "}"){
+            $from = strpos($line, '"') + 1;
+            $to   = strrpos($line, '"');
+            $len  = $to - $from;
+            if ($mode == 1) {
+                $result = substr($line, $from, $len);
+            } else if ($mode == 2) {
+                echo substr($line, $from, $len);
+            } else if ($mode == 3) {
+                echo base64_decode(substr($line, $from, $len));
+            }
+        }else if ($line[$len-1] == '}') {
             //multi-line request, find sizes of content and receive that many bytes
-            $from = strpos($line, "{") + 1;
-            $to = strrpos($line, "}");
-            $len = $to - $from;
-            $sizeStr = substr($line, $from, $len);
-            $bytes = (int)$sizeStr;
+            $from     = strpos($line, '{') + 1;
+            $to       = strrpos($line, '}');
+            $len      = $to - $from;
+            $sizeStr  = substr($line, $from, $len);
+            $bytes    = (int)$sizeStr;
             $received = 0;
-            while ($received < $bytes){
+            while ($received < $bytes) {
                 $remaining = $bytes - $received;
-                $line = iil_ReadLine($fp, 1024);
-                $len = strlen($line);
-                if ($len > $remaining) $line = substr($line, 0, $remaining);
+                $line      = iil_ReadLine($fp, 1024);
+                $len       = strlen($line);
+                
+                if ($len > $remaining) {
+                    $line = substr($line, 0, $remaining);
+                }
                 $received += strlen($line);
-                if ($mode==1) $result .= chop($line)."\n";
-                else if ($mode==2){ echo chop($line)."\n"; flush(); }
-                else if ($mode==3){ echo base64_decode($line); flush(); }
+                if ($mode == 1) {
+                    $result .= chop($line) . "\n";
+                } else if ($mode == 2) {
+                    echo chop($line) . "\n"; flush();
+                } else if ($mode == 3) {
+                    echo base64_decode($line); flush();
+                }
             }
         }
         // read in anything up until 'til last line
-               do{
+               do {
             $line = iil_ReadLine($fp, 1024);
-               }while(!iil_StartsWith($line, $key));
+               } while (!iil_StartsWith($line, $key));
         
-        if ($result){
+        if ($result) {
                        $result = chop($result);
             return $result; // substr($result, 0, strlen($result)-1);
-        }else return false;
-       }else{
-               echo "Select failed.";
+        }
+        return false;
+       } else {
+               echo 'Select failed.';
        }
     
-    if ($mode==1) return $result;
-    else return $received;
+    if ($mode==1) {
+        return $result;
+    }
+    return $received;
 }
 
-function iil_C_FetchPartBody(&$conn, $mailbox, $id, $part){
+function iil_C_FetchPartBody(&$conn, $mailbox, $id, $part) {
     return iil_C_HandlePartBody($conn, $mailbox, $id, $part, 1);
 }
 
-function iil_C_PrintPartBody(&$conn, $mailbox, $id, $part){
+function iil_C_PrintPartBody(&$conn, $mailbox, $id, $part) {
     iil_C_HandlePartBody($conn, $mailbox, $id, $part, 2);
 }
 
-function iil_C_PrintBase64Body(&$conn, $mailbox, $id, $part){
+function iil_C_PrintBase64Body(&$conn, $mailbox, $id, $part) {
     iil_C_HandlePartBody($conn, $mailbox, $id, $part, 3);
 }
 
-function iil_C_CreateFolder(&$conn, $folder){
+function iil_C_CreateFolder(&$conn, $folder) {
        $fp = $conn->fp;
-       if (fputs($fp, "c CREATE \"".$folder."\"\r\n")){
-               do{
+       if (fputs($fp, 'c CREATE "' . $folder . '"' . "\r\n")) {
+               do {
                        $line=iil_ReadLine($fp, 300);
-               }while($line[0]!="c");
+               } while ($line[0] != 'c');
         $conn->error = $line;
-               return (iil_ParseResult($line)==0);
-       }else{
-               return false;
+               return (iil_ParseResult($line) == 0);
        }
+       return false;
 }
 
-function iil_C_RenameFolder(&$conn, $from, $to){
+function iil_C_RenameFolder(&$conn, $from, $to) {
        $fp = $conn->fp;
-       if (fputs($fp, "r RENAME \"".$from."\" \"".$to."\"\r\n")){
-               do{
-                       $line=iil_ReadLine($fp, 300);
-               }while($line[0]!="r");
-               return (iil_ParseResult($line)==0);
-       }else{
-               return false;
-       }       
+       if (fputs($fp, 'r RENAME "' . $from . '" "' . $to . '"' . "\r\n")) {
+               do {
+                       $line = iil_ReadLine($fp, 300);
+               } while ($line[0] != 'r');
+               return (iil_ParseResult($line) == 0);
+       }
+    return false;
 }
 
-function iil_C_DeleteFolder(&$conn, $folder){
+function iil_C_DeleteFolder(&$conn, $folder) {
        $fp = $conn->fp;
-       if (fputs($fp, "d DELETE \"".$folder."\"\r\n")){
-               do{
+       if (fputs($fp, 'd DELETE "' . $folder. '"' . "\r\n")) {
+               do {
                        $line=iil_ReadLine($fp, 300);
-               }while($line[0]!="d");
-               return (iil_ParseResult($line)==0);
-       }else{
-               $conn->error = "Couldn't send command\n";
-               return false;
+               } while ($line[0] != 'd');
+               return (iil_ParseResult($line) == 0);
        }
+    $conn->error = "Couldn't send command\n";
+       return false;
 }
 
-function iil_C_Append(&$conn, $folder, &$message){
-       if (!$folder) return false;
+function iil_C_Append(&$conn, $folder, &$message) {
+       if (!$folder) {
+        return false;
+    }
        $fp = $conn->fp;
 
-       $message = str_replace("\r", "", $message);
+       $message = str_replace("\r", '', $message);
        $message = str_replace("\n", "\r\n", $message);         
 
        $len = strlen($message);
-       if (!$len) return false;
-       
-       $request="A APPEND \"".$folder."\" (\\Seen) {".$len."}\r\n";
-       if (fputs($fp, $request)){
+       if (!$len) {
+        return false;
+       }
+       $request = 'A APPEND "' . $folder .'" (\\Seen) {' . $len . "}\r\n";
+    
+       if (fputs($fp, $request)) {
                $line=iil_ReadLine($fp, 100);           
                $sent = fwrite($fp, $message."\r\n");
                flush();
-               do{
+               do {
                        $line=iil_ReadLine($fp, 1000);
-               }while($line[0]!="A");
+               } while ($line[0] != 'A');
        
-               $result = (iil_ParseResult($line)==0);
-               if (!$result) $conn->error .= $line."\n";
+               $result = (iil_ParseResult($line) == 0);
+               if (!$result) {
+                   $conn->error .= $line . "\n";
+        }
                return $result;
        
-       }else{
-               $conn->error .= "Couldn't send command \"$request\"\n";
-               return false;
        }
+       $conn->error .= "Couldn't send command \"$request\"\n";
+    return false;
 }
 
 
-function iil_C_AppendFromFile(&$conn, $folder, $path){
-       if (!$folder) return false;
-       
+function iil_C_AppendFromFile(&$conn, $folder, $path) {
+       if (!$folder) {
+           return false;
+       }
+    
        //open message file
        $in_fp = false;                         
-       if (file_exists(realpath($path))) $in_fp = fopen($path, "r");
-       if (!$in_fp){ 
+       if (file_exists(realpath($path))) {
+           $in_fp = fopen($path, 'r');
+    }
+       if (!$in_fp) { 
                $conn->error .= "Couldn't open $path for reading\n";
                return false;
        }
        
-       $fp = $conn->fp;
+       $fp  = $conn->fp;
        $len = filesize($path);
-       if (!$len) return false;
-       
+       if (!$len) {
+           return false;
+       }
+    
        //send APPEND command
-       $request="A APPEND \"".$folder."\" (\\Seen) {".$len."}\r\n";
+       $request    = 'A APPEND "' . $folder . '" (\\Seen) {' . $len . "}\r\n";
        $bytes_sent = 0;
-       if (fputs($fp, $request)){
-               $line=iil_ReadLine($fp, 100);
+       if (fputs($fp, $request)) {
+               $line = iil_ReadLine($fp, 100);
                                
                //send file
-               while(!feof($in_fp)){
-                       $buffer = fgets($in_fp, 4096);
+               while (!feof($in_fp)) {
+                       $buffer      = fgets($in_fp, 4096);
                        $bytes_sent += strlen($buffer);
                        fputs($fp, $buffer);
                }
@@ -2030,100 +2503,110 @@ function iil_C_AppendFromFile(&$conn, $folder, $path){
                fputs($fp, "\r\n");
 
                //read response
-               do{
-                       $line=iil_ReadLine($fp, 1000);
-               }while($line[0]!="A");
+               do {
+                       $line = iil_ReadLine($fp, 1000);
+               } while ($line[0] != 'A');
                        
-               $result = (iil_ParseResult($line)==0);
-               if (!$result) $conn->error .= $line."\n";
-               return $result;
+               $result = (iil_ParseResult($line) == 0);
+               if (!$result) {
+                   $conn->error .= $line . "\n";
+               }
+        return $result;
        
-       }else{
-               $conn->error .= "Couldn't send command \"$request\"\n";
-               return false;
        }
+       $conn->error .= "Couldn't send command \"$request\"\n";
+       return false;
 }
 
 
-function iil_C_FetchStructureString(&$conn, $folder, $id){
-       $fp = $conn->fp;
-       $result=false;
-       if (iil_C_Select($conn, $folder)){
-               $key = "F1247";
-               if (fputs($fp, "$key FETCH $id (BODYSTRUCTURE)\r\n")){
-                       do{
+function iil_C_FetchStructureString(&$conn, $folder, $id) {
+       $fp     = $conn->fp;
+       $result = false;
+       if (iil_C_Select($conn, $folder)) {
+               $key = 'F1247';
+        
+               if (fputs($fp, "$key FETCH $id (BODYSTRUCTURE)\r\n")) {
+                       do {
                                $line=chop(iil_ReadLine($fp, 5000));
-                               if ($line[0]=="*"){
-                                       if (ereg("\}$", $line)){
+                               if ($line[0] == '*') {
+                                       if (ereg("\}$", $line)) {
                                                preg_match('/(.+)\{([0-9]+)\}/', $line, $match);  
                                                $result = $match[1];
-                                               do{
+                                               do {
                                                        $line = chop(iil_ReadLine($fp, 100));
-                                                       if (!preg_match("/^$key/", $line)) $result .= $line;
-                                                       else $done = true;
-                                               }while(!$done);
-                                       }else{
+                                                       if (!preg_match("/^$key/", $line)) {
+                                                           $result .= $line;
+                            } else {
+                                $done = true;
+                            }
+                                               } while (!$done);
+                                       } else {
                                                $result = $line;
                                        }
-                                       list($pre, $post) = explode("BODYSTRUCTURE ", $result);
-                                       $result = substr($post, 0, strlen($post)-1);            //truncate last ')' and return
+                                       list($pre, $post) = explode('BODYSTRUCTURE ', $result);
+                                       
+                                       //truncate last ')' and return
+                                       $result = substr($post, 0, strlen($post)-1);
                                }
-                       }while (!preg_match("/^$key/",$line));
+                       } while (!preg_match("/^$key/", $line));
                }
        }
        return $result;
 }
 
-function iil_C_PrintSource(&$conn, $folder, $id, $part){
+function iil_C_PrintSource(&$conn, $folder, $id, $part) {
        $header = iil_C_FetchPartHeader($conn, $folder, $id, $part);
-       //echo str_replace("\r", "", $header);
+       //echo str_replace("\r", '', $header);
        echo $header;
        echo iil_C_PrintPartBody($conn, $folder, $id, $part);
 }
 
-function iil_C_GetQuota(&$conn){
+function iil_C_GetQuota(&$conn) {
 /*
-b GETQUOTAROOT "INBOX"
-* QUOTAROOT INBOX user/rchijiiwa1
-* QUOTA user/rchijiiwa1 (STORAGE 654 9765)
-b OK Completed
-*/
-       $fp = $conn->fp;
-       $result=false;
-       $quota_line = "";
+ * GETQUOTAROOT "INBOX"
+ * QUOTAROOT INBOX user/rchijiiwa1
+ * QUOTA user/rchijiiwa1 (STORAGE 654 9765)
+ b OK Completed
+ */
+       $fp         = $conn->fp;
+       $result     = false;
+       $quota_line = '';
        
        //get line containing quota info
-       if (fputs($fp, "QUOT1 GETQUOTAROOT \"INBOX\"\r\n")){
-               do{
+       if (fputs($fp, 'QUOT1 GETQUOTAROOT "INBOX"' . "\r\n")) {
+               do {
                        $line=chop(iil_ReadLine($fp, 5000));
-                       if (iil_StartsWith($line, "* QUOTA ")) $quota_line = $line;
-               }while(!iil_StartsWith($line, "QUOT1"));
+                       if (iil_StartsWith($line, '* QUOTA ')) {
+                           $quota_line = $line;
+            }
+               } while (!iil_StartsWith($line, 'QUOT1'));
        }
        
        //return false if not found, parse if found
-       if (!empty($quota_line)){
-               $quota_line = eregi_replace("[()]", "", $quota_line);
-               $parts = explode(" ", $quota_line);
-               $storage_part = array_search("STORAGE", $parts);
-               if ($storage_part>0){
+       if (!empty($quota_line)) {
+               $quota_line   = eregi_replace('[()]', '', $quota_line);
+               $parts        = explode(' ', $quota_line);
+               $storage_part = array_search('STORAGE', $parts);
+               if ($storage_part > 0) {
                        $result = array();
-                       $used = $parts[$storage_part+1];
-                       $total = $parts[$storage_part+2];
-                       $result["used"] = $used;
-                       $result["total"] = (empty($total)?"??":$total);
-                       $result["percent"] = (empty($total)?"??":round(($used/$total)*100));
-                       $result["free"] = 100 - $result["percent"];
+                       $used   = $parts[$storage_part+1];
+                       $total  = $parts[$storage_part+2];
+            
+                       $result['used']    = $used;
+                       $result['total']   = (empty($total)?"??":$total);
+                       $result['percent'] = (empty($total)?"??":round(($used/$total)*100));
+                       $result['free']    = 100 - $result['percent'];
                }
        }
-       
        return $result;
 }
 
 
-function iil_C_ClearFolder(&$conn, $folder){
+function iil_C_ClearFolder(&$conn, $folder) {
        $num_in_trash = iil_C_CountMessages($conn, $folder);
-       if ($num_in_trash > 0) iil_C_Delete($conn, $folder, "1:".$num_in_trash);
+       if ($num_in_trash > 0) {
+           iil_C_Delete($conn, $folder, '1:' . $num_in_trash);
+    }
        return (iil_C_Expunge($conn, $folder) >= 0);
 }
-
 ?>
diff --git a/program/lib/magic b/program/lib/magic
new file mode 100644 (file)
index 0000000..85b5e8b
--- /dev/null
@@ -0,0 +1,10810 @@
+# Magic
+# Magic data for file(1) command.
+# Machine-generated from src/cmd/file/magdir/*; edit there only!
+# Format is described in magic(files), where:
+# files is 5 on V7 and BSD, 4 on SV, and ?? in the SVID.
+
+#------------------------------------------------------------------------------
+# Localstuff:  file(1) magic for locally observed files
+#
+# $Id: Localstuff,v 1.4 2003/03/23 04:17:27 christos Exp $
+# Add any locally observed files here.  Remember:
+# text if readable, executable if runnable binary, data if unreadable.
+
+#------------------------------------------------------------------------------
+# zyxel:  file(1) magic for ZyXEL modems
+#
+# From <rob@pe1chl.ampr.org>
+# These are the /etc/magic entries to decode datafiles as used for the
+# ZyXEL U-1496E DATA/FAX/VOICE modems.  (This header conforms to a
+# ZyXEL-defined standard)
+
+0      string          ZyXEL\002       ZyXEL voice data
+>10    byte            0               - CELP encoding
+>10    byte&0x0B       1               - ADPCM2 encoding
+>10    byte&0x0B       2               - ADPCM3 encoding
+>10    byte&0x0B       3               - ADPCM4 encoding
+>10    byte&0x0B       8               - New ADPCM3 encoding
+>10    byte&0x04       4               with resync
+
+#------------------------------------------------------------------------------
+# file(1) magic(5) data for xdelta  Josh MacDonald <jmacd@CS.Berkeley.EDU>
+#
+0      string  %XDELTA%        XDelta binary patch file 0.14
+0      string  %XDZ000%        XDelta binary patch file 0.18
+0      string  %XDZ001%        XDelta binary patch file 0.20
+0      string  %XDZ002%        XDelta binary patch file 1.0
+0      string  %XDZ003%        XDelta binary patch file 1.0.4
+0      string  %XDZ004%        XDelta binary patch file 1.1
+#------------------------------------------------------------------------
+# sysex: file(1) magic for MIDI sysex files
+#
+# 
+0      byte                    0xF0            SysEx File -
+
+# North American Group
+>1     byte                    0x01            Sequential
+>1     byte                    0x02            IDP
+>1     byte                    0x03            OctavePlateau
+>1     byte                    0x04            Moog
+>1     byte                    0x05            Passport
+>1     byte                    0x06            Lexicon
+>1     byte                    0x07            Kurzweil
+>1     byte                    0x08            Fender
+>1     byte                    0x09            Gulbransen
+>1     byte                    0x0a            AKG
+>1     byte                    0x0b            Voyce
+>1     byte                    0x0c            Waveframe
+>1     byte                    0x0d            ADA
+>1     byte                    0x0e            Garfield
+>1     byte                    0x0f            Ensoniq
+>1     byte                    0x10            Oberheim
+>1     byte                    0x11            Apple
+>1     byte                    0x12            GreyMatter
+>1     byte                    0x14            PalmTree
+>1     byte                    0x15            JLCooper
+>1     byte                    0x16            Lowrey
+>1     byte                    0x17            AdamsSmith
+>1     byte                    0x18            E-mu
+>1     byte                    0x19            Harmony
+>1     byte                    0x1a            ART
+>1     byte                    0x1b            Baldwin
+>1     byte                    0x1c            Eventide
+>1     byte                    0x1d            Inventronics
+>1     byte                    0x1f            Clarity
+
+# European Group
+>1     byte                    0x21            SIEL
+>1     byte                    0x22            Synthaxe
+>1     byte                    0x24            Hohner
+>1     byte                    0x25            Twister
+>1     byte                    0x26            Solton
+>1     byte                    0x27            Jellinghaus
+>1     byte                    0x28            Southworth
+>1     byte                    0x29            PPG
+>1     byte                    0x2a            JEN
+>1     byte                    0x2b            SSL
+>1     byte                    0x2c            AudioVertrieb
+
+>1     byte                    0x2f            ELKA
+>>3    byte                    0x09            EK-44
+
+>1     byte                    0x30            Dynacord
+>1     byte                    0x33            Clavia
+>1     byte                    0x39            Soundcraft
+
+>1     byte                    0x3e            Waldorf
+>>3    byte                    0x7f            Microwave I
+
+# Japanese Group
+>1     byte                    0x40            Kawai
+>>3    byte                    0x20            K1
+>>3    byte                    0x22            K4
+
+>1     byte                    0x41            Roland
+>>3    byte                    0x14            D-50
+>>3    byte                    0x2b            U-220
+>>3    byte                    0x02            TR-707
+
+>1     byte                    0x42            Korg
+>>3    byte                    0x19            M1
+
+>1     byte                    0x43            Yamaha
+>1     byte                    0x44            Casio
+>1     byte                    0x46            Kamiya
+>1     byte                    0x47            Akai
+>1     byte                    0x48            Victor
+>1     byte                    0x49            Mesosha
+>1     byte                    0x4b            Fujitsu
+>1     byte                    0x4c            Sony
+>1     byte                    0x4e            Teac
+>1     byte                    0x50            Matsushita
+>1     byte                    0x51            Fostex
+>1     byte                    0x52            Zoom
+>1     byte                    0x54            Matsushita
+>1     byte                    0x57            Acoustic tech. lab.
+
+>1     belong&0xffffff00       0x00007400      Ta Horng
+>1     belong&0xffffff00       0x00007500      e-Tek
+>1     belong&0xffffff00       0x00007600      E-Voice
+>1     belong&0xffffff00       0x00007700      Midisoft
+>1     belong&0xffffff00       0x00007800      Q-Sound
+>1     belong&0xffffff00       0x00007900      Westrex
+>1     belong&0xffffff00       0x00007a00      Nvidia*
+>1     belong&0xffffff00       0x00007b00      ESS
+>1     belong&0xffffff00       0x00007c00      Mediatrix
+>1     belong&0xffffff00       0x00007d00      Brooktree
+>1     belong&0xffffff00       0x00007e00      Otari
+>1     belong&0xffffff00       0x00007f00      Key Electronics
+>1     belong&0xffffff00       0x00010000      Shure
+>1     belong&0xffffff00       0x00010100      AuraSound
+>1     belong&0xffffff00       0x00010200      Crystal
+>1     belong&0xffffff00       0x00010300      Rockwell
+>1     belong&0xffffff00       0x00010400      Silicon Graphics
+>1     belong&0xffffff00       0x00010500      Midiman
+>1     belong&0xffffff00       0x00010600      PreSonus
+>1     belong&0xffffff00       0x00010800      Topaz
+>1     belong&0xffffff00       0x00010900      Cast Lightning
+>1     belong&0xffffff00       0x00010a00      Microsoft
+>1     belong&0xffffff00       0x00010b00      Sonic Foundry
+>1     belong&0xffffff00       0x00010c00      Line 6
+>1     belong&0xffffff00       0x00010d00      Beatnik Inc.
+>1     belong&0xffffff00       0x00010e00      Van Koerving
+>1     belong&0xffffff00       0x00010f00      Altech Systems
+>1     belong&0xffffff00       0x00011000      S & S Research
+>1     belong&0xffffff00       0x00011100      VLSI Technology
+>1     belong&0xffffff00       0x00011200      Chromatic
+>1     belong&0xffffff00       0x00011300      Sapphire
+>1     belong&0xffffff00       0x00011400      IDRC
+>1     belong&0xffffff00       0x00011500      Justonic Tuning
+>1     belong&0xffffff00       0x00011600      TorComp
+>1     belong&0xffffff00       0x00011700      Newtek Inc.
+>1     belong&0xffffff00       0x00011800      Sound Sculpture
+>1     belong&0xffffff00       0x00011900      Walker Technical
+>1     belong&0xffffff00       0x00011a00      Digital Harmony
+>1     belong&0xffffff00       0x00011b00      InVision
+>1     belong&0xffffff00       0x00011c00      T-Square
+>1     belong&0xffffff00       0x00011d00      Nemesys
+>1     belong&0xffffff00       0x00011e00      DBX
+>1     belong&0xffffff00       0x00011f00      Syndyne
+>1     belong&0xffffff00       0x00012000      Bitheadz        
+>1     belong&0xffffff00       0x00012100      Cakewalk
+>1     belong&0xffffff00       0x00012200      Staccato
+>1     belong&0xffffff00       0x00012300      National Semicon.
+>1     belong&0xffffff00       0x00012400      Boom Theory
+>1     belong&0xffffff00       0x00012500      Virtual DSP Corp
+>1     belong&0xffffff00       0x00012600      Antares
+>1     belong&0xffffff00       0x00012700      Angel Software
+>1     belong&0xffffff00       0x00012800      St Louis Music
+>1     belong&0xffffff00       0x00012900      Lyrrus dba G-VOX
+>1     belong&0xffffff00       0x00012a00      Ashley Audio
+>1     belong&0xffffff00       0x00012b00      Vari-Lite
+>1     belong&0xffffff00       0x00012c00      Summit Audio
+>1     belong&0xffffff00       0x00012d00      Aureal Semicon.
+>1     belong&0xffffff00       0x00012e00      SeaSound
+>1     belong&0xffffff00       0x00012f00      U.S. Robotics
+>1     belong&0xffffff00       0x00013000      Aurisis
+>1     belong&0xffffff00       0x00013100      Nearfield Multimedia
+>1     belong&0xffffff00       0x00013200      FM7 Inc.
+>1     belong&0xffffff00       0x00013300      Swivel Systems
+>1     belong&0xffffff00       0x00013400      Hyperactive
+>1     belong&0xffffff00       0x00013500      MidiLite
+>1     belong&0xffffff00       0x00013600      Radical
+>1     belong&0xffffff00       0x00013700      Roger Linn
+>1     belong&0xffffff00       0x00013800      Helicon
+>1     belong&0xffffff00       0x00013900      Event
+>1     belong&0xffffff00       0x00013a00      Sonic Network
+>1     belong&0xffffff00       0x00013b00      Realtime Music
+>1     belong&0xffffff00       0x00013c00      Apogee Digital
+
+>1     belong&0xffffff00       0x00202b00      Medeli Electronics
+>1     belong&0xffffff00       0x00202c00      Charlie Lab
+>1     belong&0xffffff00       0x00202d00      Blue Chip Music
+>1     belong&0xffffff00       0x00202e00      BEE OH Corp
+>1     belong&0xffffff00       0x00202f00      LG Semicon America
+>1     belong&0xffffff00       0x00203000      TESI
+>1     belong&0xffffff00       0x00203100      EMAGIC
+>1     belong&0xffffff00       0x00203200      Behringer
+>1     belong&0xffffff00       0x00203300      Access Music
+>1     belong&0xffffff00       0x00203400      Synoptic
+>1     belong&0xffffff00       0x00203500      Hanmesoft Corp
+>1     belong&0xffffff00       0x00203600      Terratec
+>1     belong&0xffffff00       0x00203700      Proel SpA
+>1     belong&0xffffff00       0x00203800      IBK MIDI
+>1     belong&0xffffff00       0x00203900      IRCAM
+>1     belong&0xffffff00       0x00203a00      Propellerhead Software
+>1     belong&0xffffff00       0x00203b00      Red Sound Systems
+>1     belong&0xffffff00       0x00203c00      Electron ESI AB
+>1     belong&0xffffff00       0x00203d00      Sintefex Audio
+>1     belong&0xffffff00       0x00203e00      Music and More
+>1     belong&0xffffff00       0x00203f00      Amsaro
+>1     belong&0xffffff00       0x00204000      CDS Advanced Technology
+>1     belong&0xffffff00       0x00204100      Touched by Sound
+>1     belong&0xffffff00       0x00204200      DSP Arts
+>1     belong&0xffffff00       0x00204300      Phil Rees Music
+>1     belong&0xffffff00       0x00204400      Stamer Musikanlagen GmbH
+>1     belong&0xffffff00       0x00204500      Soundart
+>1     belong&0xffffff00       0x00204600      C-Mexx Software
+>1     belong&0xffffff00       0x00204700      Klavis Tech.
+>1     belong&0xffffff00       0x00204800      Noteheads AB
+
+0      string                  T707            Roland TR-707 Data
+
+#------------------------------------------------------------------------------
+# sccs:  file(1) magic for SCCS archives
+#
+# SCCS archive structure:
+# \001h01207
+# \001s 00276/00000/00000
+# \001d D 1.1 87/09/23 08:09:20 ian 1 0
+# \001c date and time created 87/09/23 08:09:20 by ian
+# \001e
+# \001u
+# \001U
+# ... etc.
+# Now '\001h' happens to be the same as the 3B20's a.out magic number (0550).
+# *Sigh*. And these both came from various parts of the USG.
+# Maybe we should just switch everybody from SCCS to RCS!
+# Further, you can't just say '\001h0', because the five-digit number
+# is a checksum that could (presumably) have any leading digit,
+# and we don't have regular expression matching yet. 
+# Hence the following official kludge:
+8      string          \001s\                  SCCS archive data
+#------------------------------------------------------------------------------
+# allegro:  file(1) magic for Allegro datafiles
+# Toby Deshane <hac@shoelace.digivill.net>
+#
+0 belong 0x736C6821   Allegro datafile (packed)
+0 belong 0x736C682E   Allegro datafile (not packed/autodetect)
+0 belong 0x736C682B   Allegro datafile (appended exe data)
+#------------------------------------------------------------------------------
+# file(1) magic for cvs(1) files
+# From Hendrik Scholz <hendrik@scholz.net>
+
+0   string /1\ :pserver:    cvs password text file
+
+
+#------------------------------------------------------------------------------
+# vicar:  file(1) magic for VICAR files.
+#
+# From: Ossama Othman <othman@astrosun.tn.cornell.edu
+# VICAR is JPL's in-house spacecraft image processing program
+# VICAR image
+0      string  LBLSIZE=        VICAR image data
+>32    string  BYTE            \b, 8 bits  = VAX byte
+>32    string  HALF            \b, 16 bits = VAX word     = Fortran INTEGER*2
+>32    string  FULL            \b, 32 bits = VAX longword = Fortran INTEGER*4
+>32    string  REAL            \b, 32 bits = VAX longword = Fortran REAL*4
+>32    string  DOUB            \b, 64 bits = VAX quadword = Fortran REAL*8
+>32    string  COMPLEX         \b, 64 bits = VAX quadword = Fortran COMPLEX*8
+# VICAR label file
+43     string  SFDU_LABEL      VICAR label file
+
+#------------------------------------------------------------------------------
+# varied.out:  file(1) magic for various USG systems
+#
+#      Herewith many of the object file formats used by USG systems.
+#      Most have been moved to files for a particular processor,
+#      and deleted if they duplicate other entries.
+#
+0      short           0610            Perkin-Elmer executable
+# AMD 29K
+0      beshort         0572            amd 29k coff noprebar executable
+0      beshort         01572           amd 29k coff prebar executable
+0      beshort         0160007         amd 29k coff archive
+# Cray
+6      beshort         0407            unicos (cray) executable
+# Ultrix 4.3
+596    string          \130\337\377\377        Ultrix core file
+>600   string          >\0             from '%s'
+# BeOS and MAcOS PEF executables
+# From: hplus@zilker.net (Jon Watte)
+0      string          Joy!peffpwpc    header for PowerPC PEF executable
+#
+# ava assembler/linker Uros Platise <uros.platise@ijs.si>
+0       string          avaobj  AVR assembler object code
+>7      string          >\0     version '%s'
+# gnu gmon magic From: Eugen Dedu <dedu@ese-metz.fr>
+0      string          gmon            GNU prof performance data
+>4     long            x               - version %ld
+# From: Dave Pearson <davep@davep.org>
+# Harbour <URL:http://www.harbour-project.org/> HRB files.
+0      string          \xc0HRB         Harbour HRB file
+>4     short           x               version %d
+
+# From: "Stefan A. Haubenthal" <polluks@web.de>
+0      belong          0x000001EB      Plan 9 executable
+
+#------------------------------------------------------------------------------
+# c64:  file(1) magic for various commodore 64 related files
+#
+# From <doj@cubic.org>
+
+0x16500        belong          0x12014100      D64 Image
+0x16500        belong          0x12014180      D71 Image
+0x61800 belong         0x28034400      D81 Image
+0      string          C64\40CARTRIDGE CCS C64 Emultar Cartridge Image
+0      belong          0x43154164      X64 Image
+
+0      string          GCR-1541        GCR Image
+>8     byte            x               version: $i
+>9     byte            x               tracks: %i
+
+9      string          PSUR            ARC archive (c64)
+2      string          -LH1-           LHA archive (c64)
+
+0      string          C64File         PC64 Emulator file
+>8     string          >\0             "%s"
+0      string          C64Image        PC64 Freezer Image
+
+0      beshort         0x38CD          C64 PCLink Image
+0      string          CBM\144\0\0     Power 64 C64 Emulator Snapshot
+
+0      belong          0xFF424CFF      WRAptor packer (c64)
+#------------------------------------------------------------------------------
+# games:  file(1) for games
+
+# Thomas M. Ott (ThMO)
+1      string  =WAD            DOOM data,
+>0     string  =I              main wad
+>0     string  =P              patch wad
+>0     byte    x               unknown junk
+
+# Fabio Bonelli <fabiobonelli@libero.it>
+# Quake II - III data files
+0       string  IDP2           Quake II 3D Model file,
+>20     long    x               %lu skin(s),
+>8      long    x               (%lu x
+>12     long    x              %lu),
+>40     long    x               %lu frame(s),
+>16     long    x               Frame size %lu bytes,
+>24     long   x               %lu vertices/frame,
+>28     long    x              %lu texture coordinates,
+>32     long    x               %lu triangles/frame
+
+0       string  IBSP            Quake
+>4      long    0x26            II Map file (BSP)
+>4      long    0x2E           III Map file (BSP)
+
+0       string  IDS2            Quake II SP2 sprite file
+
+#---------------------------------------------------------------------------
+# Doom and Quake
+# submitted by Nicolas Patrois
+
+# DOOM
+
+0       string  IWAD    DOOM or DOOM ][ world
+0       string  PWAD    DOOM or DOOM ][ extension world
+
+0       string  \xcb\x1dBoom\xe6\xff\x03\x01    Boom or linuxdoom demo
+# some doom lmp files don't match, I've got one beginning with \x6d\x02\x01\x01
+
+24      string  LxD\ 203        Linuxdoom save
+>0      string  x       , name=%s
+>44     string  x       , world=%s
+
+# Quake
+
+0       string  PACK    Quake I or II world or extension
+
+#0       string  -1\x0a  Quake I demo
+#>30     string  x        version %.4s
+#>61     string  x        level %s       
+
+#0       string  5\x0a   Quake I save
+
+# The levels
+
+# Quake 1
+
+0      string  5\x0aIntroduction             Quake I save: start Introduction
+0      string  5\x0athe_Slipgate_Complex     Quake I save: e1m1 The slipgate complex
+0      string  5\x0aCastle_of_the_Damned     Quake I save: e1m2 Castle of the damned
+0      string  5\x0athe_Necropolis           Quake I save: e1m3 The necropolis
+0      string  5\x0athe_Grisly_Grotto        Quake I save: e1m4 The grisly grotto
+0      string  5\x0aZiggurat_Vertigo         Quake I save: e1m8 Ziggurat vertigo (secret)
+0      string  5\x0aGloom_Keep               Quake I save: e1m5 Gloom keep
+0      string  5\x0aThe_Door_To_Chthon       Quake I save: e1m6 The door to Chthon
+0      string  5\x0aThe_House_of_Chthon      Quake I save: e1m7 The house of Chthon
+0      string  5\x0athe_Installation         Quake I save: e2m1 The installation
+0      string  5\x0athe_Ogre_Citadel         Quake I save: e2m2 The ogre citadel
+0      string  5\x0athe_Crypt_of_Decay       Quake I save: e2m3 The crypt of decay (dopefish lives!)
+0      string  5\x0aUnderearth               Quake I save: e2m7 Underearth (secret)
+0      string  5\x0athe_Ebon_Fortress        Quake I save: e2m4 The ebon fortress
+0      string  5\x0athe_Wizard's_Manse       Quake I save: e2m5 The wizard's manse
+0      string  5\x0athe_Dismal_Oubliette     Quake I save: e2m6 The dismal oubliette
+0      string  5\x0aTermination_Central      Quake I save: e3m1 Termination central
+0      string  5\x0aVaults_of_Zin            Quake I save: e3m2 Vaults of Zin
+0      string  5\x0athe_Tomb_of_Terror       Quake I save: e3m3 The tomb of terror
+0      string  5\x0aSatan's_Dark_Delight     Quake I save: e3m4 Satan's dark delight
+0      string  5\x0athe_Haunted_Halls        Quake I save: e3m7 The haunted halls (secret)
+0      string  5\x0aWind_Tunnels             Quake I save: e3m5 Wind tunnels
+0      string  5\x0aChambers_of_Torment      Quake I save: e3m6 Chambers of torment
+0      string  5\x0athe_Sewage_System        Quake I save: e4m1 The sewage system
+0      string  5\x0aThe_Tower_of_Despair     Quake I save: e4m2 The tower of despair
+0      string  5\x0aThe_Elder_God_Shrine     Quake I save: e4m3 The elder god shrine
+0      string  5\x0athe_Palace_of_Hate       Quake I save: e4m4 The palace of hate
+0      string  5\x0aHell's_Atrium            Quake I save: e4m5 Hell's atrium
+0      string  5\x0athe_Nameless_City        Quake I save: e4m8 The nameless city (secret)
+0      string  5\x0aThe_Pain_Maze            Quake I save: e4m6 The pain maze
+0      string  5\x0aAzure_Agony              Quake I save: e4m7 Azure agony
+0      string  5\x0aShub-Niggurath's_Pit     Quake I save: end Shub-Niggurath's pit
+
+# Quake DeathMatch levels
+
+0      string  5\x0aPlace_of_Two_Deaths         Quake I save: dm1 Place of two deaths
+0      string  5\x0aClaustrophobopolis          Quake I save: dm2 Claustrophobopolis
+0      string  5\x0aThe_Abandoned_Base          Quake I save: dm3 The abandoned base
+0      string  5\x0aThe_Bad_Place               Quake I save: dm4 The bad place
+0      string  5\x0aThe_Cistern                 Quake I save: dm5 The cistern
+0      string  5\x0aThe_Dark_Zone               Quake I save: dm6 The dark zone
+
+# Scourge of Armagon
+
+0      string  5\x0aCommand_HQ               Quake I save: start Command HQ
+0      string  5\x0aThe_Pumping_Station      Quake I save: hip1m1 The pumping station
+0      string  5\x0aStorage_Facility         Quake I save: hip1m2 Storage facility
+0      string  5\x0aMilitary_Complex         Quake I save: hip1m5 Military complex (secret)
+0      string  5\x0athe_Lost_Mine            Quake I save: hip1m3 The lost mine
+0      string  5\x0aResearch_Facility        Quake I save: hip1m4 Research facility
+0      string  5\x0aAncient_Realms           Quake I save: hip2m1 Ancient realms
+0      string  5\x0aThe_Gremlin's_Domain     Quake I save: hip2m6 The gremlin's domain (secret)
+0      string  5\x0aThe_Black_Cathedral      Quake I save: hip2m2 The black cathedral
+0      string  5\x0aThe_Catacombs            Quake I save: hip2m3 The catacombs
+0      string  5\x0athe_Crypt__              Quake I save: hip2m4 The crypt
+0      string  5\x0aMortum's_Keep            Quake I save: hip2m5 Mortum's keep
+0      string  5\x0aTur_Torment              Quake I save: hip3m1 Tur torment
+0      string  5\x0aPandemonium              Quake I save: hip3m2 Pandemonium
+0      string  5\x0aLimbo                    Quake I save: hip3m3 Limbo
+0      string  5\x0athe_Edge_of_Oblivion     Quake I save: hipdm1 The edge of oblivion (secret)
+0      string  5\x0aThe_Gauntlet             Quake I save: hip3m4 The gauntlet
+0      string  5\x0aArmagon's_Lair           Quake I save: hipend Armagon's lair
+
+# Malice
+
+0      string  5\x0aThe_Academy      Quake I save: start The academy
+0      string  5\x0aThe_Lab          Quake I save: d1 The lab
+0      string  5\x0aArea_33          Quake I save: d1b Area 33
+0      string  5\x0aSECRET_MISSIONS  Quake I save: d3b Secret missions
+0      string  5\x0aThe_Hospital     Quake I save: d10 The hospital (secret)
+0      string  5\x0aThe_Genetics_Lab Quake I save: d11 The genetics lab (secret)
+0      string  5\x0aBACK_2_MALICE    Quake I save: d4b Back to Malice
+0      string  5\x0aArea44           Quake I save: d1c Area 44
+0      string  5\x0aTakahiro_Towers  Quake I save: d2 Takahiro towers
+0      string  5\x0aA_Rat's_Life     Quake I save: d3 A rat's life
+0      string  5\x0aInto_The_Flood   Quake I save: d4 Into the flood
+0      string  5\x0aThe_Flood        Quake I save: d5 The flood
+0      string  5\x0aNuclear_Plant    Quake I save: d6 Nuclear plant
+0      string  5\x0aThe_Incinerator_Plant    Quake I save: d7 The incinerator plant
+0      string  5\x0aThe_Foundry              Quake I save: d7b The foundry
+0      string  5\x0aThe_Underwater_Base      Quake I save: d8 The underwater base
+0      string  5\x0aTakahiro_Base            Quake I save: d9 Takahiro base
+0      string  5\x0aTakahiro_Laboratories    Quake I save: d12 Takahiro laboratories
+0      string  5\x0aStayin'_Alive    Quake I save: d13 Stayin' alive
+0      string  5\x0aB.O.S.S._HQ      Quake I save: d14 B.O.S.S. HQ
+0      string  5\x0aSHOWDOWN!        Quake I save: d15 Showdown!
+
+# Malice DeathMatch levels
+
+0      string  5\x0aThe_Seventh_Precinct        Quake I save: ddm1 The seventh precinct
+0      string  5\x0aSub_Station                 Quake I save: ddm2 Sub station
+0      string  5\x0aCrazy_Eights!               Quake I save: ddm3 Crazy eights!
+0      string  5\x0aEast_Side_Invertationa      Quake I save: ddm4 East side invertationa
+0      string  5\x0aSlaughterhouse              Quake I save: ddm5 Slaughterhouse
+0      string  5\x0aDOMINO                      Quake I save: ddm6 Domino
+0      string  5\x0aSANDRA'S_LADDER             Quake I save: ddm7 Sandra's ladder
+
+
+0      string  MComprHD        MAME CHD compressed hard disk image,
+>12    belong  x               version %lu
+#------------------------------------------------------------------------------
+# Mavroyanopoulos Nikos <nmav@hellug.gr>
+# mcrypt:   file(1) magic for mcrypt 2.2.x;
+0      string          \0m\3           mcrypt 2.5 encrypted data,
+>4     string          >\0             algorithm: %s,
+>>&1   leshort         >0              keysize: %d bytes,
+>>>&0  string          >\0             mode: %s,
+
+0      string          \0m\2           mcrypt 2.2 encrypted data,
+>3     byte            0               algorithm: blowfish-448,
+>3     byte            1               algorithm: DES,
+>3     byte            2               algorithm: 3DES,
+>3     byte            3               algorithm: 3-WAY,
+>3     byte            4               algorithm: GOST,
+>3     byte            6               algorithm: SAFER-SK64,
+>3     byte            7               algorithm: SAFER-SK128,
+>3     byte            8               algorithm: CAST-128,
+>3     byte            9               algorithm: xTEA,
+>3     byte            10              algorithm: TWOFISH-128,
+>3     byte            11              algorithm: RC2,
+>3     byte            12              algorithm: TWOFISH-192,
+>3     byte            13              algorithm: TWOFISH-256,
+>3     byte            14              algorithm: blowfish-128,
+>3     byte            15              algorithm: blowfish-192,
+>3     byte            16              algorithm: blowfish-256,
+>3     byte            100             algorithm: RC6,
+>3     byte            101             algorithm: IDEA,
+>4     byte            0               mode: CBC,
+>4     byte            1               mode: ECB,
+>4     byte            2               mode: CFB,
+>4     byte            3               mode: OFB,
+>4     byte            4               mode: nOFB,
+>5     byte            0               keymode: 8bit
+>5     byte            1               keymode: 4bit
+>5     byte            2               keymode: SHA-1 hash
+>5     byte            3               keymode: MD5 hash
+
+#------------------------------------------------------------------------------
+# archive:  file(1) magic for archive formats (see also "msdos" for self-
+#           extracting compressed archives)
+#
+# cpio, ar, arc, arj, hpack, lha/lharc, rar, squish, uc2, zip, zoo, etc.
+# pre-POSIX "tar" archives are handled in the C code.
+
+# POSIX tar archives
+257    string          ustar\0         POSIX tar archive
+257    string          ustar\040\040\0 GNU tar archive
+
+# cpio archives
+#
+# Yes, the top two "cpio archive" formats *are* supposed to just be "short".
+# The idea is to indicate archives produced on machines with the same
+# byte order as the machine running "file" with "cpio archive", and
+# to indicate archives produced on machines with the opposite byte order
+# from the machine running "file" with "byte-swapped cpio archive".
+#
+# The SVR4 "cpio(4)" hints that there are additional formats, but they
+# are defined as "short"s; I think all the new formats are
+# character-header formats and thus are strings, not numbers.
+0      short           070707          cpio archive
+0      short           0143561         byte-swapped cpio archive
+0      string          070707          ASCII cpio archive (pre-SVR4 or odc)
+0      string          070701          ASCII cpio archive (SVR4 with no CRC)
+0      string          070702          ASCII cpio archive (SVR4 with CRC)
+
+# Debian package (needs to go before regular portable archives)
+#
+0      string          !<arch>\ndebian
+>8     string          debian-split    part of multipart Debian package
+>8     string          debian-binary   Debian binary package
+>68    string          >\0             (format %s)
+>81    string          bz2             \b, uses bzip2 compression
+>84    string          gz              \b, uses gzip compression
+#>136  ledate          x               created: %s
+
+# other archives
+0      long            0177555         very old archive
+0      short           0177555         very old PDP-11 archive
+0      long            0177545         old archive
+0      short           0177545         old PDP-11 archive
+0      long            0100554         apl workspace
+0      string          =<ar>           archive
+
+# MIPS archive (needs to go before regular portable archives)
+#
+0      string  !<arch>\n__________E    MIPS archive
+>20    string  U                       with MIPS Ucode members
+>21    string  L                       with MIPSEL members
+>21    string  B                       with MIPSEB members
+>19    string  L                       and an EL hash table
+>19    string  B                       and an EB hash table
+>22    string  X                       -- out of date
+
+0      string          -h-             Software Tools format archive text
+
+#
+# XXX - why are there multiple <ar> thingies?  Note that 0x213c6172 is
+# "!<ar", so, for new-style (4.xBSD/SVR2andup) archives, we have:
+#
+# 0    string          !<arch>         current ar archive
+# 0    long            0x213c6172      archive file
+#
+# and for SVR1 archives, we have:
+#
+# 0    string          \<ar>           System V Release 1 ar archive
+# 0    string          =<ar>           archive
+#
+# XXX - did Aegis really store shared libraries, breakpointed modules,
+# and absolute code program modules in the same format as new-style
+# "ar" archives?
+#
+0      string          !<arch>         current ar archive
+>8     string          __.SYMDEF       random library
+>0     belong          =65538          - pre SR9.5
+>0     belong          =65539          - post SR9.5
+>0     beshort         2               - object archive
+>0     beshort         3               - shared library module
+>0     beshort         4               - debug break-pointed module
+>0     beshort         5               - absolute code program module
+0      string          \<ar>           System V Release 1 ar archive
+0      string          =<ar>           archive
+#
+# XXX - from "vax", which appears to collect a bunch of byte-swapped
+# thingies, to help you recognize VAX files on big-endian machines;
+# with "leshort", "lelong", and "string", that's no longer necessary....
+#
+0      belong          0x65ff0000      VAX 3.0 archive
+0      belong          0x3c61723e      VAX 5.0 archive
+#
+0      long            0x213c6172      archive file
+0      lelong          0177555         very old VAX archive
+0      leshort         0177555         very old PDP-11 archive
+#
+# XXX - "pdp" claims that 0177545 can have an __.SYMDEF member and thus
+# be a random library (it said 0xff65 rather than 0177545).
+#
+0      lelong          0177545         old VAX archive
+>8     string          __.SYMDEF       random library
+0      leshort         0177545         old PDP-11 archive
+>8     string          __.SYMDEF       random library
+#
+# From "pdp" (but why a 4-byte quantity?)
+#
+0      lelong          0x39bed         PDP-11 old archive
+0      lelong          0x39bee         PDP-11 4.0 archive
+
+# ARC archiver, from Daniel Quinlan (quinlan@yggdrasil.com)
+#
+# The first byte is the magic (0x1a), byte 2 is the compression type for
+# the first file (0x01 through 0x09), and bytes 3 to 15 are the MS-DOS
+# filename of the first file (null terminated).  Since some types collide
+# we only test some types on basis of frequency: 0x08 (83%), 0x09 (5%),
+# 0x02 (5%), 0x03 (3%), 0x04 (2%), 0x06 (2%).  0x01 collides with terminfo.
+0      lelong&0x8080ffff       0x0000081a      ARC archive data, dynamic LZW
+0      lelong&0x8080ffff       0x0000091a      ARC archive data, squashed
+0      lelong&0x8080ffff       0x0000021a      ARC archive data, uncompressed
+0      lelong&0x8080ffff       0x0000031a      ARC archive data, packed
+0      lelong&0x8080ffff       0x0000041a      ARC archive data, squeezed
+0      lelong&0x8080ffff       0x0000061a      ARC archive data, crunched
+
+# Acorn archive formats (Disaster prone simpleton, m91dps@ecs.ox.ac.uk)
+# I can't create either SPARK or ArcFS archives so I have not tested this stuff
+# [GRR:  the original entries collide with ARC, above; replaced with combined
+#  version (not tested)]
+#0     byte            0x1a            RISC OS archive
+#>1    string          archive         (ArcFS format)
+#0     string          \032archive     RISC OS archive (ArcFS format)
+0       string          \032            RISC OS archive (spark format)
+0       string          Archive\000     RISC OS archive (ArcFS format)
+
+# ARJ archiver (jason@jarthur.Claremont.EDU)
+0      leshort         0xea60          ARJ archive data
+>5     byte            x               \b, v%d,
+>8     byte            &0x04           multi-volume,
+>8     byte            &0x10           slash-switched,
+>8     byte            &0x20           backup,
+>34    string          x               original name: %s,
+>7     byte            0               os: MS-DOS
+>7     byte            1               os: PRIMOS
+>7     byte            2               os: Unix
+>7     byte            3               os: Amiga
+>7     byte            4               os: Macintosh
+>7     byte            5               os: OS/2
+>7     byte            6               os: Apple ][ GS
+>7     byte            7               os: Atari ST
+>7     byte            8               os: NeXT
+>7     byte            9               os: VAX/VMS
+>3     byte            >0              %d]
+
+# HA archiver (Greg Roelofs, newt@uchicago.edu)
+# This is a really bad format. A file containing HAWAII will match this...
+#0     string          HA              HA archive data,
+#>2    leshort         =1              1 file,
+#>2    leshort         >1              %u files,
+#>4    byte&0x0f       =0              first is type CPY
+#>4    byte&0x0f       =1              first is type ASC
+#>4    byte&0x0f       =2              first is type HSC
+#>4    byte&0x0f       =0x0e           first is type DIR
+#>4    byte&0x0f       =0x0f           first is type SPECIAL
+
+# HPACK archiver (Peter Gutmann, pgut1@cs.aukuni.ac.nz)
+0      string          HPAK            HPACK archive data
+
+# JAM Archive volume format, by Dmitry.Kohmanyuk@UA.net
+0      string          \351,\001JAM\           JAM archive,
+>7     string          >\0                     version %.4s
+>0x26  byte            =0x27                   -
+>>0x2b string          >\0                     label %.11s,
+>>0x27 lelong          x                       serial %08x,
+>>0x36 string          >\0                     fstype %.8s
+
+# LHARC/LHA archiver (Greg Roelofs, newt@uchicago.edu)
+2      string          -lh0-           LHarc 1.x archive data [lh0]
+2      string          -lh1-           LHarc 1.x archive data [lh1]
+2      string          -lz4-           LHarc 1.x archive data [lz4]
+2      string          -lz5-           LHarc 1.x archive data [lz5]
+#      [never seen any but the last; -lh4- reported in comp.compression:]
+2      string          -lzs-           LHa 2.x? archive data [lzs]
+2      string          -lh\40-         LHa 2.x? archive data [lh ]
+2      string          -lhd-           LHa 2.x? archive data [lhd]
+2      string          -lh2-           LHa 2.x? archive data [lh2]
+2      string          -lh3-           LHa 2.x? archive data [lh3]
+2      string          -lh4-           LHa (2.x) archive data [lh4]
+2      string          -lh5-           LHa (2.x) archive data [lh5]
+2      string          -lh6-           LHa (2.x) archive data [lh6]
+2      string          -lh7-           LHa (2.x) archive data [lh7]
+>20    byte            x               - header level %d
+
+# RAR archiver (Greg Roelofs, newt@uchicago.edu)
+0      string          Rar!            RAR archive data,
+>44    byte            x               v%0x,
+>35    byte            0               os: MS-DOS
+>35    byte            1               os: OS/2
+>35    byte            2               os: Win32
+>35    byte            3               os: Unix
+
+# SQUISH archiver (Greg Roelofs, newt@uchicago.edu)
+0      string          SQSH            squished archive data (Acorn RISCOS)
+
+# UC2 archiver (Greg Roelofs, newt@uchicago.edu)
+# I can't figure out the self-extracting form of these buggers...
+0      string          UC2\x1a         UC2 archive data
+
+# ZIP archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu)
+0      string          PK\003\004      Zip archive data
+>4     byte            0x09            \b, at least v0.9 to extract
+>4     byte            0x0a            \b, at least v1.0 to extract
+>4     byte            0x0b            \b, at least v1.1 to extract
+>4     byte            0x14            \b, at least v2.0 to extract
+
+# Zoo archiver
+20     lelong          0xfdc4a7dc      Zoo archive data
+>4     byte            >48             \b, v%c.
+>>6    byte            >47             \b%c
+>>>7   byte            >47             \b%c
+>32    byte            >0              \b, modify: v%d
+>>33   byte            x               \b.%d+
+>42    lelong          0xfdc4a7dc      \b,
+>>70   byte            >0              extract: v%d
+>>>71  byte            x               \b.%d+
+
+# Shell archives
+10     string          #\ This\ is\ a\ shell\ archive  shell archive text
+
+#
+# LBR. NB: May conflict with the questionable 
+#          "binary Computer Graphics Metafile" format.
+#
+0       string  \0\ \ \ \ \ \ \ \ \ \ \ \0\0    LBR archive data
+#
+# PMA (CP/M derivative of LHA)
+#
+2       string          -pm0-           PMarc archive data [pm0]
+2       string          -pm1-           PMarc archive data [pm1]
+2       string          -pm2-           PMarc archive data [pm2]
+2       string          -pms-           PMarc SFX archive (CP/M, DOS)
+5       string          -pc1-           PopCom compressed executable (CP/M)
+
+# From Rafael Laboissiere <rafael@laboissiere.net>
+# The Project Revision Control System (see
+# http://prcs.sourceforge.net) generates a packaged project
+# file which is recognized by the following entry: 
+0      leshort         0xeb81  PRCS packaged project
+
+# Microsoft cabinets 
+# by David Necas (Yeti) <yeti@physics.muni.cz>
+#0     string  MSCF\0\0\0\0    Microsoft cabinet file data,
+#>25   byte    x               v%d
+#>24   byte    x               \b.%d
+# MPi: All CABs have version 1.3, so this is pointless.
+# Better magic in debian-additions.
+
+# GTKtalog catalogs 
+# by David Necas (Yeti) <yeti@physics.muni.cz>
+4      string  gtktalog\       GTKtalog catalog data,
+>13    string  3               version 3
+>>14   beshort 0x677a          (gzipped)
+>>14   beshort !0x677a         (not gzipped)
+>13    string  >3              version %s
+
+############################################################################
+# Parity archive reconstruction file, the 'par' file format now used on Usenet.
+0       string          PAR\0  PARity archive data
+>48    leshort         =0      - Index file
+>48    leshort         >0      - file number %d
+
+# Felix von Leitner <felix-file@fefe.de>
+0      string  d8:announce     BitTorrent file
+
+# Atari MSA archive - Teemu Hukkanen <tjhukkan@iki.fi>
+0       beshort 0x0e0f          Atari MSA archive data
+>2      beshort x              \b, %d sectors per track
+>4      beshort 0              \b, 1 sided
+>4      beshort 1              \b, 2 sided
+>6      beshort x              \b, starting track: %d
+>8      beshort x              \b, ending track: %d
+
+# Alternate ZIP string (amc@arwen.cs.berkeley.edu)
+0      string  PK00PK\003\004  Zip archive data
+
+# ACE archive (from http://www.wotsit.org/download.asp?f=ace)
+# by Stefan `Sec` Zehl <sec@42.org>
+7      string          **ACE**         ACE compressed archive
+>15    byte    >0              version %d
+>16    byte    =0x00           \b, from MS-DOS
+>16    byte    =0x01           \b, from OS/2
+>16    byte    =0x02           \b, from Win/32
+>16    byte    =0x03           \b, from Unix
+>16    byte    =0x04           \b, from MacOS
+>16    byte    =0x05           \b, from WinNT
+>16    byte    =0x06           \b, from Primos
+>16    byte    =0x07           \b, from AppleGS
+>16    byte    =0x08           \b, from Atari
+>16    byte    =0x09           \b, from Vax/VMS
+>16    byte    =0x0A           \b, from Amiga
+>16    byte    =0x0B           \b, from Next
+>14    byte    x               \b, version %d to extract
+>5     leshort &0x0080         \b, multiple volumes,
+>>17   byte    x               \b (part %d),
+>5     leshort &0x0002         \b, contains comment
+>5     leshort &0x0200         \b, sfx
+>5     leshort &0x0400         \b, small dictionary
+>5     leshort &0x0800         \b, multi-volume
+>5     leshort &0x1000         \b, contains AV-String
+>>30   string\x16*UNREGISTERED\x20VERSION*     (unregistered)
+>5     leshort &0x2000         \b, with recovery record
+>5     leshort &0x4000         \b, locked
+>5     leshort &0x8000         \b, solid
+# Date in MS-DOS format (whatever that is)
+#>18   lelong  x               Created on
+
+# sfArk : compression program for Soundfonts (sf2) by Dirk Jagdmann
+# <doj@cubic.org>
+0x1A   string  sfArk           sfArk compressed Soundfont
+>0x15  string  2
+>>0x1  string  >\0             Version %s
+>>0x2A string  >\0             : %s
+
+#------------------------------------------------------------------------------
+# citrus locale declaration
+#
+
+0      string          RuneCT          Citrus locale declaration for LC_CTYPE
+
+
+#------------------------------------------------------------------------------
+# compress:  file(1) magic for pure-compression formats (no archives)
+#
+# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.
+#
+# Formats for various forms of compressed data
+# Formats for "compress" proper have been moved into "compress.c",
+# because it tries to uncompress it to figure out what's inside.
+
+# standard unix compress
+0      string          \037\235        compress'd data
+>2     byte&0x80       >0              block compressed
+>2     byte&0x1f       x               %d bits
+
+# gzip (GNU zip, not to be confused with Info-ZIP or PKWARE zip archiver)
+#   Edited by Chris Chittleborough <cchittleborough@yahoo.com.au>, March 2002
+#      * Original filename is only at offset 10 if "extra field" absent
+#      * Produce shorter output - notably, only report compression methods
+#        other than 8 ("deflate", the only method defined in RFC 1952).
+0       string          \037\213        gzip compressed data
+>2     byte            <8              \b, reserved method
+>2     byte            >8              \b, unknown method
+>3     byte            &0x01           \b, ASCII
+>3     byte            &0x02           \b, continuation
+>3     byte            &0x04           \b, extra field
+>3     byte&0xC        =0x08
+>>10   string          x               \b, was "%s"
+>9     byte            =0x00           \b, from MS-DOS
+>9     byte            =0x01           \b, from Amiga
+>9     byte            =0x02           \b, from VMS
+>9     byte            =0x03           \b, from Unix
+>9     byte            =0x05           \b, from Atari
+>9     byte            =0x06           \b, from OS/2
+>9     byte            =0x07           \b, from MacOS
+>9     byte            =0x0A           \b, from Tops/20
+>9     byte            =0x0B           \b, from Win/32
+>3     byte            &0x10           \b, comment
+>3     byte            &0x20           \b, encrypted
+### >4 ledate          x               last modified: %s,
+>8     byte            2               \b, max compression
+>8     byte            4               \b, max speed
+
+# packed data, Huffman (minimum redundancy) codes on a byte-by-byte basis
+0      string          \037\036        packed data
+>2     belong          >1              \b, %d characters originally
+>2     belong          =1              \b, %d character originally
+#
+# This magic number is byte-order-independent.
+0      short           0x1f1f          old packed data
+
+# XXX - why *two* entries for "compacted data", one of which is
+# byte-order independent, and one of which is byte-order dependent?
+#
+0      short           0x1fff          compacted data
+# This string is valid for SunOS (BE) and a matching "short" is listed
+# in the Ultrix (LE) magic file.
+0      string          \377\037        compacted data
+0      short           0145405         huf output
+
+# bzip2
+0      string          BZh             bzip2 compressed data
+>3     byte            >47             \b, block size = %c00k
+
+# squeeze and crunch
+# Michael Haardt <michael@cantor.informatik.rwth-aachen.de>
+0      beshort         0x76FF          squeezed data,
+>4     string          x               original name %s
+0      beshort         0x76FE          crunched data,
+>2     string          x               original name %s
+0      beshort         0x76FD          LZH compressed data,
+>2     string          x               original name %s
+
+# Freeze
+0      string          \037\237        frozen file 2.1
+0      string          \037\236        frozen file 1.0 (or gzip 0.5)
+
+# SCO compress -H (LZH)
+0      string          \037\240        SCO compress -H (LZH) data
+
+# European GSM 06.10 is a provisional standard for full-rate speech
+# transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse
+# excitation/long term prediction) coding at 13 kbit/s.
+#
+# There's only a magic nibble (4 bits); that nibble repeats every 33
+# bytes.  This isn't suited for use, but maybe we can use it someday.
+#
+# This will cause very short GSM files to be declared as data and
+# mismatches to be declared as data too!
+#0     byte&0xF0       0xd0            data
+#>33   byte&0xF0       0xd0
+#>66   byte&0xF0       0xd0
+#>99   byte&0xF0       0xd0
+#>132  byte&0xF0       0xd0            GSM 06.10 compressed audio
+
+# bzip a block-sorting file compressor
+#      by Julian Seward <sewardj@cs.man.ac.uk> and others
+#
+0      string          BZ              bzip compressed data
+>2     byte            x               \b, version: %c
+>3     string          =1              \b, compression block size 100k
+>3     string          =2              \b, compression block size 200k
+>3     string          =3              \b, compression block size 300k
+>3     string          =4              \b, compression block size 400k
+>3     string          =5              \b, compression block size 500k
+>3     string          =6              \b, compression block size 600k
+>3     string          =7              \b, compression block size 700k
+>3     string          =8              \b, compression block size 800k
+>3     string          =9              \b, compression block size 900k
+
+# lzop from <markus.oberhumer@jk.uni-linz.ac.at>
+0      string          \x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a    lzop compressed data
+>9     beshort         <0x0940
+>>9    byte&0xf0       =0x00           - version 0.
+>>9    beshort&0x0fff  x               \b%03x,
+>>13   byte            1               LZO1X-1,
+>>13   byte            2               LZO1X-1(15),
+>>13   byte            3               LZO1X-999,
+## >>22        bedate          >0              last modified: %s,
+>>14   byte            =0x00           os: MS-DOS
+>>14   byte            =0x01           os: Amiga
+>>14   byte            =0x02           os: VMS
+>>14   byte            =0x03           os: Unix
+>>14   byte            =0x05           os: Atari
+>>14   byte            =0x06           os: OS/2
+>>14   byte            =0x07           os: MacOS
+>>14   byte            =0x0A           os: Tops/20
+>>14   byte            =0x0B           os: WinNT
+>>14   byte            =0x0E           os: Win32
+>9     beshort         >0x0939
+>>9    byte&0xf0       =0x00           - version 0.
+>>9    byte&0xf0       =0x10           - version 1.
+>>9    byte&0xf0       =0x20           - version 2.
+>>9    beshort&0x0fff  x               \b%03x,
+>>15   byte            1               LZO1X-1,
+>>15   byte            2               LZO1X-1(15),
+>>15   byte            3               LZO1X-999,
+## >>25        bedate          >0              last modified: %s,
+>>17   byte            =0x00           os: MS-DOS
+>>17   byte            =0x01           os: Amiga
+>>17   byte            =0x02           os: VMS
+>>17   byte            =0x03           os: Unix
+>>17   byte            =0x05           os: Atari
+>>17   byte            =0x06           os: OS/2
+>>17   byte            =0x07           os: MacOS
+>>17   byte            =0x0A           os: Tops/20
+>>17   byte            =0x0B           os: WinNT
+>>17   byte            =0x0E           os: Win32
+
+# 4.3BSD-Quasijarus Strong Compression
+# http://minnie.tuhs.org/Quasijarus/compress.html
+0      string          \037\241        Quasijarus strong compressed data
+
+# From: Cory Dikkers <cdikkers@swbell.net>
+0      string          XPKF            Amiga xpkf.library compressed data
+0      string          PP11            Power Packer 1.1 compressed data
+0      string          PP20            Power Packer 2.0 compressed data,
+>4     belong          0x09090909      fast compression
+>4     belong          0x090A0A0A      mediocre compression
+>4     belong          0x090A0B0B      good compression
+>4     belong          0x090A0C0C      very good compression
+>4     belong          0x090A0C0D      best compression
+
+# 7z archiver, from Thomas Klausner (wiz@danbala.tuwien.ac.at)
+# http://www.7-zip.org or DOC/7zFormat.txt 
+#
+0      string          7z\274\257\047\034      7z archive data,
+>6     byte            x                       version %d
+>7     byte            x                       \b.%d
+
+# AFX compressed files (Wolfram Kleff)
+2      string          -afx-           AFX compressed file data
+
+#------------------------------------------------------------------------------
+# fsav:  file(1) magic for datafellows fsav virus definition files
+# Anthon van der Neut (anthon@mnt.org)
+0      beshort         0x1575          fsav (linux) macro virus
+>8     leshort         >0              (%d-
+>11    byte            >0              \b%02d-
+>10    byte            >0              \b%02d)
+
+# comment this out for now because it regognizes every file where
+# the eighth character is \n
+#8     byte            0x0a
+#>12   byte            0x07
+#>11   leshort         >0              fsav (linux) virus (%d-
+#>10   byte            0               \b01-
+#>10   byte            1               \b02-
+#>10   byte            2               \b03-
+#>10   byte            3               \b04-
+#>10   byte            4               \b05-
+#>10   byte            5               \b06-
+#>10   byte            6               \b07-
+#>10   byte            7               \b08-
+#>10   byte            8               \b08-
+#>10   byte            9               \b10-
+#>10   byte            10              \b11-
+#>10   byte            11              \b12-
+#>9    byte            >0              \b%02d)
+
+#------------------------------------------------------------------------------
+# GEOS files (Vidar Madsen, vidar@gimp.org)
+# semi-commonly used in embedded and handheld systems.
+0      belong  0xc745c153      GEOS
+>40    byte    1       executable
+>40    byte    2       VMFile
+>40    byte    3       binary
+>40    byte    4       directory label
+>40    byte    <1      unknown
+>40    byte    >4      unknown
+>4     string  >\0     \b, name "%s"
+#>44   short   x       \b, version %d
+#>46   short   x       \b.%d
+#>48   short   x       \b, rev %d
+#>50   short   x       \b.%d
+#>52   short   x       \b, proto %d
+#>54   short   x       \br%d
+#>168  string  >\0     \b, copyright "%s"
+#------------------------------------------------------------
+# Java ByteCode
+# From Larry Schwimmer (schwim@cs.stanford.edu)
+0      belong          0xcafebabe      compiled Java class data,
+>6     beshort x       version %d.
+>4     beshort x       \b%d
+#------------------------------------------------------------
+# Java serialization
+# From Martin Pool (m.pool@pharos.com.au)
+0      beshort         0xaced          Java serialization data
+>2     beshort         >0x0004         \b, version %d
+
+#------------------------------------------------------------------------------
+# mlssa: file(1) magic for MLSSA datafiles
+#
+0              lelong          0xffffabcd      MLSSA datafile,
+>4             leshort         x               algorithm %d,
+>10            lelong          x               %d samples
+
+#------------------------------------------------------------------------------
+# mmdf:  file(1) magic for MMDF mail files
+#
+0      string  \001\001\001\001        MMDF mailbox
+
+#------------------------------------------------------------------------------
+# msdos:  file(1) magic for MS-DOS files
+#
+
+# .BAT files (Daniel Quinlan, quinlan@yggdrasil.com)
+0      string/c        @echo\ off      MS-DOS batch file text
+
+# XXX - according to Microsoft's spec, at an offset of 0x3c in a
+# PE-format executable is the offset in the file of the PE header;
+# unfortunately, that's a little-endian offset, and there's no way
+# to specify an indirect offset with a specified byte order.
+# So, for now, we assume the standard MS-DOS stub, which puts the
+# PE header at 0x80 = 128.
+#
+# Required OS version and subsystem version were 4.0 on some NT 3.51
+# executables built with Visual C++ 4.0, so it's not clear that
+# they're interesting.  The user version was 0.0, but there's
+# probably some linker directive to set it.  The linker version was
+# 3.0, except for one ".exe" which had it as 4.20 (same damn linker!).
+#
+128    string          PE\0\0  MS Windows PE
+>150   leshort&0x0100  >0      32-bit
+>132   leshort         0x0     unknown processor
+>132   leshort         0x14c   Intel 80386
+>132   leshort         0x166   MIPS R4000
+>132   leshort         0x184   Alpha
+>132   leshort         0x268   Motorola 68000
+>132   leshort         0x1f0   PowerPC
+>132   leshort         0x290   PA-RISC
+>148   leshort         >27
+>>220  leshort         0       unknown subsystem
+>>220  leshort         1       native
+>>220  leshort         2       GUI
+>>220  leshort         3       console
+>>220  leshort         7       POSIX
+>150   leshort&0x2000  =0      executable
+#>>136 ledate          x       stamp %s,
+>>150  leshort&0x0001  >0      not relocatable
+#>>150 leshort&0x0004  =0      with line numbers,
+#>>150 leshort&0x0008  =0      with local symbols,
+#>>150 leshort&0x0200  =0      with debug symbols,
+>>150  leshort&0x1000  >0      system file
+#>>148 leshort         >0
+#>>>154        byte            x       linker %d
+#>>>155        byte            x       \b.%d,
+#>>148 leshort         >27
+#>>>192        leshort         x       requires OS %d
+#>>>194        leshort         x       \b.%d,
+#>>>196        leshort         x       user version %d
+#>>>198        leshort         x       \b.%d,
+#>>>200        leshort         x       subsystem version %d
+#>>>202        leshort         x       \b.%d,
+>150   leshort&0x2000  >0      DLL
+#>>136 ledate          x       stamp %s,
+>>150  leshort&0x0001  >0      not relocatable
+#>>150 leshort&0x0004  =0      with line numbers,
+#>>150 leshort&0x0008  =0      with local symbols,
+#>>150 leshort&0x0200  =0      with debug symbols,
+>>150  leshort&0x1000  >0      system file
+#>>148 leshort         >0
+#>>>154        byte            x       linker %d
+#>>>155        byte            x       \b.%d,
+#>>148 leshort         >27
+#>>>192        leshort         x       requires OS %d
+#>>>194        leshort         x       \b.%d,
+#>>>196        leshort         x       user version %d
+#>>>198        leshort         x       \b.%d,
+#>>>200        leshort         x       subsystem version %d
+#>>>202        leshort         x       \b.%d,
+0      leshort         0x14c   MS Windows COFF Intel 80386 object file
+#>4    ledate          x       stamp %s
+0      leshort         0x166   MS Windows COFF MIPS R4000 object file
+#>4    ledate          x       stamp %s
+0      leshort         0x184   MS Windows COFF Alpha object file
+#>4    ledate          x       stamp %s
+0      leshort         0x268   MS Windows COFF Motorola 68000 object file
+#>4    ledate          x       stamp %s
+0      leshort         0x1f0   MS Windows COFF PowerPC object file
+#>4    ledate          x       stamp %s
+0      leshort         0x290   MS Windows COFF PA-RISC object file
+#>4    ledate          x       stamp %s
+
+# .EXE formats (Greg Roelofs, newt@uchicago.edu)
+#
+0      string  MZ              MS-DOS executable (EXE)
+>24    string  @               \b, OS/2 or MS Windows
+>>0xe7 string  LH/2\ Self-Extract      \b, %s
+>>0xe9 string  PKSFX2          \b, %s
+>>122  string  Windows\ self-extracting\ ZIP   \b, %s
+>0x1c  string  RJSX\xff\xff    \b, ARJ SFX
+>0x1c  string  diet\xf9\x9c    \b, diet compressed
+>0x1c  string  LZ09            \b, LZEXE v0.90 compressed
+>0x1c  string  LZ91            \b, LZEXE v0.91 compressed
+>0x1e  string  Copyright\ 1989-1990\ PKWARE\ Inc.      \b, PKSFX
+# JM: 0x1e "PKLITE Copr. 1990-92 PKWARE Inc. All Rights Reserved\7\0\0\0"
+>0x1e  string  PKLITE\ Copr.   \b, %.6s compressed
+>0x24  string  LHa's\ SFX      \b, %.15s
+>0x24  string  LHA's\ SFX      \b, %.15s
+>1638  string  -lh5-           \b, LHa SFX archive v2.13S
+>7195  string  Rar!            \b, RAR self-extracting archive
+#
+# [GRR 950118:  file 3.15 has a buffer-size limitation; offsets bigger than
+#   8161 bytes are ignored.  To make the following entries work, increase
+#   HOWMANY in file.h to 32K at least, and maybe to 70K or more for OS/2,
+#   NT/Win32 and VMS.]
+# [GRR:  some company sells a self-extractor/displayer for image data(!)]
+#
+>11696 string  PK\003\004      \b, PKZIP SFX archive v1.1
+>13297 string  PK\003\004      \b, PKZIP SFX archive v1.93a
+>15588 string  PK\003\004      \b, PKZIP2 SFX archive v1.09
+>15770 string  PK\003\004      \b, PKZIP SFX archive v2.04g
+>28374 string  PK\003\004      \b, PKZIP2 SFX archive v1.02
+#
+# Info-ZIP self-extractors
+#    these are the DOS versions:
+>25115 string  PK\003\004      \b, Info-ZIP SFX archive v5.12
+>26331 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
+#    these are the OS/2 versions (OS/2 is flagged above):
+>47031 string  PK\003\004      \b, Info-ZIP SFX archive v5.12
+>49845 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
+#    this is the NT/Win32 version:
+>69120 string  PK\003\004      \b, Info-ZIP NT SFX archive v5.12 w/decryption
+#
+# TELVOX Teleinformatica CODEC self-extractor for OS/2:
+>49801 string  \x79\xff\x80\xff\x76\xff        \b, CODEC archive v3.21
+>>49824        leshort         =1                      \b, 1 file
+>>49824        leshort         >1                      \b, %u files
+
+# .COM formats (Daniel Quinlan, quinlan@yggdrasil.com)
+# Uncommenting only the first two lines will cover about 2/3 of COM files,
+# but it isn't feasible to match all COM files since there must be at least
+# two dozen different one-byte "magics".
+#0     byte            0xe9            MS-DOS executable (COM)
+#>6    string  SFX\ of\ LHarc  (%s)
+#0     byte            0x8c            MS-DOS executable (COM)
+# 0xeb conflicts with "sequent" magic
+#0     byte            0xeb            MS-DOS executable (COM)
+#0     byte            0xb8            MS-DOS executable (COM)
+
+# miscellaneous formats
+0      string          LZ              MS-DOS executable (built-in)
+#0     byte            0xf0            MS-DOS program library data
+#
+
+#
+# Windows Registry files.
+#
+0      string          regf            Windows NT registry file
+0      string          CREG            Windows 95 registry file
+
+
+# AAF files:
+# <stuartc@rd.bbc.co.uk> Stuart Cunningham
+0      string  \320\317\021\340\241\261\032\341AAFB\015\000OM\006\016\053\064\001\001\001\377                  AAF legacy file using MS Structured Storage
+>30    byte    9               (512B sectors)
+>30    byte    12              (4kB sectors)
+0      string  \320\317\021\340\241\261\032\341\001\002\001\015\000\002\000\000\006\016\053\064\003\002\001\001                        AAF file using MS Structured Storage
+>30    byte    9               (512B sectors)
+>30    byte    12              (4kB sectors)
+
+# Popular applications
+2080   string  Microsoft\ Word\ 6.0\ Document  %s
+2080   string  Documento\ Microsoft\ Word\ 6 Spanish Microsoft Word 6 document data
+# Pawel Wiecek <coven@i17linuxb.ists.pwr.wroc.pl> (for polish Word)
+2112   string  MSWordDoc                       Microsoft Word document data
+#
+0      belong  0x31be0000                      Microsoft Word Document
+#
+0       string  PO^Q`                          Microsoft Word 6.0 Document
+#
+0      string  \376\067\0\043                  Microsoft Office Document
+0      string  \320\317\021\340\241\261\032\341        Microsoft Office Document
+0      string  \333\245-\0\0\0                 Microsoft Office Document
+#
+2080   string  Microsoft\ Excel\ 5.0\ Worksheet        %s
+2080   string  Foglio\ di\ lavoro\ Microsoft\ Exce     %s
+#
+# Pawel Wiecek <coven@i17linuxb.ists.pwr.wroc.pl> (for polish Excel)
+2114   string  Biff5           Microsoft Excel 5.0 Worksheet
+# Italian MS-Excel
+2121   string  Biff5           Microsoft Excel 5.0 Worksheet
+0      string  \x09\x04\x06\x00\x00\x00\x10\x00        Microsoft Excel Worksheet
+#
+0      belong  0x00001a00      Lotus 1-2-3
+>4     belong  0x00100400      wk3 document data
+>4     belong  0x02100400      wk4 document data
+>4     belong  0x07800100      fm3 or fmb document data
+>4     belong  0x07800000      fm3 or fmb document data
+#
+0      belong  0x00000200      Lotus 1-2-3
+>4     belong  0x06040600      wk1 document data
+>4     belong  0x06800200      fmt document data
+
+# Help files
+0      string  ?_\3\0          MS Windows Help Data
+
+#  DeIsL1.isu what this is I don't know
+0      string  \161\250\000\000\001\002        DeIsL1.isu whatever that is
+
+# Winamp .avs
+#0     string  Nullsoft\ AVS\ Preset\ \060\056\061\032 A plug in for Winamp ms-windows Freeware media player
+0      string  Nullsoft\ AVS\ Preset\  Winamp plug in
+
+# Hyper terminal:
+0      string  HyperTerminal\  hyperterm
+>15    string  1.0\ --\ HyperTerminal\ data\ file      MS-windows Hyperterminal
+
+# Windows Metafont .WMF
+0      string  \327\315\306\232\000\000\000\000\000\000        ms-windows metafont .wmf
+
+#tz3 files whatever that is (MS Works files)
+0      string  \003\001\001\004\070\001\000\000        tz3 ms-works file
+0      string  \003\002\001\004\070\001\000\000        tz3 ms-works file
+0      string  \003\003\001\004\070\001\000\000        tz3 ms-works file
+
+# PGP sig files .sig
+#0 string \211\000\077\003\005\000\063\237\127 065 to  \027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\065\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\066\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\067\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\070\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\077\003\005\000\063\237\127\071\027\266\151\064\005\045\101\233\021\002 PGP sig
+0 string \211\000\225\003\005\000\062\122\207\304\100\345\042 PGP sig
+
+# windows zips files .dmf
+0      string  MDIF\032\000\010\000\000\000\372\046\100\175\001\000\001\036\001\000 Ms-windows special zipped file
+
+
+# Windows help file FTG FTS
+0      string  \164\146\115\122\012\000\000\000\001\000\000\000        ms-windows help cache
+
+# grp old windows 3.1 group files
+0 string  \120\115\103\103     Ms-windows 3.1 group files
+
+
+# lnk files windows symlinks
+0      string  \114\000\000\000\001\024\002\000\000\000\000\000\300\000\000\000\000\000\000\106        ms-Windows shortcut
+
+#ico files
+0      string  \102\101\050\000\000\000\056\000\000\000\000\000\000\000        Icon for ms-windows
+
+# Windows icons (Ian Springer <ips@fpk.hp.com>)
+0      string  \000\000\001\000        ms-windows icon resource
+>4     byte    1                       - 1 icon
+>4     byte    >1                      - %d icons
+>>6    byte    >0                      \b, %dx
+>>>7   byte    >0                      \b%d
+>>8    byte    0                       \b, 256-colors
+>>8    byte    >0                      \b, %d-colors
+
+
+# .chr files
+0      string  PK\010\010BGI   Borland font 
+>4     string  >\0     %s
+# then there is a copyright notice
+
+
+# .bgi files
+0      string  pk\010\010BGI   Borland device 
+>4     string  >\0     %s
+# then there is a copyright notice
+
+
+# recycled/info the windows trash bin index
+9      string  \000\000\000\030\001\000\000\000 ms-windows recycled bin info
+
+
+##### put in Either Magic/font or Magic/news
+# Acroread or something  files wrongly identified as G3  .pfm
+# these have the form \000 \001 any? \002 \000 \000
+# or \000 \001 any? \022 \000 \000
+#0     string  \000\001 pfm?
+#>3    string  \022\000\000Copyright\  yes
+#>3    string  \002\000\000Copyright\  yes
+#>3    string  >\0     oops, not a font file. Cancel that.
+#it clashes with ttf files so put it lower down.
+
+# From Doug Lee via a FreeBSD pr
+9      string          GERBILDOC       First Choice document
+9      string          GERBILDB        First Choice database
+9      string          GERBILCLIP      First Choice database
+0      string          GERBIL          First Choice device file
+9      string          RABBITGRAPH     RabbitGraph file
+0      string          DCU1            Borland Delphi .DCU file
+0      string          !<spell>        MKS Spell hash list (old format)
+0      string          !<spell2>       MKS Spell hash list
+# Too simple - MPi
+#0     string          AH              Halo(TM) bitmapped font file
+0      lelong          0x08086b70      TurboC BGI file
+0      lelong          0x08084b50      TurboC Font file
+
+# WARNING: below line conflicts with Infocom game data Z-machine 3
+0      byte            0x03            DBase 3 data file
+>0x04  lelong          0               (no records)
+>0x04  lelong          >0              (%ld records)
+0      byte            0x83            DBase 3 data file with memo(s)
+>0x04  lelong          0               (no records)
+>0x04  lelong          >0              (%ld records)
+0      leshort         0x0006          DBase 3 index file
+0      string          PMCC            Windows 3.x .GRP file
+1      string          RDC-meg         MegaDots 
+>8     byte            >0x2F           version %c
+>9     byte            >0x2F           \b.%c file
+0      lelong          0x4C
+>4     lelong          0x00021401      Windows shortcut file
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews@Black.Market.NET>
+0      belong          0xC5D0D3C6      DOS EPS Binary File
+>4     long            >0              Postscript starts at byte %d
+>>8    long            >0              length %d
+>>>12  long            >0              Metafile starts at byte %d
+>>>>16 long            >0              length %d
+>>>20  long            >0              TIFF starts at byte %d
+>>>>24 long            >0              length %d
+
+# TNEF magic From "Joomy" <joomy@se-ed.net> 
+0      leshort         0x223e9f78      TNEF
+
+# HtmlHelp files (.chm)
+0      string  ITSF\003\000\000\000\x60\000\000\000\001\000\000\000    MS Windows HtmlHelp Data
+
+# GFA-BASIC (Wolfram Kleff)
+2      string          GFA-BASIC3      GFA-BASIC 3 data
+
+# DJGPP compiled files
+# v >2, uses DPMI & small(2k) stub (Robert vd Boon, rjvdboon@europe.com)
+0x200  string          go32stub        DOS-executable compiled w/DJGPP
+>0x20c string          >0              (stub v%.4s)
+>>0x8b2        string          djp             [compressed w/%s
+>>>&1  string          >\0             %.4s]
+>>0x8ad        string          UPX             [compressed w/%s
+>>>&1  string          >\0             %.4s]
+>>0x1c string          pmodedj         stubbed with %s
+
+# QDOS
+4      belong          0x4AFB          QDOS executable
+>9     pstring         x               '%s'
+0      beshort         0xFB01          QDOS object
+>2     pstring         x               '%s'
+
+#------------------------------------------------------------------------------
+# From Stuart Caie <kyzer@4u.net> (developer of cabextract)
+# Microsoft Cabinet files
+0      string          MSCF\0\0\0\0    Microsoft Cabinet file
+>8     lelong          x               \b, %u bytes
+>28    leshort         1               \b, 1 file
+>28    leshort         >1              \b, %u files
+
+# InstallShield Cabinet files
+0      string          ISc(            InstallShield Cabinet file
+>5     byte&0xf0       =0x60           version 6,
+>5     byte&0xf0       !0x60           version 4/5,
+>(12.l+40)     lelong  x               %u files
+
+# Windows CE package files
+0      string          MSCE\0\0\0\0    Microsoft WinCE install header
+>20    lelong          0               \b, architecture-independent
+>20    lelong          103             \b, Hitachi SH3
+>20    lelong          104             \b, Hitachi SH4
+>20    lelong          0xA11           \b, StrongARM
+>20    lelong          4000            \b, MIPS R4000
+>20    lelong          10003           \b, Hitachi SH3
+>20    lelong          10004           \b, Hitachi SH3E
+>20    lelong          10005           \b, Hitachi SH4
+>20    lelong          70001           \b, ARM 7TDMI
+>52    leshort         1               \b, 1 file
+>52    leshort         >1              \b, %u files
+>56    leshort         1               \b, 1 registry entry
+>56    leshort         >1              \b, %u registry entries
+
+# Outlook Personal Folders
+0      lelong  0x4E444221      Microsoft Outlook binary email folder
+
+# From: Dirk Jagdmann <doj@cubic.org>
+0      lelong  0x00035f3f      Windows 3.x help file
+
+# Christophe Monniez
+0      string  Client\ UrlCache\ MMF   Microsoft Internet Explorer Cache File
+>20    string  >\0                     Version %s
+0      string  \xCF\xAD\x12\xFE        Microsoft Outlook Express DBX File
+>4     byte    =0xC5                   Message database
+>4     byte    =0xC6                   Folder database
+>4     byte    =0xC7                   Accounts informations
+>4     byte    =0x30                   Offline database
+
+
+# Windows Enhanced Metafile (EMF)
+# See msdn.microsoft.com/archive/en-us/dnargdi/html/msdn_enhmeta.asp 
+# for further information. Note that "0 lelong 1" should be true i.e.
+# the first double word in the file should be 1. With the extended
+# syntax available by some file commands you could write:
+# 0 lelong 1
+# &40 ulelong 0x464D4520 Windows Enhanced Metafile (EMF) image data
+40     ulelong 0x464D4520      Windows Enhanced Metafile (EMF) image data
+>44    ulelong x               version 0x%x.
+# If the description has a length greater than zero, it exists and is 
+# found at offset (*64).
+>64    ulelong >0              Description available at offset 0x%x
+>>60   ulelong >0              (length 0x%x)
+# Note it would be better to print out the description, which is found 
+# as below. Unfortunately the following only prints out the first couple
+# of characters instead of all the "description length"
+# number of characters -- indicated by the ulelong at offset 60.
+>>(64.l)  lestring16 >0 Description: %15.15s
+#WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+0      string  \377WPC\020\000\000\000\022\012\001\001\000\000\000\000 (WP) loadable text
+>15    byte    0       Optimized for Intel
+>15    byte    1       Optimized for Non-Intel
+1      string  WPC     (Corel/WP)
+>8     short   257     WordPerfect macro
+>8     short   258     WordPerfect help file
+>8     short   259     WordPerfect keyboard file
+>8     short   266     WordPerfect document
+>8     short   267     WordPerfect dictionary
+>8     short   268     WordPerfect thesaurus
+>8     short   269     WordPerfect block
+>8     short   270     WordPerfect rectangular block
+>8     short   271     WordPerfect column block
+>8     short   272     WordPerfect printer data
+>8     short   275     WordPerfect printer data
+>8     short   276     WordPerfect driver resource data
+>8     short   279     WordPerfect hyphenation code
+>8     short   280     WordPerfect hyphenation data
+>8     short   281     WordPerfect macro resource data
+>8     short   283     WordPerfect hyphenation lex
+>8     short   285     WordPerfect wordlist
+>8     short   286     WordPerfect equation resource data
+>8     short   289     WordPerfect spell rules
+>8     short   290     WordPerfect dictionary rules
+>8     short   295     WordPerfect spell rules (Microlytics)
+>8     short   299     WordPerfect settings file
+>8     short   301     WordPerfect 4.2 document
+>8     short   325     WordPerfect dialog file
+>8     short   332     WordPerfect button bar
+>8     short   513     Shell macro
+>8     short   522     Shell definition
+>8     short   769     Notebook macro
+>8     short   770     Notebook help file
+>8     short   771     Notebook keyboard file
+>8     short   778     Notebook definition
+>8     short   1026    Calculator help file
+>8     short   1538    Calendar help file
+>8     short   1546    Calendar data file
+>8     short   1793    Editor macro
+>8     short   1794    Editor help file
+>8     short   1795    Editor keyboard file
+>8     short   1817    Editor macro resource file
+>8     short   2049    Macro editor macro
+>8     short   2050    Macro editor help file
+>8     short   2051    Macro editor keyboard file
+>8     short   2305    PlanPerfect macro
+>8     short   2306    PlanPerfect help file
+>8     short   2307    PlanPerfect keyboard file
+>8     short   2314    PlanPerfect worksheet
+>8     short   2319    PlanPerfect printer definition
+>8     short   2322    PlanPerfect graphic definition
+>8     short   2323    PlanPerfect data
+>8     short   2324    PlanPerfect temporary printer
+>8     short   2329    PlanPerfect macro resource data
+>8     byte    11      Mail
+>8     short   2818    help file
+>8     short   2821    distribution list
+>8     short   2826    out box
+>8     short   2827    in box
+>8     short   2836    users archived mailbox
+>8     short   2837    archived message database
+>8     short   2838    archived attachments
+>8     short   3083    Printer temporary file
+>8     short   3330    Scheduler help file
+>8     short   3338    Scheduler in file
+>8     short   3339    Scheduler out file
+>8     short   3594    GroupWise settings file
+>8     short   3601    GroupWise directory services
+>8     short   3627    GroupWise settings file
+>8     short   4362    Terminal resource data
+>8     short   4363    Terminal resource data
+>8     short   4395    Terminal resource data
+>8     short   4619    GUI loadable text
+>8     short   4620    graphics resource data
+>8     short   4621    printer settings file
+>8     short   4622    port definition file
+>8     short   4623    print queue parameters
+>8     short   4624    compressed file
+>8     short   5130    Network service msg file
+>8     short   5131    Network service msg file
+>8     short   5132    Async gateway login msg
+>8     short   5134    GroupWise message file
+>8     short   7956    GroupWise admin domain database
+>8     short   7957    GroupWise admin host database
+>8     short   7959    GroupWise admin remote host database
+>8     short   7960    GroupWise admin ADS deferment data file
+>8     short   8458    IntelliTAG (SGML) compiled DTD
+>8     long    18219264        WordPerfect graphic image (1.0)
+>8     long    18219520        WordPerfect graphic image (2.0)
+#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+
+#------------------------------------------------------------------------------
+# rtf: file(1) magic for Rich Text Format (RTF)
+#
+# Duncan P. Simpson, D.P.Simpson@dcs.warwick.ac.uk
+#
+0      string          {\\rtf          Rich Text Format data,
+>5     byte            x               version %c,
+>6     string          \\ansi          ANSI
+>6     string          \\mac           Apple Macintosh
+>6     string          \\pc            IBM PC, code page 437
+>6     string          \\pca           IBM PS/2, code page 850
+
+#------------------------------------------------------------------------------
+# animation:  file(1) magic for animation/movie formats
+#
+# animation formats
+# MPEG, FLI, DL originally from vax@ccwf.cc.utexas.edu (VaX#n8)
+# FLC, SGI, Apple originally from Daniel Quinlan (quinlan@yggdrasil.com)
+
+# MPEG sequences
+# Scans for all common MPEG header start codes
+0        belong&0xFFFFFF00  0x00000100     MPEG sequence
+>3       byte               0xBA
+>>4      byte               &0x40          \b, v2, program multiplex
+>>4      byte               ^0x40          \b, v1, system multiplex
+>3       byte               0xBB           \b, v1/2, multiplex (missing pack header)
+>3       byte               0xB0           \b, v4
+>>5      belong             0x000001B5
+>>>9     byte               &0x80
+>>>>10   byte&0xF0          16             \b, video
+>>>>10   byte&0xF0          32             \b, still texture
+>>>>10   byte&0xF0          48             \b, mesh
+>>>>10   byte&0xF0          64             \b, face
+>>>9     byte               ^0x80
+>>>>9    byte&0xF8          8              \b, video
+>>>>9    byte&0xF8          16             \b, still texture
+>>>>9    byte&0xF8          24             \b, mesh
+>>>>9    byte&0xF8          32             \b, face
+>>4      byte               1              \b, simple @ L1
+>>4      byte               2              \b, simple @ L2
+>>4      byte               3              \b, simple @ L3
+>>4      byte               4              \b, simple @ L0
+>>4      byte               17             \b, simple scalable @ L1
+>>4      byte               18             \b, simple scalable @ L2
+>>4      byte               33             \b, core @ L1
+>>4      byte               34             \b, core @ L2
+>>4      byte               50             \b, main @ L2
+>>4      byte               51             \b, main @ L3
+>>4      byte               53             \b, main @ L4
+>>4      byte               66             \b, n-bit @ L2
+>>4      byte               81             \b, scalable texture @ L1
+>>4      byte               97             \b, simple face animation @ L1
+>>4      byte               98             \b, simple face animation @ L2
+>>4      byte               99             \b, simple face basic animation @ L1
+>>4      byte               100            \b, simple face basic animation @ L2
+>>4      byte               113            \b, basic animation text @ L1
+>>4      byte               114            \b, basic animation text @ L2
+>>4      byte               129            \b, hybrid @ L1
+>>4      byte               130            \b, hybrid @ L2
+>>4      byte               145            \b, advanced RT simple @ L!
+>>4      byte               146            \b, advanced RT simple @ L2
+>>4      byte               147            \b, advanced RT simple @ L3
+>>4      byte               148            \b, advanced RT simple @ L4
+>>4      byte               161            \b, core scalable @ L1
+>>4      byte               162            \b, core scalable @ L2
+>>4      byte               163            \b, core scalable @ L3
+>>4      byte               177            \b, advanced coding efficiency @ L1
+>>4      byte               178            \b, advanced coding efficiency @ L2
+>>4      byte               179            \b, advanced coding efficiency @ L3
+>>4      byte               180            \b, advanced coding efficiency @ L4
+>>4      byte               193            \b, advanced core @ L1
+>>4      byte               194            \b, advanced core @ L2
+>>4      byte               209            \b, advanced scalable texture @ L1
+>>4      byte               210            \b, advanced scalable texture @ L2
+>>4      byte               211            \b, advanced scalable texture @ L3
+>>4      byte               225            \b, simple studio @ L1
+>>4      byte               226            \b, simple studio @ L2
+>>4      byte               227            \b, simple studio @ L3
+>>4      byte               228            \b, simple studio @ L4
+>>4      byte               229            \b, core studio @ L1
+>>4      byte               230            \b, core studio @ L2
+>>4      byte               231            \b, core studio @ L3
+>>4      byte               232            \b, core studio @ L4
+>>4      byte               240            \b, advanced simple @ L0
+>>4      byte               241            \b, advanced simple @ L1
+>>4      byte               242            \b, advanced simple @ L2
+>>4      byte               243            \b, advanced simple @ L3
+>>4      byte               244            \b, advanced simple @ L4
+>>4      byte               245            \b, advanced simple @ L5
+>>4      byte               247            \b, advanced simple @ L3b
+>>4      byte               248            \b, FGS @ L0
+>>4      byte               249            \b, FGS @ L1
+>>4      byte               250            \b, FGS @ L2
+>>4      byte               251            \b, FGS @ L3
+>>4      byte               252            \b, FGS @ L4
+>>4      byte               253            \b, FGS @ L5
+>3       byte               0xB5           \b, v4
+>>4      byte               &0x80
+>>>5     byte&0xF0          16             \b, video (missing profile header)
+>>>5     byte&0xF0          32             \b, still texture (missing profile header)
+>>>5     byte&0xF0          48             \b, mesh (missing profile header)
+>>>5     byte&0xF0          64             \b, face (missing profile header)
+>>4      byte               ^0x80
+>>>4     byte&0xF8          8              \b, video (missing profile header)
+>>>4     byte&0xF8          16             \b, still texture (missing profile header)
+>>>4     byte&0xF8          24             \b, mesh (missing profile header)
+>>>4     byte&0xF8          32             \b, face (missing profile header)
+>3       byte               0xB3
+>>12     belong             0x000001B8     \b, v1, progressive Y'CbCr 4:2:0 video
+>>12     belong             0x000001B2     \b, v1, progressive Y'CbCr 4:2:0 video
+>>12     belong             0x000001B5     \b, v2,
+>>>16    byte&0x0F          1              \b HP
+>>>16    byte&0x0F          2              \b Spt
+>>>16    byte&0x0F          3              \b SNR
+>>>16    byte&0x0F          4              \b MP
+>>>16    byte&0x0F          5              \b SP
+>>>17    byte&0xF0          64             \b@HL
+>>>17    byte&0xF0          96             \b@H-14
+>>>17    byte&0xF0          128            \b@ML
+>>>17    byte&0xF0          160            \b@LL
+>>>17    byte               &0x08          \b progressive
+>>>17    byte               ^0x08          \b interlaced
+>>>17    byte&0x06          2              \b Y'CbCr 4:2:0 video
+>>>17    byte&0x06          4              \b Y'CbCr 4:2:2 video
+>>>17    byte&0x06          6              \b Y'CbCr 4:4:4 video
+>>11     byte               &0x02
+>>>75    byte               &0x01
+>>>>140  belong             0x000001B8     \b, v1, progressive Y'CbCr 4:2:0 video
+>>>>140  belong             0x000001B2     \b, v1, progressive Y'CbCr 4:2:0 video
+>>>>140  belong             0x000001B5     \b, v2,
+>>>>>144 byte&0x0F          1              \b HP
+>>>>>144 byte&0x0F          2              \b Spt
+>>>>>144 byte&0x0F          3              \b SNR
+>>>>>144 byte&0x0F          4              \b MP
+>>>>>144 byte&0x0F          5              \b SP
+>>>>>145 byte&0xF0          64             \b@HL
+>>>>>145 byte&0xF0          96             \b@H-14
+>>>>>145 byte&0xF0          128            \b@ML
+>>>>>145 byte&0xF0          160            \b@LL
+>>>>>145 byte               &0x08          \b progressive
+>>>>>145 byte               ^0x08          \b interlaced
+>>>>>145 byte&0x06          2              \b Y'CbCr 4:2:0 video
+>>>>>145 byte&0x06          4              \b Y'CbCr 4:2:2 video
+>>>>>145 byte&0x06          6              \b Y'CbCr 4:4:4 video
+>>>76    belong             0x000001B8     \b, v1, progressive Y'CbCr 4:2:0 video
+>>>76    belong             0x000001B2     \b, v1, progressive Y'CbCr 4:2:0 video
+>>>76    belong             0x000001B5     \b, v2,
+>>>80    byte&0x0F          1              \b HP
+>>>80    byte&0x0F          2              \b Spt
+>>>80    byte&0x0F          3              \b SNR
+>>>80    byte&0x0F          4              \b MP
+>>>80    byte&0x0F          5              \b SP
+>>>81    byte&0xF0          64             \b@HL
+>>>81    byte&0xF0          96             \b@H-14
+>>>81    byte&0xF0          128            \b@ML
+>>>81    byte&0xF0          160            \b@LL
+>>>81    byte               &0x08          \b progressive
+>>>81    byte               ^0x08          \b interlaced
+>>>81    byte&0x06          2              \b Y'CbCr 4:2:0 video
+>>>81    byte&0x06          4              \b Y'CbCr 4:2:2 video
+>>>81    byte&0x06          6              \b Y'CbCr 4:4:4 video
+>>4      belong&0xFFFFFF00  0x78043800     \b, HD-TV 1920P
+>>>7     byte&0xF0          0x10           \b, 16:9
+>>4      belong&0xFFFFFF00  0x50002D00     \b, SD-TV 1280I
+>>>7     byte&0xF0          0x10           \b, 16:9
+>>4      belong&0xFFFFFF00  0x30024000     \b, PAL Capture
+>>>7     byte&0xF0          0x10           \b, 4:3
+>>4      beshort&0xFFF0     0x2C00         \b, 4CIF
+>>>5     beshort&0x0FFF     0x01E0         \b NTSC
+>>>5     beshort&0x0FFF     0x0240         \b PAL
+>>>7     byte&0xF0          0x20           \b, 4:3
+>>>7     byte&0xF0          0x30           \b, 16:9
+>>>7     byte&0xF0          0x40           \b, 11:5
+>>>7     byte&0xF0          0x80           \b, PAL 4:3
+>>>7     byte&0xF0          0xC0           \b, NTSC 4:3
+>>4      belong&0xFFFFFF00  0x2801E000     \b, LD-TV 640P
+>>>7     byte&0xF0          0x10           \b, 4:3
+>>4      belong&0xFFFFFF00  0x1400F000     \b, 320x240
+>>>7     byte&0xF0          0x10           \b, 4:3
+>>4      belong&0xFFFFFF00  0x0F00A000     \b, 240x160
+>>>7     byte&0xF0          0x10           \b, 4:3
+>>4      belong&0xFFFFFF00  0x0A007800     \b, 160x120
+>>>7     byte&0xF0          0x10           \b, 4:3
+>>4      beshort&0xFFF0     0x1600         \b, CIF
+>>>5     beshort&0x0FFF     0x00F0         \b NTSC
+>>>5     beshort&0x0FFF     0x0120         \b PAL
+>>>7     byte&0xF0          0x20           \b, 4:3
+>>>7     byte&0xF0          0x30           \b, 16:9
+>>>7     byte&0xF0          0x40           \b, 11:5
+>>>7     byte&0xF0          0x80           \b, PAL 4:3
+>>>7     byte&0xF0          0xC0           \b, NTSC 4:3
+>>>5     beshort&0x0FFF     0x0240         \b PAL 625
+>>>>7    byte&0xF0          0x20           \b, 4:3
+>>>>7    byte&0xF0          0x30           \b, 16:9
+>>>>7    byte&0xF0          0x40           \b, 11:5
+>>4      beshort&0xFFF0     0x2D00         \b, CCIR/ITU
+>>>5     beshort&0x0FFF     0x01E0         \b NTSC 525
+>>>5     beshort&0x0FFF     0x0240         \b PAL 625
+>>>7     byte&0xF0          0x20           \b, 4:3
+>>>7     byte&0xF0          0x30           \b, 16:9
+>>>7     byte&0xF0          0x40           \b, 11:5
+>>4      beshort&0xFFF0     0x1E00         \b, SVCD
+>>>5     beshort&0x0FFF     0x01E0         \b NTSC 525
+>>>5     beshort&0x0FFF     0x0240         \b PAL 625
+>>>7     byte&0xF0          0x20           \b, 4:3
+>>>7     byte&0xF0          0x30           \b, 16:9
+>>>7     byte&0xF0          0x40           \b, 11:5
+>>7      byte&0x0F          1              \b, 23.976 fps
+>>7      byte&0x0F          2              \b, 24 fps
+>>7      byte&0x0F          3              \b, 25 fps
+>>7      byte&0x0F          4              \b, 29.97 fps
+>>7      byte&0x0F          5              \b, 30 fps
+>>7      byte&0x0F          6              \b, 50 fps
+>>7      byte&0x0F          7              \b, 59.94 fps
+>>7      byte&0x0F          8              \b, 60 fps
+>>11     byte               &0x04          \b, Constrained
+
+# MPEG ADTS Audio (*.mpx/mxa/aac)
+# from dreesen@math.fu-berlin.de
+# modified to fully support MPEG ADTS
+
+# MP3, M1A
+0       beshort&0xFFFE  0xFFFA         MPEG ADTS, layer III, v1
+# rates
+>2      byte&0xF0       0x10           \b,  32 kBits
+>2      byte&0xF0       0x20           \b,  40 kBits
+>2      byte&0xF0       0x30           \b,  48 kBits
+>2      byte&0xF0       0x40           \b,  56 kBits
+>2      byte&0xF0       0x50           \b,  64 kBits
+>2      byte&0xF0       0x60           \b,  80 kBits
+>2      byte&0xF0       0x70           \b,  96 kBits
+>2      byte&0xF0       0x80           \b, 112 kBits
+>2      byte&0xF0       0x90           \b, 128 kBits
+>2      byte&0xF0       0xA0           \b, 160 kBits
+>2      byte&0xF0       0xB0           \b, 192 kBits
+>2      byte&0xF0       0xC0           \b, 224 kBits
+>2      byte&0xF0       0xD0           \b, 256 kBits
+>2      byte&0xF0       0xE0           \b, 320 kBits
+# timing
+>2      byte&0x0C       0x00           \b, 44.1 kHz
+>2      byte&0x0C       0x04           \b, 48 kHz
+>2      byte&0x0C       0x08           \b, 32 kHz
+# channels/options
+>3      byte&0xC0       0x00           \b, Stereo
+>3      byte&0xC0       0x40           \b, JntStereo
+>3      byte&0xC0       0x80           \b, 2x Monaural
+>3      byte&0xC0       0xC0           \b, Monaural
+#>1     byte            ^0x01           \b, Data Verify
+#>2     byte            &0x02           \b, Packet Pad
+#>2     byte            &0x01           \b, Custom Flag
+#>3     byte            &0x08           \b, Copyrighted
+#>3     byte            &0x04           \b, Original Source
+#>3     byte&0x03       1               \b, NR: 50/15 ms
+#>3     byte&0x03       3               \b, NR: CCIT J.17
+
+# MP2, M1A
+0       beshort&0xFFFE  0xFFFC         MPEG ADTS, layer II, v1
+# rates
+>2      byte&0xF0       0x10           \b,  32 kBits
+>2      byte&0xF0       0x20           \b,  48 kBits
+>2      byte&0xF0       0x30           \b,  56 kBits
+>2      byte&0xF0       0x40           \b,  64 kBits
+>2      byte&0xF0       0x50           \b,  80 kBits
+>2      byte&0xF0       0x60           \b,  96 kBits
+>2      byte&0xF0       0x70           \b, 112 kBits
+>2      byte&0xF0       0x80           \b, 128 kBits
+>2      byte&0xF0       0x90           \b, 160 kBits
+>2      byte&0xF0       0xA0           \b, 192 kBits
+>2      byte&0xF0       0xB0           \b, 224 kBits
+>2      byte&0xF0       0xC0           \b, 256 kBits
+>2      byte&0xF0       0xD0           \b, 320 kBits
+>2      byte&0xF0       0xE0           \b, 384 kBits
+# timing
+>2      byte&0x0C       0x00           \b, 44.1 kHz
+>2      byte&0x0C       0x04           \b, 48 kHz
+>2      byte&0x0C       0x08           \b, 32 kHz
+# channels/options
+>3      byte&0xC0       0x00           \b, Stereo
+>3      byte&0xC0       0x40           \b, JntStereo
+>3      byte&0xC0       0x80           \b, 2x Monaural
+>3      byte&0xC0       0xC0           \b, Monaural
+#>1     byte            ^0x01           \b, Data Verify
+#>2     byte            &0x02           \b, Packet Pad
+#>2     byte            &0x01           \b, Custom Flag
+#>3     byte            &0x08           \b, Copyrighted
+#>3     byte            &0x04           \b, Original Source
+#>3     byte&0x03       1               \b, NR: 50/15 ms
+#>3     byte&0x03       3               \b, NR: CCIT J.17
+
+# MPA, M1A
+0       beshort&0xFFFE  0xFFFE         MPEG ADTS, layer I, v1
+# rate
+>2      byte&0xF0       0x10           \b,  32 kBits
+>2      byte&0xF0       0x20           \b,  64 kBits
+>2      byte&0xF0       0x30           \b,  96 kBits
+>2      byte&0xF0       0x40           \b, 128 kBits
+>2      byte&0xF0       0x50           \b, 160 kBits
+>2      byte&0xF0       0x60           \b, 192 kBits
+>2      byte&0xF0       0x70           \b, 224 kBits
+>2      byte&0xF0       0x80           \b, 256 kBits
+>2      byte&0xF0       0x90           \b, 288 kBits
+>2      byte&0xF0       0xA0           \b, 320 kBits
+>2      byte&0xF0       0xB0           \b, 352 kBits
+>2      byte&0xF0       0xC0           \b, 384 kBits
+>2      byte&0xF0       0xD0           \b, 416 kBits
+>2      byte&0xF0       0xE0           \b, 448 kBits
+# timing
+>2      byte&0x0C       0x00           \b, 44.1 kHz
+>2      byte&0x0C       0x04           \b, 48 kHz
+>2      byte&0x0C       0x08           \b, 32 kHz
+# channels/options
+>3      byte&0xC0       0x00           \b, Stereo
+>3      byte&0xC0       0x40           \b, JntStereo
+>3      byte&0xC0       0x80           \b, 2x Monaural
+>3      byte&0xC0       0xC0           \b, Monaural
+#>1     byte            ^0x01           \b, Data Verify
+#>2     byte            &0x02           \b, Packet Pad
+#>2     byte            &0x01           \b, Custom Flag
+#>3     byte            &0x08           \b, Copyrighted
+#>3     byte            &0x04           \b, Original Source
+#>3     byte&0x03       1               \b, NR: 50/15 ms
+#>3     byte&0x03       3               \b, NR: CCIT J.17
+
+# MP3, M2A
+0       beshort&0xFFFE  0xFFF2         MPEG ADTS, layer III, v2
+# rate
+>2      byte&0xF0       0x10           \b,   8 kBits
+>2      byte&0xF0       0x20           \b,  16 kBits
+>2      byte&0xF0       0x30           \b,  24 kBits
+>2      byte&0xF0       0x40           \b,  32 kBits
+>2      byte&0xF0       0x50           \b,  40 kBits
+>2      byte&0xF0       0x60           \b,  48 kBits
+>2      byte&0xF0       0x70           \b,  56 kBits
+>2      byte&0xF0       0x80           \b,  64 kBits
+>2      byte&0xF0       0x90           \b,  80 kBits
+>2      byte&0xF0       0xA0           \b,  96 kBits
+>2      byte&0xF0       0xB0           \b, 112 kBits
+>2      byte&0xF0       0xC0           \b, 128 kBits
+>2      byte&0xF0       0xD0           \b, 144 kBits
+>2      byte&0xF0       0xE0           \b, 160 kBits
+# timing
+>2      byte&0x0C       0x00           \b, 22.05 kHz
+>2      byte&0x0C       0x04           \b, 24 kHz
+>2      byte&0x0C       0x08           \b, 16 kHz
+# channels/options
+>3      byte&0xC0       0x00           \b, Stereo
+>3      byte&0xC0       0x40           \b, JntStereo
+>3      byte&0xC0       0x80           \b, 2x Monaural
+>3      byte&0xC0       0xC0           \b, Monaural
+#>1     byte            ^0x01           \b, Data Verify
+#>2     byte            &0x02           \b, Packet Pad
+#>2     byte            &0x01           \b, Custom Flag
+#>3     byte            &0x08           \b, Copyrighted
+#>3     byte            &0x04           \b, Original Source
+#>3     byte&0x03       1               \b, NR: 50/15 ms
+#>3     byte&0x03       3               \b, NR: CCIT J.17
+
+# MP2, M2A
+0       beshort&0xFFFE  0xFFF4         MPEG ADTS, layer II, v2
+# rate 
+>2      byte&0xF0       0x10           \b,   8 kBits
+>2      byte&0xF0       0x20           \b,  16 kBits 
+>2      byte&0xF0       0x30           \b,  24 kBits
+>2      byte&0xF0       0x40           \b,  32 kBits
+>2      byte&0xF0       0x50           \b,  40 kBits
+>2      byte&0xF0       0x60           \b,  48 kBits
+>2      byte&0xF0       0x70           \b,  56 kBits
+>2      byte&0xF0       0x80           \b,  64 kBits
+>2      byte&0xF0       0x90           \b,  80 kBits
+>2      byte&0xF0       0xA0           \b,  96 kBits
+>2      byte&0xF0       0xB0           \b, 112 kBits
+>2      byte&0xF0       0xC0           \b, 128 kBits
+>2      byte&0xF0       0xD0           \b, 144 kBits
+>2      byte&0xF0       0xE0           \b, 160 kBits
+# timing
+>2      byte&0x0C       0x00           \b, 22.05 kHz
+>2      byte&0x0C       0x04           \b, 24 kHz
+>2      byte&0x0C       0x08           \b, 16 kHz
+# channels/options
+>3      byte&0xC0       0x00           \b, Stereo
+>3      byte&0xC0       0x40           \b, JntStereo
+>3      byte&0xC0       0x80           \b, 2x Monaural
+>3      byte&0xC0       0xC0           \b, Monaural
+#>1     byte            ^0x01           \b, Data Verify
+#>2     byte            &0x02           \b, Packet Pad
+#>2     byte            &0x01           \b, Custom Flag
+#>3     byte            &0x08           \b, Copyrighted
+#>3     byte            &0x04           \b, Original Source
+#>3     byte&0x03       1               \b, NR: 50/15 ms
+#>3     byte&0x03       3               \b, NR: CCIT J.17
+
+# MPA, M2A
+0       beshort&0xFFFE  0xFFF6         MPEG ADTS, layer I, v2
+# rate
+>2      byte&0xF0       0x10           \b,  32 kBits
+>2      byte&0xF0       0x20           \b,  48 kBits
+>2      byte&0xF0       0x30           \b,  56 kBits
+>2      byte&0xF0       0x40           \b,  64 kBits
+>2      byte&0xF0       0x50           \b,  80 kBits
+>2      byte&0xF0       0x60           \b,  96 kBits
+>2      byte&0xF0       0x70           \b, 112 kBits
+>2      byte&0xF0       0x80           \b, 128 kBits
+>2      byte&0xF0       0x90           \b, 144 kBits
+>2      byte&0xF0       0xA0           \b, 160 kBits
+>2      byte&0xF0       0xB0           \b, 176 kBits
+>2      byte&0xF0       0xC0           \b, 192 kBits
+>2      byte&0xF0       0xD0           \b, 224 kBits
+>2      byte&0xF0       0xE0           \b, 256 kBits
+# timing
+>2      byte&0x0C       0x00           \b, 22.05 kHz
+>2      byte&0x0C       0x04           \b, 24 kHz
+>2      byte&0x0C       0x08           \b, 16 kHz
+# channels/options
+>3      byte&0xC0       0x00           \b, Stereo
+>3      byte&0xC0       0x40           \b, JntStereo
+>3      byte&0xC0       0x80           \b, 2x Monaural
+>3      byte&0xC0       0xC0           \b, Monaural
+#>1     byte            ^0x01           \b, Data Verify
+#>2     byte            &0x02           \b, Packet Pad
+#>2     byte            &0x01           \b, Custom Flag
+#>3     byte            &0x08           \b, Copyrighted
+#>3     byte            &0x04           \b, Original Source
+#>3     byte&0x03       1               \b, NR: 50/15 ms
+#>3     byte&0x03       3               \b, NR: CCIT J.17
+
+# MP3, M25A
+0       beshort&0xFFFE  0xFFE2         MPEG ADTS, layer III,  v2.5
+# rate  
+>2      byte&0xF0       0x10           \b,   8 kBits
+>2      byte&0xF0       0x20           \b,  16 kBits
+>2      byte&0xF0       0x30           \b,  24 kBits
+>2      byte&0xF0       0x40           \b,  32 kBits
+>2      byte&0xF0       0x50           \b,  40 kBits
+>2      byte&0xF0       0x60           \b,  48 kBits
+>2      byte&0xF0       0x70           \b,  56 kBits
+>2      byte&0xF0       0x80           \b,  64 kBits
+>2      byte&0xF0       0x90           \b,  80 kBits
+>2      byte&0xF0       0xA0           \b,  96 kBits
+>2      byte&0xF0       0xB0           \b, 112 kBits
+>2      byte&0xF0       0xC0           \b, 128 kBits
+>2      byte&0xF0       0xD0           \b, 144 kBits
+>2      byte&0xF0       0xE0           \b, 160 kBits
+# timing
+>2      byte&0x0C       0x00           \b, 11.025 kHz
+>2      byte&0x0C       0x04           \b, 12 kHz
+>2      byte&0x0C       0x08           \b, 8 kHz
+# channels/options
+>3      byte&0xC0       0x00           \b, Stereo
+>3      byte&0xC0       0x40           \b, JntStereo
+>3      byte&0xC0       0x80           \b, 2x Monaural
+>3      byte&0xC0       0xC0           \b, Monaural
+#>1     byte            ^0x01           \b, Data Verify
+#>2     byte            &0x02           \b, Packet Pad
+#>2     byte            &0x01           \b, Custom Flag
+#>3     byte            &0x08           \b, Copyrighted
+#>3     byte            &0x04           \b, Original Source
+#>3     byte&0x03       1               \b, NR: 50/15 ms
+#>3     byte&0x03       3               \b, NR: CCIT J.17
+
+# AAC (aka MPEG-2 NBC audio) and MPEG-4 audio
+
+# Stored AAC streams (instead of the MP4 format)
+0       string          ADIF           MPEG ADIF, AAC
+>4      byte            &0x80
+>>13    byte            &0x10          \b, VBR
+>>13    byte            ^0x10          \b, CBR
+>>16    byte&0x1E       0x02           \b, single stream
+>>16    byte&0x1E       0x04           \b, 2 streams
+>>16    byte&0x1E       0x06           \b, 3 streams
+>>16    byte            &0x08          \b, 4 or more streams
+>>16    byte            &0x10          \b, 8 or more streams
+>>4    byte            &0x80          \b, Copyrighted
+>>13   byte            &0x40          \b, Original Source
+>>13   byte            &0x20          \b, Home Flag
+>4      byte            ^0x80
+>>4     byte            &0x10          \b, VBR
+>>4     byte            ^0x10          \b, CBR
+>>7     byte&0x1E       0x02           \b, single stream
+>>7     byte&0x1E       0x04           \b, 2 streams
+>>7     byte&0x1E       0x06           \b, 3 streams
+>>7     byte            &0x08          \b, 4 or more streams
+>>7     byte            &0x10          \b, 8 or more streams
+>>4    byte            &0x40          \b, Original Stream(s)
+>>4    byte            &0x20          \b, Home Source
+
+# Live or stored single AAC stream (used with MPEG-2 systems)
+0       beshort&0xFFF6  0xFFF0         MPEG ADTS, AAC
+>1      byte            ^0x08          \b, v2
+>1      byte            &0x08          \b, v4
+# profile
+>>2     byte            &0xC0          \b LTP
+>2      byte&0xc0       0x00           \b, Main
+>2      byte&0xc0       0x40           \b, LC
+>2      byte&0xc0       0x80           \b, SSR
+# timing
+>2      byte&0x3c       0x00           \b, 96 kHz
+>2      byte&0x3c       0x04           \b, 88.2 kHz
+>2      byte&0x3c       0x08           \b, 64 kHz
+>2      byte&0x3c       0x0c           \b, 48 kHz
+>2      byte&0x3c       0x10           \b, 44.1 kHz
+>2      byte&0x3c       0x14           \b, 32 kHz
+>2      byte&0x3c       0x18           \b, 24 kHz
+>2      byte&0x3c       0x1c           \b, 22.05 kHz
+>2      byte&0x3c       0x20           \b, 16 kHz
+>2      byte&0x3c       0x24           \b, 12 kHz
+>2      byte&0x3c       0x28           \b, 11.025 kHz
+>2      byte&0x3c       0x2c           \b, 8 kHz
+# channels/options
+>2      beshort&0x01c0  0x0040         \b, monaural
+>2      beshort&0x01c0  0x0080         \b, stereo
+>2      beshort&0x01c0  0x00c0         \b, stereo + center
+>2      beshort&0x01c0  0x0100         \b, stereo+center+LFE
+>2      beshort&0x01c0  0x0140         \b, surround
+>2      beshort&0x01c0  0x0180         \b, surround + LFE
+>2      beshort         &0x01C0        \b, surround + side
+#>1     byte            ^0x01           \b, Data Verify
+#>2     byte            &0x02           \b, Custom Flag
+#>3     byte            &0x20           \b, Original Stream
+#>3     byte            &0x10           \b, Home Source
+#>3     byte            &0x08           \b, Copyrighted
+
+# Live MPEG-4 audio streams (instead of RTP FlexMux)
+0       beshort&0xFFE0  0x56E0         MPEG-4 LOAS
+#>1     beshort&0x1FFF  x              \b, %u byte packet
+>3      byte&0xE0       0x40
+>>4     byte&0x3C       0x04           \b, single stream
+>>4     byte&0x3C       0x08           \b, 2 streams
+>>4     byte&0x3C       0x0C           \b, 3 streams
+>>4     byte            &0x08          \b, 4 or more streams
+>>4     byte            &0x20          \b, 8 or more streams
+>3      byte&0xC0       0
+>>4     byte&0x78       0x08           \b, single stream
+>>4     byte&0x78       0x10           \b, 2 streams
+>>4     byte&0x78       0x18           \b, 3 streams
+>>4     byte            &0x20          \b, 4 or more streams
+>>4     byte            &0x40          \b, 8 or more streams
+0       beshort         0x4DE1         MPEG-4 LO-EP audio stream
+
+# FLI animation format
+4      leshort         0xAF11                  FLI file
+>6     leshort         x                       - %d frames,
+>8     leshort         x                       width=%d pixels,
+>10    leshort         x                       height=%d pixels,
+>12    leshort         x                       depth=%d,
+>16    leshort         x                       ticks/frame=%d
+# FLC animation format
+4      leshort         0xAF12                  FLC file
+>6     leshort         x                       - %d frames
+>8     leshort         x                       width=%d pixels,
+>10    leshort         x                       height=%d pixels,
+>12    leshort         x                       depth=%d,
+>16    leshort         x                       ticks/frame=%d
+
+# DL animation format
+# XXX - collision with most `mips' magic
+#
+# I couldn't find a real magic number for these, however, this
+# -appears- to work.  Note that it might catch other files, too, so be
+# careful!
+#
+# Note that title and author appear in the two 20-byte chunks
+# at decimal offsets 2 and 22, respectively, but they are XOR'ed with
+# 255 (hex FF)!  The DL format is really bad.
+#
+#0     byte    1       DL version 1, medium format (160x100, 4 images/screen)
+#>42   byte    x       - %d screens,
+#>43   byte    x       %d commands
+#0     byte    2       DL version 2
+#>1    byte    1       - large format (320x200,1 image/screen),
+#>1    byte    2       - medium format (160x100,4 images/screen),
+#>1    byte    >2      - unknown format,
+#>42   byte    x       %d screens,
+#>43   byte    x       %d commands
+# Based on empirical evidence, DL version 3 have several nulls following the
+# \003.  Most of them start with non-null values at hex offset 0x34 or so.
+#0     string  \3\0\0\0\0\0\0\0\0\0\0\0        DL version 3
+
+# SGI formats
+0      string          MOVI            Silicon Graphics movie file
+
+# Apple Quicktime and ISO types
+4       string          moov            Apple QuickTime
+>12     string          mvhd            \b movie (fast start)
+>12     string          mdra            \b URL
+>12     string          cmov            \b movie (fast start, compressed header)
+>12     string          rmra            \b multiple URLs
+4       string          mdat            Apple QuickTime movie (unoptimized)
+4       string          wide            Apple QuickTime movie (unoptimized)
+4       string          skip            Apple QuickTime movie (modified)
+4       string          free            Apple QuickTime movie (modified)
+4       string          idsc            Apple QuickTime image (fast start)
+4       string          idat            Apple QuickTime image (unoptimized)
+4       string          pckg            Apple QuickTime compressed archive
+4       string/B        jP              JPEG 2000 image
+4       string          ftyp            ISO Media
+>8      string          isom            \b, MPEG v4 system
+>8      string          mp41            \b, MPEG v4 system, version 1
+>8      string          mp42            \b, MPEG v4 system, version 2
+>8      string/B        jp2             \b, JPEG 2000 image
+>8      string          3gp             \b, MPEG v4 system, 3GPP (H.263/AMR)
+>8      string          mmp4            \b, MPEG v4 system, Mobile
+>8      string/B        M4A             \b, MPEG v4 system, iTunes AAC-LC
+>8      string/B        M4P             \b, MPEG v4 system, ISMA encrypted AAC-LC
+>8      string/B        M4B             \b, MPEG v4 system, iTunes AAC-LC/AMR
+>8      string/B        qt              \b, Apple QuickTime movie
+
+# iso 13818 transport stream
+#
+# from Oskar Schirmer <schirmer@scara.com> Feb 3, 2001 (ISO 13818.1)
+# (the following is a little bit restrictive and works fine for a stream
+#  that starts with PAT properly. it won't work for stream data, that is
+#  cut from an input device data right in the middle, but this shouldn't
+#  disturb)
+# syncbyte      8 bit  0x47
+# error_ind     1 bit  -
+# payload_start 1 bit  1
+# priority      1 bit  -
+# PID          13 bit  0x0000
+# scrambling    2 bit  -
+# adaptfld_ctrl 2 bit  1 or 3
+# conti_count   4 bit  0
+0      belong&0xFF5FFF1F       0x47400010      MPEG transport stream data
+>188   byte                    !0x47           CORRUPTED
+
+# DIF digital video file format <mpruett@sgi.com>
+0      belong&0xffffff00       0x1f070000      DIF
+>4     byte                    &0x01           (DVCPRO) movie file
+>4     byte                    ^0x01           (DV) movie file
+>3     byte                    &0x80           (PAL)
+>3     byte                    ^0x80           (NTSC)
+
+# Microsoft Advanced Streaming Format (ASF) <mpruett@sgi.com>
+0      belong                  0x3026b275      Microsoft ASF
+
+# MNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
+0      string                  \x8aMNG         MNG video data,
+>4     belong                  !0x0d0a1a0a     CORRUPTED,
+>4     belong                  0x0d0a1a0a
+>>16    belong x                               %ld x
+>>20    belong x                               %ld
+
+# JNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
+0      string                  \x8bJNG         JNG video data,
+>4     belong                  !0x0d0a1a0a     CORRUPTED,
+>4     belong                  0x0d0a1a0a
+>>16    belong x                               %ld x
+>>20    belong x                               %ld
+
+# Vivo video (Wolfram Kleff)
+3      string          \x0D\x0AVersion:Vivo    Vivo video data
+
+# VRML (Virtual Reality Modelling Language)
+0       string/b        #VRML\ V1.0\ ascii     VRML 1 file
+0      string/b        #VRML\ V2.0\ utf8       ISO/IEC 14772 VRML 97 file
+
+#---------------------------------------------------------------------------
+# HVQM4: compressed movie format designed by Hudson for Nintendo GameCube
+# From Mark Sheppard <msheppard@climax.co.uk>, 2002-10-03
+#
+0      string          HVQM4           %s
+>6     string          >\0             v%s
+>0     byte            x               GameCube movie,
+>0x34  ubeshort        x               %d x
+>0x36  ubeshort        x               %d,
+>0x26  ubeshort        x               %dµs,
+>0x42  ubeshort        0               no audio
+>0x42  ubeshort        >0              %dHz audio
+
+#------------------------------------------------------------------------------
+# chi:  file(1) magic for ChiWriter files
+#
+0       string          \\1cw\          ChiWriter file
+>5      string          >\0             version %s
+0       string          \\1cw           ChiWriter file
+
+#------------------------------------------------------------------------------
+# claris:  file(1) magic for claris
+# "H. Nanosecond" <aldomel@ix.netcom.com>
+# Claris Works a word processor, etc.
+# Version 3.0
+
+# .pct claris works clip art files
+#0000000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
+#*
+#0001000 #010 250 377 377 377 377 000 213 000 230 000 021 002 377 014 000
+#null to byte 1000 octal
+514    string  \377\377\377\377\000    Claris clip art?
+>0     string  \0\0\0\0\0\0\0\0\0\0\0\0\0      yes.
+514    string  \377\377\377\377\001    Claris clip art?
+>0     string  \0\0\0\0\0\0\0\0\0\0\0\0\0      yes.
+
+# Claris works files
+# .cwk
+0      string  \002\000\210\003\102\117\102\117\000\001\206 Claris works document
+# .plt
+0      string  \020\341\000\000\010\010        Claris Works pallete files .plt
+
+# .msp a dictionary file I am not sure about this I have only one .msp file
+0      string  \002\271\262\000\040\002\000\164        Claris works dictionary
+
+# .usp are user dictionary bits
+# I am not sure about a magic header:
+#0000000 001 123 160 146 070 125 104 040 136 123 015 012 160 157 144 151
+#        soh   S   p   f   8   U   D  sp   ^   S  cr  nl   p   o   d   i
+#0000020 141 164 162 151 163 164 040 136 123 015 012 144 151 166 040 043
+#          a   t   r   i   s   t  sp   ^   S  cr  nl   d   i   v  sp   #
+
+# .mth Thesaurus
+# starts with \0 but no magic header
+
+# .chy Hyphenation file
+# I am not sure: 000 210 034 000 000
+
+# other claris files
+#./windows/claris/useng.ndx: data
+#./windows/claris/xtndtran.l32: data
+#./windows/claris/xtndtran.lst: data
+#./windows/claris/clworks.lbl: data
+#./windows/claris/clworks.prf: data
+#./windows/claris/userd.spl: data
+
+#------------------------------------------------------------------------------
+# fonts:  file(1) magic for font data
+#
+0      string          FONT            ASCII vfont text
+0      short           0436            Berkeley vfont data
+0      short           017001          byte-swapped Berkeley vfont data
+
+# PostScript fonts (must precede "printer" entries), quinlan@yggdrasil.com
+0      string          %!PS-AdobeFont-1.       PostScript Type 1 font text
+>20    string          >\0                     (%s)
+6      string          %!PS-AdobeFont-1.       PostScript Type 1 font program data
+
+# X11 font files in SNF (Server Natural Format) format
+0      belong          00000004                X11 SNF font data, MSB first
+0      lelong          00000004                X11 SNF font data, LSB first
+
+# X11 Bitmap Distribution Format, from Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          STARTFONT\040           X11 BDF font text
+
+# X11 fonts, from Daniel Quinlan (quinlan@yggdrasil.com)
+# PCF must come before SGI additions ("MIPSEL MIPS-II COFF" collides)
+0      string          \001fcp                 X11 Portable Compiled Font data
+>12    byte            0x02                    \b, LSB first
+>12    byte            0x0a                    \b, MSB first
+0      string          D1.0\015                X11 Speedo font data
+
+#------------------------------------------------------------------------------
+# FIGlet fonts and controlfiles
+# From figmagic supplied with Figlet version 2.2
+# "David E. O'Brien" <obrien@FreeBSD.ORG>
+0      string          flf             FIGlet font
+>3     string          >2a             version %-2.2s
+0      string          flc             FIGlet controlfile
+>3     string          >2a             version %-2.2s
+
+# libGrx graphics lib fonts, from Albert Cahalan (acahalan@cs.uml.edu)
+# Used with djgpp (DOS Gnu C++), sometimes Linux or Turbo C++
+0      belong          0x14025919      libGrx font data,
+>8     leshort         x               %dx
+>10    leshort         x               \b%d
+>40    string          x               %s
+# Misc. DOS VGA fonts, from Albert Cahalan (acahalan@cs.uml.edu)
+0      belong          0xff464f4e      DOS code page font data collection
+7      belong          0x00454741      DOS code page font data
+7      belong          0x00564944      DOS code page font data (from Linux?)
+4098   string          DOSFONT         DOSFONT2 encrypted font data
+
+# downloadable fonts for browser (prints type) anthon@mnt.org
+0      string          PFR1            PFR1 font
+>102   string          >0              \b: %s
+
+# True Type fonts
+0      string  \000\001\000\000\000    TrueType font data
+
+0      string          \007\001\001\000Copyright\ (c)\ 199     Adobe Multiple Master font
+0      string          \012\001\001\000Copyright\ (c)\ 199     Adobe Multiple Master font
+
+# Opentype font data from Avi Bercovich
+0      string          OTTO            OpenType font data 
+
+
+#------------------------------------------------------------------------------
+# macintosh description
+#
+# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
+# Daniel Quinlan, quinlan@yggdrasil.com
+11     string  must\ be\ converted\ with\ BinHex       BinHex binary text
+>41    string  x                                       \b, version %.3s
+
+# Stuffit archives are the de facto standard of compression for Macintosh
+# files obtained from most archives. (franklsm@tuns.ca)
+0      string          SIT!                    StuffIt Archive (data)
+>2     string          x                       : %s
+0      string          SITD                    StuffIt Deluxe (data)
+>2     string          x                       : %s
+0      string          Seg                     StuffIt Deluxe Segment (data)
+>2     string          x                       : %s
+
+# Newer StuffIt archives (grant@netbsd.org)
+0      string          StuffIt                 StuffIt Archive
+>162   string          >0                      : %s
+
+# Macintosh Applications and Installation binaries (franklsm@tuns.ca)
+0      string          APPL                    Macintosh Application (data)
+>2     string          x                       \b: %s
+
+# Macintosh System files (franklsm@tuns.ca)
+0      string          zsys                    Macintosh System File (data)
+0      string          FNDR                    Macintosh Finder (data)
+0      string          libr                    Macintosh Library (data)
+>2     string          x                       : %s
+0      string          shlb                    Macintosh Shared Library (data)
+>2     string          x                       : %s
+0      string          cdev                    Macintosh Control Panel (data)
+>2     string          x                       : %s
+0      string          INIT                    Macintosh Extension (data)
+>2     string          x                       : %s
+0      string          FFIL                    Macintosh Truetype Font (data)
+>2     string          x                       : %s
+0      string          LWFN                    Macintosh Postscript Font (data)
+>2     string          x                       : %s
+
+# Additional Macintosh Files (franklsm@tuns.ca)
+0      string          PACT                    Macintosh Compact Pro Archive (data)
+>2     string          x                       : %s
+0      string          ttro                    Macintosh TeachText File (data)
+>2     string          x                       : %s
+0      string          TEXT                    Macintosh TeachText File (data)
+>2     string          x                       : %s
+0      string          PDF                     Macintosh PDF File (data)
+>2     string          x                       : %s
+
+# MacBinary format (Eric Fischer, enf@pobox.com)
+#
+# Unfortunately MacBinary doesn't really have a magic number prior
+# to the MacBinary III format.  The checksum is really the way to
+# do it, but the magic file format isn't up to the challenge.
+#
+# 0    byte            0
+# 1    byte                            # filename length
+# 2    string                          # filename
+# 65    string                         # file type
+# 69   string                          # file creator
+# 73   byte                            # Finder flags
+# 74   byte            0
+# 75   beshort                         # vertical posn in window
+# 77   beshort                         # horiz posn in window
+# 79   beshort                         # window or folder ID
+# 81    byte                           # protected?
+# 82   byte            0
+# 83   belong                          # length of data segment
+# 87   belong                          # length of resource segment
+# 91   belong                          # file creation date
+# 95   belong                          # file modification date
+# 99   beshort                         # length of comment after resource
+# 101  byte                            # new Finder flags
+# 102  string          mBIN            # (only in MacBinary III)
+# 106  byte                            # char. code of file name
+# 107  byte                            # still more Finder flags
+# 116  belong                          # total file length
+# 120  beshort                         # length of add'l header
+# 122  byte            129             # for MacBinary II
+# 122  byte            130             # for MacBinary III
+# 123  byte            129             # minimum version that can read fmt
+# 124  beshort                         # checksum
+#
+# This attempts to use the version numbers as a magic number, requiring
+# that the first one be 0x80, 0x81, 0x82, or 0x83, and that the second
+# be 0x81.  This works for the files I have, but maybe not for everyone's.
+
+# Unfortunately, this magic is quite weak - MPi
+#122   beshort&0xFCFF  0x8081          Macintosh MacBinary data
+
+# MacBinary I doesn't have the version number field at all, but MacBinary II
+# has been in use since 1987 so I hope there aren't many really old files
+# floating around that this will miss.  The original spec calls for using
+# the nulls in 0, 74, and 82 as the magic number.
+#
+# Another possibility, that would also work for MacBinary I, is to use
+# the assumption that 65-72 will all be ASCII (0x20-0x7F), that 73 will
+# have bits 1 (changed), 2 (busy), 3 (bozo), and 6 (invisible) unset,
+# and that 74 will be 0.  So something like
+# 
+# 71   belong&0x80804EFF 0x00000000    Macintosh MacBinary data
+# 
+# >73  byte&0x01       0x01            \b, inited
+# >73  byte&0x02       0x02            \b, changed
+# >73  byte&0x04       0x04            \b, busy
+# >73  byte&0x08       0x08            \b, bozo
+# >73  byte&0x10       0x10            \b, system
+# >73  byte&0x10       0x20            \b, bundle
+# >73  byte&0x10       0x40            \b, invisible
+# >73  byte&0x10       0x80            \b, locked
+
+#>65   string          x               \b, type "%4.4s"
+
+#>65   string          8BIM            (PhotoShop)
+#>65   string          ALB3            (PageMaker 3)
+#>65   string          ALB4            (PageMaker 4)
+#>65   string          ALT3            (PageMaker 3)
+#>65   string          APPL            (application)
+#>65   string          AWWP            (AppleWorks word processor)
+#>65   string          CIRC            (simulated circuit)
+#>65   string          DRWG            (MacDraw)
+#>65   string          EPSF            (Encapsulated PostScript)
+#>65   string          FFIL            (font suitcase)
+#>65   string          FKEY            (function key)
+#>65   string          FNDR            (Macintosh Finder)
+#>65   string          GIFf            (GIF image)
+#>65   string          Gzip            (GNU gzip)
+#>65   string          INIT            (system extension)
+#>65   string          LIB\            (library)
+#>65   string          LWFN            (PostScript font)
+#>65   string          MSBC            (Microsoft BASIC)
+#>65   string          PACT            (Compact Pro archive)
+#>65   string          PDF\            (Portable Document Format)
+#>65   string          PICT            (picture)
+#>65   string          PNTG            (MacPaint picture)
+#>65   string          PREF            (preferences)
+#>65   string          PROJ            (Think C project)
+#>65   string          QPRJ            (Think Pascal project)
+#>65   string          SCFL            (Defender scores)
+#>65   string          SCRN            (startup screen)
+#>65   string          SITD            (StuffIt Deluxe)
+#>65   string          SPn3            (SuperPaint)
+#>65   string          STAK            (HyperCard stack)
+#>65   string          Seg\            (StuffIt segment)
+#>65   string          TARF            (Unix tar archive)
+#>65   string          TEXT            (ASCII)
+#>65   string          TIFF            (TIFF image)
+#>65   string          TOVF            (Eudora table of contents)
+#>65   string          WDBN            (Microsoft Word word processor)
+#>65   string          WORD            (MacWrite word processor)
+#>65   string          XLS\            (Microsoft Excel)
+#>65   string          ZIVM            (compress (.Z))
+#>65   string          ZSYS            (Pre-System 7 system file)
+#>65   string          acf3            (Aldus FreeHand)
+#>65   string          cdev            (control panel)
+#>65   string          dfil            (Desk Acessory suitcase)
+#>65   string          libr            (library)
+#>65   string          nX^d            (WriteNow word processor)
+#>65   string          nX^w            (WriteNow dictionary)
+#>65   string          rsrc            (resource)
+#>65   string          scbk            (Scrapbook)
+#>65   string          shlb            (shared library)
+#>65   string          ttro            (SimpleText read-only)
+#>65   string          zsys            (system file)
+
+#>69   string          x               \b, creator "%4.4s"
+
+# Somewhere, Apple has a repository of registered Creator IDs.  These are
+# just the ones that I happened to have files from and was able to identify.
+
+#>69   string          8BIM            (Adobe Photoshop)
+#>69   string          ALD3            (PageMaker 3)
+#>69   string          ALD4            (PageMaker 4)
+#>69   string          ALFA            (Alpha editor)
+#>69   string          APLS            (Apple Scanner)
+#>69   string          APSC            (Apple Scanner)
+#>69   string          BRKL            (Brickles)
+#>69   string          BTFT            (BitFont)
+#>69   string          CCL2            (Common Lisp 2)
+#>69   string          CCL\            (Common Lisp)
+#>69   string          CDmo            (The Talking Moose)
+#>69   string          CPCT            (Compact Pro)
+#>69   string          CSOm            (Eudora)
+#>69   string          DMOV            (Font/DA Mover)
+#>69   string          DSIM            (DigSim)
+#>69   string          EDIT            (Macintosh Edit)
+#>69   string          ERIK            (Macintosh Finder)
+#>69   string          EXTR            (self-extracting archive)
+#>69   string          Gzip            (GNU gzip)
+#>69   string          KAHL            (Think C)
+#>69   string          LWFU            (LaserWriter Utility)
+#>69   string          LZIV            (compress)
+#>69   string          MACA            (MacWrite)
+#>69   string          MACS            (Macintosh operating system)
+#>69   string          MAcK            (MacKnowledge terminal emulator)
+#>69   string          MLND            (Defender)
+#>69   string          MPNT            (MacPaint)
+#>69   string          MSBB            (Microsoft BASIC (binary))
+#>69   string          MSWD            (Microsoft Word)
+#>69   string          NCSA            (NCSA Telnet)
+#>69   string          PJMM            (Think Pascal)
+#>69   string          PSAL            (Hunt the Wumpus)
+#>69   string          PSI2            (Apple File Exchange)
+#>69   string          R*ch            (BBEdit)
+#>69   string          RMKR            (Resource Maker)
+#>69   string          RSED            (Resource Editor)
+#>69   string          Rich            (BBEdit)
+#>69   string          SIT!            (StuffIt)
+#>69   string          SPNT            (SuperPaint)
+#>69   string          Unix            (NeXT Mac filesystem)
+#>69   string          VIM!            (Vim editor)
+#>69   string          WILD            (HyperCard)
+#>69   string          XCEL            (Microsoft Excel)
+#>69   string          aCa2            (Fontographer)
+#>69   string          aca3            (Aldus FreeHand)
+#>69   string          dosa            (Macintosh MS-DOS file system)
+#>69   string          movr            (Font/DA Mover)
+#>69   string          nX^n            (WriteNow)
+#>69   string          pdos            (Apple ProDOS file system)
+#>69   string          scbk            (Scrapbook)
+#>69   string          ttxt            (SimpleText)
+#>69   string          ufox            (Foreign File Access)
+
+# Just in case...
+
+102    string          mBIN            MacBinary III data with surprising version number
+
+# sas magic from Bruce Foster (bef@nwu.edu)
+#
+#0     string          SAS             SAS
+#>8    string          x               %s
+0      string          SAS             SAS
+>24    string          DATA            data file
+>24    string          CATALOG         catalog
+>24    string          INDEX           data file index
+>24    string          VIEW            data view
+# sas 7+ magic from Reinhold Koch (reinhold.koch@roche.com)
+#
+0x54    string          SAS             SAS 7+
+>0x9C   string          DATA            data file
+>0x9C   string          CATALOG         catalog
+>0x9C   string          INDEX           data file index
+>0x9C   string          VIEW            data view
+
+# spss magic for SPSS system and portable files, 
+#       from Bruce Foster (bef@nwu.edu).
+
+0      long            0xc1e2c3c9      SPSS Portable File
+>40    string          x               %s
+
+0      string          $FL2            SPSS System File
+>24    string          x               %s
+
+# Macintosh filesystem data
+# From "Tom N Harris" <telliamed@mac.com>
+# Fixed HFS+ and Partition map magic: Ethan Benson <erbenson@alaska.net>
+# The MacOS epoch begins on 1 Jan 1904 instead of 1 Jan 1970, so these
+# entries depend on the data arithmetic added after v.35
+# There's also some Pascal strings in here, ditto...
+
+# The boot block signature, according to IM:Files, is 
+# "for HFS volumes, this field always contains the value 0x4C4B."
+# But if this is true for MFS or HFS+ volumes, I don't know.
+# Alternatively, the boot block is supposed to be zeroed if it's
+# unused, so a simply >0 should suffice.
+
+0x400  beshort                 0xD2D7          Macintosh MFS data
+>0     beshort                 0x4C4B          (bootable)
+>0x40a beshort                 &0x8000         (locked)
+>0x402 beldate-0x7C25B080      x               created: %s,
+>0x406 beldate-0x7C25B080      >0              last backup: %s,
+>0x414 belong                  x               block size: %d,
+>0x412 beshort                 x               number of blocks: %d,
+>0x424 pstring                 x               volume name: %s
+
+# "BD" is has many false positives
+#0x400 beshort                 0x4244          Macintosh HFS data
+#>0    beshort                 0x4C4B          (bootable)
+#>0x40a        beshort                 &0x8000         (locked)
+#>0x40a        beshort                 ^0x0100         (mounted)
+#>0x40a        beshort                 &0x0200         (spared blocks)
+#>0x40a        beshort                 &0x0800         (unclean)
+#>0x47C        beshort                 0x482B          (Embedded HFS+ Volume)
+#>0x402        beldate-0x7C25B080      x               created: %s,
+#>0x406        beldate-0x7C25B080      x               last modified: %s,
+#>0x440        beldate-0x7C25B080      >0              last backup: %s,
+#>0x414        belong                  x               block size: %d,
+#>0x412        beshort                 x               number of blocks: %d,
+#>0x424        pstring                 x               volume name: %s
+
+0x400  beshort                 0x482B          Macintosh HFS Extended
+>&0    beshort                 x               version %d data
+>0     beshort                 0x4C4B          (bootable)
+>0x404 belong                  ^0x00000100     (mounted)
+>&2    belong                  &0x00000200     (spared blocks)
+>&2    belong                  &0x00000800     (unclean)
+>&2    belong                  &0x00008000     (locked)
+>&6    string                  x               last mounted by: '%.4s',
+# really, that should be treated as a belong and we print a string
+# based on the value. TN1150 only mentions '8.10' for "MacOS 8.1"
+>&14   beldate-0x7C25B080      x               created: %s,
+# only the creation date is local time, all other timestamps in HFS+ are UTC.
+>&18   bedate-0x7C25B080       x               last modified: %s,
+>&22   bedate-0x7C25B080       >0              last backup: %s,
+>&26   bedate-0x7C25B080       >0              last checked: %s,
+>&38   belong                  x               block size: %d,
+>&42   belong                  x               number of blocks: %d,
+>&46   belong                  x               free blocks: %d
+
+# I don't think this is really necessary since it doesn't do much and 
+# anything with a valid driver descriptor will also have a valid
+# partition map
+#0             beshort         0x4552          Apple Device Driver data
+#>&24          beshort         =1              \b, MacOS
+
+# Is that the partition type a cstring or a pstring? Well, IM says "strings 
+# shorter than 32 bytes must be terminated with NULL" so I'll treat it as a 
+# cstring. Of course, partitions can contain more than four entries, but 
+# what're you gonna do?
+0x200          beshort         0x504D          Apple Partition data
+>0x2           beshort         x               block size: %d,
+>0x230         string          x               first type: %s,
+>0x210         string          x               name: %s,
+>0x254         belong          x               number of blocks: %d,
+>0x400         beshort         0x504D          
+>>0x430                string          x               second type: %s,
+>>0x410                string          x               name: %s,
+>>0x454                belong          x               number of blocks: %d,
+>>0x800                beshort         0x504D          
+>>>0x830       string          x               third type: %s,
+>>>0x810       string          x               name: %s,
+>>>0x854       belong          x               number of blocks: %d,
+>>>0xa00       beshort         0x504D          
+>>>>0xa30      string          x               fourth type: %s,
+>>>>0xa10      string          x               name: %s,
+>>>>0xa54      belong          x               number of blocks: %d
+# AFAIK, only the signature is different
+0x200          beshort         0x5453          Apple Old Partition data
+>0x2           beshort         x               block size: %d,
+>0x230         string          x               first type: %s,
+>0x210         string          x               name: %s,
+>0x254         belong          x               number of blocks: %d,
+>0x400         beshort         0x504D          
+>>0x430                string          x               second type: %s,
+>>0x410                string          x               name: %s,
+>>0x454                belong          x               number of blocks: %d,
+>>0x800                beshort         0x504D          
+>>>0x830       string          x               third type: %s,
+>>>0x810       string          x               name: %s,
+>>>0x854       belong          x               number of blocks: %d,
+>>>0xa00       beshort         0x504D          
+>>>>0xa30      string          x               fourth type: %s,
+>>>>0xa10      string          x               name: %s,
+>>>>0xa54      belong          x               number of blocks: %d
+
+# From: Remi Mommsen <mommsen@slac.stanford.edu>
+0              string          BOMStore        Mac OS X bill of materials (BOM) fil
+
+#------------------------------------------------------------------------------
+# mathematica:  file(1) magic for mathematica files
+# "H. Nanosecond" <aldomel@ix.netcom.com>
+# Mathematica a multi-purpose math program
+# versions 2.2 and 3.0
+
+#mathematica .mb
+0      string  \064\024\012\000\035\000\000\000        Mathematica version 2 notebook
+0      string  \064\024\011\000\035\000\000\000        Mathematica version 2 notebook
+
+# .ma
+# multiple possibilites:
+
+0      string  (*^\n\n::[\011frontEndVersion\ =\       Mathematica notebook
+#>41   string  >\0     %s
+
+#0     string  (*^\n\n::[\011palette   Mathematica notebook version 2.x
+
+#0     string  (*^\n\n::[\011Information       Mathematica notebook version 2.x
+#>675  string  >\0     %s #doesn't work well
+
+# there may be 'cr' instread of 'nl' in some does this matter?
+
+# generic:
+0      string  (*^\r\r::[\011  Mathematica notebook version 2.x
+0      string  \(\*\^\r\n\r\n\:\:\[\011        Mathematica notebook version 2.x
+0      string  (*^\015                 Mathematica notebook version 2.x
+0      string  (*^\n\r\n\r::[\011      Mathematica notebook version 2.x
+0      string  (*^\r::[\011    Mathematica notebook version 2.x
+0      string  (*^\r\n::[\011  Mathematica notebook version 2.x
+0      string  (*^\n\n::[\011  Mathematica notebook version 2.x
+0      string  (*^\n::[\011    Mathematica notebook version 2.x
+
+
+# Mathematica .mx files
+
+#0     string  (*This\ is\ a\ Mathematica\ binary\ dump\ file.\ It\ can\ be\ loaded\ with\ Get.*)      Mathematica binary file
+0      string  (*This\ is\ a\ Mathematica\ binary\     Mathematica binary file
+#>71   string \000\010\010\010\010\000\000\000\000\000\000\010\100\010\000\000\000     
+# >71... is optional
+>88    string  >\0     from %s
+
+
+# Mathematica files PBF:
+# 115 115 101 120 102 106 000 001 000 000 000 203 000 001 000
+0      string  MMAPBF\000\001\000\000\000\203\000\001\000      Mathematica PBF (fonts I think)
+
+# .ml files  These are menu resources I think
+# these start with "[0-9][0-9][0-9]\ A~[0-9][0-9][0-9]\ 
+# how to put that into a magic rule?
+4      string  \ A~    MAthematica .ml file
+
+# .nb files
+#too long 0    string  (***********************************************************************\n\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Mathematica-Compatible Notebook     Mathematica 3.0 notebook
+0      string  (***********************        Mathematica 3.0 notebook
+
+# other (* matches it is a comment start in these langs
+0      string  (*      Mathematica, or Pascal,  Modula-2 or 3 code text
+
+#########################
+# MatLab v5
+0       string  MATLAB  Matlab v5 mat-file
+>126    short   0x494d  (big endian)
+>>124   beshort x       version 0x%04x
+>126    short   0x4d49  (little endian)
+>>124   leshort x       version 0x%04x
+
+#------------------------------------------------------------------------------
+# teapot:  file(1) magic for "teapot" spreadsheet
+#
+0       string          #!teapot\012xdr      teapot work sheet (XDR format)
+
+#------------------------------------------------------------------------------
+# psion:  file(1) magic for Psion handhelds data
+# from: Peter Breitenlohner <peb@mppmu.mpg.de>
+#
+0      lelong          0x10000037      Psion Series 5
+>4     lelong          0x10000039      font file
+>4     lelong          0x1000003A      printer driver
+>4     lelong          0x1000003B      clipboard
+>4     lelong          0x10000042      multi-bitmap image
+>4     lelong          0x1000006A      application infomation file
+>4     lelong          0x1000006D
+>>8    lelong          0x1000007D      sketch image
+>>8    lelong          0x1000007E      voice note
+>>8    lelong          0x1000007F      word file
+>>8    lelong          0x10000085      OPL program
+>>8    lelong          0x10000088      sheet file
+>>8    lelong          0x100001C4      EasyFax initialisation file
+>4     lelong          0x10000073      OPO module
+>4     lelong          0x10000074      OPL application
+>4     lelong          0x1000008A      exported multi-bitmap image
+
+0      lelong          0x10000041      Psion Series 5 ROM multi-bitmap image
+
+0      lelong          0x10000050      Psion Series 5
+>4     lelong          0x1000006D      database
+>4     lelong          0x100000E4      ini file
+
+0      lelong          0x10000079      Psion Series 5 binary:
+>4     lelong          0x00000000      DLL
+>4     lelong          0x10000049      comms hardware library
+>4     lelong          0x1000004A      comms protocol library
+>4     lelong          0x1000005D      OPX
+>4     lelong          0x1000006C      application
+>4     lelong          0x1000008D      DLL
+>4     lelong          0x100000AC      logical device driver
+>4     lelong          0x100000AD      physical device driver
+>4     lelong          0x100000E5      file transfer protocol
+>4     lelong          0x100000E5      file transfer protocol
+>4     lelong          0x10000140      printer defintion
+>4     lelong          0x10000141      printer defintion
+
+0      lelong          0x1000007A      Psion Series 5 executable
+
+#------------------------------------------------------------------------------
+# diff:  file(1) magic for diff(1) output
+#
+0      string          diff\   'diff' output text
+0      string          ***\            'diff' output text
+0      string          Only\ in\       'diff' output text
+0      string          Common\ subdirectories:\        'diff' output text
+
+#------------------------------------------------------------------------------
+# ESRI Shapefile format (.shp .shx .dbf=DBaseIII)
+# Based on info from
+# <URL:http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf>
+0      belong  9994    ESRI Shapefile
+>4     belong  =0
+>8     belong  =0
+>12    belong  =0
+>16    belong  =0
+>20    belong  =0
+>28    lelong  x       version %d
+>24    belong  x       length %d
+>32    lelong  =0      type Null Shape
+>32    lelong  =1      type Point
+>32    lelong  =3      type PolyLine
+>32    lelong  =5      type Polygon
+>32    lelong  =8      type MultiPoint
+>32    lelong  =11     type PointZ
+>32    lelong  =13     type PolyLineZ
+>32    lelong  =15     type PolygonZ
+>32    lelong  =18     type MultiPointZ
+>32    lelong  =21     type PointM
+>32    lelong  =23     type PolyLineM
+>32    lelong  =25     type PolygonM
+>32    lelong  =28     type MultiPointM
+>32    lelong  =31     type MultiPatch
+#------------------------------------------------------------------------------
+# GIMP Gradient: file(1) magic for the GIMP's gradient data files
+# by Federico Mena <federico@nuclecu.unam.mx>
+
+0       string          GIMP\ Gradient  GIMP gradient data
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the XCF image format used in the GIMP developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega@vt.edu)
+
+0      string          gimp\ xcf       GIMP XCF image data,
+>9     string          file            version 0,
+>9     string          v               version
+>>10   string          >\0             %s,
+>14    belong          x               %lu x
+>18    belong          x               %lu,
+>22     belong          0               RGB Color
+>22     belong          1               Greyscale
+>22     belong          2               Indexed Color
+>22    belong          >2              Unknown Image Type.
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the patterns used in the GIMP, developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega@vt.edu)
+
+20      string          GPAT            GIMP pattern data,
+>24     string          x               %s
+
+#------------------------------------------------------------------------------
+# XCF:  file(1) magic for the brushes used in the GIMP, developed
+#       by Spencer Kimball and Peter Mattis
+#       ('Bucky' LaDieu, nega@vt.edu)
+
+20      string          GIMP            GIMP brush data
+
+#------------------------------------------------------------------------------
+# adi: file(1) magic for ADi's objects
+# From Gregory McGarry <g.mcgarry@ieee.org>
+#
+0      leshort         0x521c          COFF DSP21k
+>18    lelong          &02             executable,
+>18    lelong          ^02
+>>18   lelong          &01             static object,
+>>18   lelong          ^01             relocatable object,
+>18    lelong          &010            stripped
+>18    lelong          ^010            not stripped
+
+#------------------------------------------------------------------------------
+# autocad:  file(1) magic for cad files
+#
+
+# AutoCAD DWG versions R13/R14 (www.autodesk.com)
+# Written December 01, 2003 by Lester Hightower
+# Based on the DWG File Format Specifications at http://www.opendwg.org/
+0      string         \101\103\061\060\061                AutoCAD
+>5     string         \062\000\000\000\000                DWG ver. R13
+>5     string         \064\000\000\000\000                DWG ver. R14
+
+# Microstation DGN/CIT Files (www.bentley.com)
+# Written October 30, 2003 by Lester Hightower
+# DGN is the default file extension of Microstation/Intergraph CAD files.
+# CIT is the proprietary raster format (similar to TIFF) used to attach
+# raster underlays to Microstation DGN (vector) drawings.
+# 
+# http://www.wotsit.org/search.asp
+# http://filext.com/detaillist.php?extdetail=DGN
+# http://filext.com/detaillist.php?extdetail=CIT
+#
+# http://www.bentley.com/products/default.cfm?objectid=97F351F5-9C35-4E5E-89C2
+# 3F86C928&method=display&p_objectid=97F351F5-9C35-4E5E-89C280A93F86C928
+# http://www.bentley.com/products/default.cfm?objectid=A5C2FD43-3AC9-4C71-B682
+# 721C479F&method=display&p_objectid=A5C2FD43-3AC9-4C71-B682C7BE721C479F
+0      string         \010\011\376                        Microstation
+>3     string         \002
+>>30   string         \372\104                            DGN File
+>>30   string         \172\104                            DGN File
+>>30   string         \026\105                            DGN File
+>4     string         \030\000\000                        CIT File
+
+# AutoCad, from Nahuel Greco
+0      string AC1012   AutoCad (release 12)
+0      string AC1014   AutoCad (release 14)
+
+#------------------------------------------------------------------------------
+# T602 editor documents 
+# by David Necas <yeti@physics.muni.cz>
+0      string  @CT\    T602 document data,
+>4     string  0       Kamenicky
+>4     string  1       CP 852
+>4     string  2       KOI8-CS
+>4     string  >2      unknown encoding
+
+# Vi IMproved Encrypted file 
+# by David Necas <yeti@physics.muni.cz>
+0      string  VimCrypt~       Vim encrypted file data
+
+#------------------------------------------------------------------------------
+# tex:  file(1) magic for TeX files
+#
+# From <conklin@talisman.kaleida.com>
+
+# Although we may know the offset of certain text fields in TeX DVI
+# and font files, we can't use them reliably because they are not
+# zero terminated. [but we do anyway, christos]
+0      string          \367\002        TeX DVI file
+>16    string          >\0             (%s)
+0      string          \367\203        TeX generic font data
+0      string          \367\131        TeX packed font data
+>3     string          >\0             (%s)
+0      string          \367\312        TeX virtual font data
+0      string          This\ is\ TeX,  TeX transcript text
+0      string          This\ is\ METAFONT,     METAFONT transcript text
+
+# There is no way to detect TeX Font Metric (*.tfm) files without
+# breaking them apart and reading the data.  The following patterns
+# match most *.tfm files generated by METAFONT or afm2tfm.
+2      string          \000\021        TeX font metric data
+>33    string          >\0             (%s)
+2      string          \000\022        TeX font metric data
+>33    string          >\0             (%s)
+
+# Texinfo and GNU Info, from Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          \\input\ texinfo        Texinfo source text
+0      string          This\ is\ Info\ file    GNU Info text
+
+# TeX documents, from Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          \\input         TeX document text
+0      string          \\section       LaTeX document text
+0      string          \\setlength     LaTeX document text
+0      string          \\documentstyle LaTeX document text
+0      string          \\chapter       LaTeX document text
+0      string          \\documentclass LaTeX 2e document text
+0      string          \\relax         LaTeX auxiliary file
+0      string          \\contentsline  LaTeX  table of contents
+0      string          %\ -*-latex-*-  LaTeX document text
+
+# Tex document, from Hendrik Scholz <hendrik@scholz.net>
+0   string      \\ifx       TeX document text
+
+# Index and glossary files
+0      string          \\indexentry    LaTeX raw index file
+0      string          \\begin{theindex}       LaTeX sorted index
+0      string          \\glossaryentry LaTeX raw glossary
+0      string          \\begin{theglossary}    LaTeX sorted glossary
+0      string          This\ is\ makeindex     Makeindex log file
+
+# End of TeX
+
+#------------------------------------------------------------------------------
+# file(1) magic for BibTex text files
+# From Hendrik Scholz <hendrik@scholz.net>
+
+0   string/c @article{        BibTeX text file
+0   string/c @book{           BibTeX text file
+0   string/c @inbook{         BibTeX text file
+0   string/c @incollection{   BibTeX text file
+0   string/c @inproceedings{  BibTeX text file
+0   string/c @manual{         BibTeX text file
+0   string/c @misc{           BibTeX text file
+0   string/c @preamble{       BibTeX text file
+0   string/c @phdthesis{      BibTeX text file
+0   string/c @techreport{     BibTeX text file
+0   string/c @unpublished{    BibTeX text file
+
+73  string %%%\ \ BibTeX-file{ BibTex text file (with full header)
+
+73  string %%%\ \ @BibTeX-style-file{   BibTeX style text file (with full header)
+
+0   string %\ BibTeX\ standard\ bibliography\      BibTeX standard bibliography style text file
+
+0   string %\ BibTeX\ `     BibTeX custom bibliography style text file
+
+0   string  @c\ @mapfile{   TeX font aliases text file
+
+
+#------------------------------------------------------------------------------
+# psdbms:  file(1) magic for psdatabase
+#
+0      belong&0xff00ffff       0x56000000      ps database
+>1     string  >\0     version %s
+>4     string  >\0     from kernel %s
+#------------------------------------------------------------------------------
+# convex:  file(1) magic for Convex boxes
+#
+# Convexes are big-endian.
+#
+# /*\
+#  * Below are the magic numbers and tests added for Convex.
+#  * Added at beginning, because they are expected to be used most.
+# \*/
+0      belong  0507    Convex old-style object
+>16    belong  >0      not stripped
+0      belong  0513    Convex old-style demand paged executable
+>16    belong  >0      not stripped
+0      belong  0515    Convex old-style pre-paged executable
+>16    belong  >0      not stripped
+0      belong  0517    Convex old-style pre-paged, non-swapped executable
+>16    belong  >0      not stripped
+0      belong  0x011257        Core file
+#
+# The following are a series of dump format magic numbers.  Each one
+# corresponds to a drastically different dump format.  The first on is
+# the original dump format on a 4.1 BSD or earlier file system.  The
+# second marks the change between the 4.1 file system and the 4.2 file
+# system.  The Third marks the changing of the block size from 1K
+# to 2K to be compatible with an IDC file system.  The fourth indicates
+# a dump that is dependent on Convex Storage Manager, because data in
+# secondary storage is not physically contained within the dump.
+# The restore program uses these number to determine how the data is
+# to be extracted.
+#
+24     belong  =60011  dump format, 4.1 BSD or earlier
+24     belong  =60012  dump format, 4.2 or 4.3 BSD without IDC
+24     belong  =60013  dump format, 4.2 or 4.3 BSD (IDC compatible)
+24     belong  =60014  dump format, Convex Storage Manager by-reference dump
+#
+# what follows is a bunch of bit-mask checks on the flags field of the opthdr.
+# If there is no `=' sign, assume just checking for whether the bit is set?
+#
+0      belong  0601            Convex SOFF
+>88    belong&0x000f0000       =0x00000000     c1
+>88    belong                  &0x00010000     c2
+>88    belong                  &0x00020000     c2mp
+>88    belong                  &0x00040000     parallel
+>88    belong                  &0x00080000     intrinsic
+>88    belong                  &0x00000001     demand paged
+>88    belong                  &0x00000002     pre-paged
+>88    belong                  &0x00000004     non-swapped
+>88    belong                  &0x00000008     POSIX
+#
+>84    belong                  &0x80000000     executable
+>84    belong                  &0x40000000     object
+>84    belong&0x20000000       =0              not stripped
+>84    belong&0x18000000       =0x00000000     native fpmode
+>84    belong&0x18000000       =0x10000000     ieee fpmode
+>84    belong&0x18000000       =0x18000000     undefined fpmode
+#
+0      belong                  0605            Convex SOFF core
+#
+0      belong                  0607            Convex SOFF checkpoint
+>88    belong&0x000f0000       =0x00000000     c1
+>88    belong                  &0x00010000     c2
+>88    belong                  &0x00020000     c2mp
+>88    belong                  &0x00040000     parallel
+>88    belong                  &0x00080000     intrinsic
+>88    belong                  &0x00000008     POSIX
+#
+>84    belong&0x18000000       =0x00000000     native fpmode
+>84    belong&0x18000000       =0x10000000     ieee fpmode
+>84    belong&0x18000000       =0x18000000     undefined fpmode
+
+#------------------------------------------------------------------------------
+# freebsd:  file(1) magic for FreeBSD objects
+#
+# All new-style FreeBSD magic numbers are in host byte order (i.e.,
+# little-endian on x86).
+#
+# XXX - this comes from the file "freebsd" in a recent FreeBSD version of
+# "file"; it, and the NetBSD stuff in "netbsd", appear to use different
+# schemes for distinguishing between executable images, shared libraries,
+# and object files.
+#
+# FreeBSD says:
+#
+#    Regardless of whether it's pure, demand-paged, or none of the
+#    above:
+#
+#      if the entry point is < 4096, then it's a shared library if
+#      the "has run-time loader information" bit is set, and is
+#      position-independent if the "is position-independent" bit
+#      is set;
+#
+#      if the entry point is >= 4096 (or >4095, same thing), then it's
+#      an executable, and is dynamically-linked if the "has run-time
+#      loader information" bit is set.
+#
+# On x86, NetBSD says:
+#
+#    If it's neither pure nor demand-paged:
+#
+#      if it has the "has run-time loader information" bit set, it's
+#      a dynamically-linked executable;
+#
+#      if it doesn't have that bit set, then:
+#
+#          if it has the "is position-independent" bit set, it's
+#          position-independent;
+#
+#          if the entry point is non-zero, it's an executable, otherwise
+#          it's an object file.
+#
+#    If it's pure:
+#
+#      if it has the "has run-time loader information" bit set, it's
+#      a dynamically-linked executable, otherwise it's just an
+#      executable.
+#
+#    If it's demand-paged:
+#
+#      if it has the "has run-time loader information" bit set,
+#      then:
+#
+#          if the entry point is < 4096, it's a shared library;
+#
+#          if the entry point is = 4096 or > 4096 (i.e., >= 4096),
+#          it's a dynamically-linked executable);
+#
+#      if it doesn't have the "has run-time loader information" bit
+#      set, then it's just an executable.
+#
+# (On non-x86, NetBSD does much the same thing, except that it uses
+# 8192 on 68K - except for "68k4k", which is presumably "68K with 4K
+# pages - SPARC, and MIPS, presumably because Sun-3's and Sun-4's
+# had 8K pages; dunno about MIPS.)
+#
+# I suspect the two will differ only in perverse and uninteresting cases
+# ("shared" libraries that aren't demand-paged and whose pages probably
+# won't actually be shared, executables with entry points <4096).
+#
+# I leave it to those more familiar with FreeBSD and NetBSD to figure out
+# what the right answer is (although using ">4095", FreeBSD-style, is
+# probably better than separately checking for "=4096" and ">4096",
+# NetBSD-style).  (The old "netbsd" file analyzed FreeBSD demand paged
+# executables using the NetBSD technique.)
+#
+0      lelong&0377777777       041400407       FreeBSD/i386
+>20    lelong                  <4096
+>>3    byte&0xC0               &0x80           shared library
+>>3    byte&0xC0               0x40            PIC object
+>>3    byte&0xC0               0x00            object
+>20    lelong                  >4095
+>>3    byte&0x80               0x80            dynamically linked executable
+>>3    byte&0x80               0x00            executable
+>16    lelong                  >0              not stripped
+
+0      lelong&0377777777       041400410       FreeBSD/i386 pure
+>20    lelong                  <4096
+>>3    byte&0xC0               &0x80           shared library
+>>3    byte&0xC0               0x40            PIC object
+>>3    byte&0xC0               0x00            object
+>20    lelong                  >4095
+>>3    byte&0x80               0x80            dynamically linked executable
+>>3    byte&0x80               0x00            executable
+>16    lelong                  >0              not stripped
+
+0      lelong&0377777777       041400413       FreeBSD/i386 demand paged
+>20    lelong                  <4096
+>>3    byte&0xC0               &0x80           shared library
+>>3    byte&0xC0               0x40            PIC object
+>>3    byte&0xC0               0x00            object
+>20    lelong                  >4095
+>>3    byte&0x80               0x80            dynamically linked executable
+>>3    byte&0x80               0x00            executable
+>16    lelong                  >0              not stripped
+
+0      lelong&0377777777       041400314       FreeBSD/i386 compact demand paged
+>20    lelong                  <4096
+>>3    byte&0xC0               &0x80           shared library
+>>3    byte&0xC0               0x40            PIC object
+>>3    byte&0xC0               0x00            object
+>20    lelong                  >4095
+>>3    byte&0x80               0x80            dynamically linked executable
+>>3    byte&0x80               0x00            executable
+>16    lelong                  >0              not stripped
+
+# XXX gross hack to identify core files
+# cores start with a struct tss; we take advantage of the following:
+# byte 7:     highest byte of the kernel stack pointer, always 0xfe
+#      8/9:   kernel (ring 0) ss value, always 0x0010
+#      10 - 27: ring 1 and 2 ss/esp, unused, thus always 0
+#      28:    low order byte of the current PTD entry, always 0 since the
+#             PTD is page-aligned
+#
+7      string  \357\020\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0        FreeBSD/i386 a.out core file
+>1039  string  >\0     from '%s'
+
+# /var/run/ld.so.hints
+# What are you laughing about?
+0      lelong                  011421044151    ld.so hints file (Little Endian
+>4     lelong                  >0              \b, version %d)
+>4     belong                  <=0             \b)
+0      belong                  011421044151    ld.so hints file (Big Endian
+>4     belong                  >0              \b, version %d)
+>4     belong                  <=0             \b)
+
+#
+# Files generated by FreeBSD scrshot(1)/vidcontrol(1) utilities
+#
+0      string  SCRSHOT_        scrshot(1) screenshot,
+>8     byte    x               version %d,
+>9     byte    2               %d bytes in header,
+>>10   byte    x               %d chars wide by
+>>11   byte    x               %d chars high
+
+#------------------------------------------------------------------------------
+# gcc:  file(1) magic for GCC special files
+#
+0      string          gpch            GCC precompiled header
+
+# The version field is annoying.  It's 3 characters, not zero-terminated.
+>5     byte            x                       (version %c
+>6     byte            x                       \b%c
+>7     byte            x                       \b%c)
+
+# 67 = 'C', 111 = 'o', 43 = '+', 79 = 'O'
+>4     byte            67                      for C
+>4     byte            111                     for Objective C
+>4     byte            43                      for C++
+>4     byte            79                      for Objective C++
+
+#-----------------------------------------------------------------------------
+# natinst:  file(1) magic for National Instruments Code Files
+
+#
+# From <egamez@fcfm.buap.mx> Enrique Gámez-Flores
+# version 1
+# Many formats still missing, we use, for the moment LabVIEW
+# We guess VXI format file. VISA, LabWindowsCVI, BridgeVIEW, etc, are missing
+#
+0       string          RSRC            National Instruments,
+# Check if it's a LabVIEW File
+>8      string          LV              LabVIEW File,
+# Check wich kind of file is
+>>10    string          SB              Code Resource File, data
+>>10    string          IN              Virtual Instrument Program, data
+>>10    string          AR              VI Library, data
+# This is for Menu Libraries
+>8      string          LMNULBVW        Portable File Names, data
+# This is for General Resources
+>8      string          rsc             Resources File, data
+# This is for VXI Package
+0       string          VMAP            National Instruments, VXI File, data
+#------------------------------------------------------------------------------
+# nitpicker:  file(1) magic for Flowfiles.
+# From: Christian Jachmann <C.Jachmann@gmx.net> http://www.nitpicker.de
+0      string  NPFF    NItpicker Flow File 
+>4     byte    x       V%d.
+>5     byte    x       %d
+>6     bedate  x       started: %s
+>10    bedate  x       stopped: %s
+>14    belong  x       Bytes: %u
+>18    belong  x       Bytes1: %u
+>22    belong  x       Flows: %u
+>26    belong  x       Pkts: %u
+
+#------------------------------------------------------------------------------
+# typeset:  file(1) magic for other typesetting
+#
+0      string          Interpress/Xerox        Xerox InterPress data
+>16    string          /                       (version
+>>17   string          >\0                     %s)
+
+#------------------------------------------------------------------------------
+# commands:  file(1) magic for various shells and interpreters
+#
+0      string          :                       shell archive or script for antique kernel text
+0      string/b        #!\ /bin/sh             Bourne shell script text executable
+0      string/b        #!\ /bin/csh            C shell script text executable
+# korn shell magic, sent by George Wu, gwu@clyde.att.com
+0      string/b        #!\ /bin/ksh            Korn shell script text executable
+0      string/b        #!\ /bin/tcsh           Tenex C shell script text executable
+0      string/b        #!\ /usr/local/tcsh     Tenex C shell script text executable
+0      string/b        #!\ /usr/local/bin/tcsh Tenex C shell script text executable
+
+#
+# zsh/ash/ae/nawk/gawk magic from cameron@cs.unsw.oz.au (Cameron Simpson)
+0      string/b        #!\ /bin/zsh            Paul Falstad's zsh script text executable
+0      string/b        #!\ /usr/bin/zsh        Paul Falstad's zsh script text executable
+0      string/b        #!\ /usr/local/bin/zsh  Paul Falstad's zsh script text executable
+0      string/b        #!\ /usr/local/bin/ash  Neil Brown's ash script text executable
+0      string/b        #!\ /usr/local/bin/ae   Neil Brown's ae script text executable
+0      string/b        #!\ /bin/nawk           new awk script text executable
+0      string/b        #!\ /usr/bin/nawk       new awk script text executable
+0      string/b        #!\ /usr/local/bin/nawk new awk script text executable
+0      string/b        #!\ /bin/gawk           GNU awk script text executable
+0      string/b        #!\ /usr/bin/gawk       GNU awk script text executable
+0      string/b        #!\ /usr/local/bin/gawk GNU awk script text executable
+#
+0      string/b        #!\ /bin/awk            awk script text executable
+0      string/b        #!\ /usr/bin/awk        awk script text executable
+0      string          BEGIN                   awk script text
+
+# AT&T Bell Labs' Plan 9 shell
+0      string/b        #!\ /bin/rc     Plan 9 rc shell script text executable
+
+# bash shell magic, from Peter Tobias (tobias@server.et-inf.fho-emden.de)
+0      string/b        #!\ /bin/bash   Bourne-Again shell script text executable
+0      string/b        #!\ /usr/local/bin/bash Bourne-Again shell script text executable
+
+# using env
+0      string          #!/usr/bin/env          a
+>15    string          >\0                     %s script text executable
+0      string          #!\ /usr/bin/env        a
+>16    string          >\0                     %s script text executable
+
+# PHP scripts
+# Ulf Harnhammar <ulfh@update.uu.se>
+0      string/c        =<?php                  PHP script text
+0      string          =<?\n                   PHP script text
+0      string          =<?\r                   PHP script text
+0      string/b        #!\ /usr/local/bin/php  PHP script text executable
+0      string/b        #!\ /usr/bin/php        PHP script text executable
+
+0      string          Zend\x00                PHP script Zend Optimizer data
+
+#------------------------------------------------------------------------------
+# encore:  file(1) magic for Encore machines
+#
+# XXX - needs to have the byte order specified (NS32K was little-endian,
+# dunno whether they run the 88K in little-endian mode or not).
+#
+0      short           0x154           Encore
+>20    short           0x107           executable
+>20    short           0x108           pure executable
+>20    short           0x10b           demand-paged executable
+>20    short           0x10f           unsupported executable
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+>22    short           0               -
+#>4    date            x               stamp %s
+0      short           0x155           Encore unsupported executable
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+>22    short           0               -
+#>4    date            x               stamp %s
+
+#------------------------------------------------------------------------------
+# filesystems:  file(1) magic for different filesystems
+#
+0      string  \366\366\366\366        PC formatted floppy with no filesystem
+# Sun disk labels
+# From /usr/include/sun/dklabel.h:
+0774   beshort         0xdabe          Sun disk label
+>0     string          x               '%s
+>>31   string          >\0             \b%s
+>>>63          string          >\0             \b%s
+>>>>95         string          >\0             \b%s
+>0     string          x               \b'
+>0734  short           >0              %d rpm,
+>0736  short           >0              %d phys cys,
+>0740  short           >0              %d alts/cyl,
+>0746  short           >0              %d interleave,
+>0750  short           >0              %d data cyls,
+>0752  short           >0              %d alt cyls,
+>0754  short           >0              %d heads/partition,
+>0756  short           >0              %d sectors/track,
+>0764  long            >0              start cyl %ld,
+>0770  long            x               %ld blocks
+# Is there a boot block written 1 sector in?
+>512    belong&077777777       0600407 \b, boot block present
+0x1FE  leshort 0xAA55                  x86 boot sector
+>2     string  OSBS                    \b, OS/BS MBR
+# J\xf6rg Jenderek <joerg.jenderek@gmx.net>
+>0x8C  string  Invalid\ partition\ table       \b, MS-DOS MBR
+>0x9D  string  Invalid\ partition\ table       \b, DR-DOS MBR, version 7.01 to 7.03
+>0x10F string  Ung\201ltige\ Partitionstabelle \b, MS-DOS MBR, german version 4.10.1998, 4.10.2222
+>0x8B  string  Ung\201ltige\ Partitionstabelle \b, MS-DOS MBR, german version 5.00 to 4.00.950
+>0x145 string  Default:\ F                     \b, FREE-DOS MBR
+>0     string  \0\0\0\0                \b, extended partition table
+# JuMP short     bootcodeoffset NOP assembler instructions will usually be EB xx 90
+# older drives may use E9 xx xx
+>0             lelong&0x009000EB       0x009000EB 
+>0             lelong&0x000000E9       0x000000E9 
+>>1            ubyte                   >37     \b, code offset 0x%x
+# mtools-3.9.8/msdos.h
+# usual values are marked with comments to get only informations of strange FAT systems
+# valid sectorsize are from 32 to 2048
+>>>11          uleshort        <2049   
+>>>>11         uleshort        >31     
+>>>>>3         string          >\0             \b, OEM-ID "%8.8s"
+>>>>>11                uleshort        >512            \b, Bytes/sector %u
+#>>>>>11       uleshort        =512            \b, Bytes/sector %u=512 (usual)
+>>>>>11                uleshort        <512            \b, Bytes/sector %u
+>>>>>13                ubyte           >1              \b, sectors/cluster %u
+#>>>>>13       ubyte           =1              \b, sectors/cluster %u (usual on Floppies)
+>>>>>14                uleshort        >32             \b, reserved sectors %u
+#>>>>>14       uleshort        =32             \b, reserved sectors %u (usual Fat32)
+#>>>>>14       uleshort        >1              \b, reserved sectors %u
+#>>>>>14       uleshort        =1              \b, reserved sectors %u (usual FAT12,FAT16)
+>>>>>14                uleshort        <1              \b, reserved sectors %u
+>>>>>16                ubyte           >2              \b, FATs %u
+#>>>>>16       ubyte           =2              \b, FATs %u (usual)
+>>>>>16                ubyte           =1              \b, FAT  %u
+>>>>>16                ubyte           >0
+>>>>>17                uleshort        >0              \b, root entries %u
+#>>>>>17       uleshort        =0              \b, root entries %u=0 (usual Fat32)
+>>>>>19                uleshort        >0              \b, sectors %u (volumes <=32 MB) 
+#>>>>>19       uleshort        =0              \b, sectors %u=0 (usual Fat32)
+>>>>>21                ubyte           >0xF0           \b, Media descriptor 0x%x
+#>>>>>21       ubyte           =0xF0           \b, Media descriptor 0x%x (usual floppy)
+>>>>>21                ubyte           <0xF0           \b, Media descriptor 0x%x
+>>>>>22                uleshort        >0              \b, sectors/FAT %u
+#>>>>>22       uleshort        =0              \b, sectors/FAT %u=0 (usual Fat32)
+>>>>>26                ubyte           >2              \b, heads %u
+#>>>>>26       ubyte           =2              \b, heads %u (usual floppy)
+>>>>>26                ubyte           =1              \b, heads %u
+>>>>>28                ulelong         >0              \b, hidden sectors %u
+#>>>>>28       ulelong         =0              \b, hidden sectors %u (usual floppy)
+>>>>>32                ulelong         >0              \b, sectors %u (volumes > 32 MB) 
+#>>>>>32       ulelong         =0              \b, sectors %u (volumes > 32 MB) 
+# FAT<32 specific 
+# NOT le FAT3=NOT 3TAF=0xCCABBEB9
+>>>>>82                ulelong&0xCCABBEB9      >0
+>>>>>>36       ubyte           >0x80           \b, physical drive 0x%x
+#>>>>>>36      ubyte           =0x80           \b, physical drive 0x%x=0x80 (usual harddisk)
+>>>>>>36       ubyte&0x7F      >0              \b, physical drive 0x%x
+#>>>>>>36      ubyte           =0              \b, physical drive 0x%x=0 (usual floppy)
+>>>>>>37       ubyte           >0              \b, reserved 0x%x
+#>>>>>>37      ubyte           =0              \b, reserved 0x%x
+>>>>>>38       ubyte           >0x29           \b, dos < 4.0 BootSector (0x%x)
+>>>>>>38       ubyte           <0x29           \b, dos < 4.0 BootSector (0x%x)
+>>>>>>38       ubyte           =0x29
+>>>>>>>39      ulelong         x               \b, serial number 0x%x
+>>>>>>>43      string          <NO\ NAME       \b, label: "%11.11s"
+>>>>>>>43      string          >NO\ NAME       \b, label: "%11.11s"
+>>>>>>>43      string          =NO\ NAME       \b, unlabeled
+>>>>>>54       string          FAT1            \b, FAT
+>>>>>>>54      string          FAT12           \b (12 bit)
+>>>>>>>54      string          FAT16           \b (16 bit)
+# FAT32 specific
+>>>>>82                string          FAT32           \b, FAT (32 bit)
+>>>>>>36       ulelong         x               \b, sectors/FAT %u
+>>>>>>40       uleshort        >0              \b, extension flags %u
+#>>>>>>40      uleshort        =0              \b, extension flags %u
+>>>>>>42       uleshort        >0              \b, fsVersion %u
+#>>>>>>42      uleshort        =0              \b, fsVersion %u (usual)
+>>>>>>44       ulelong         >2              \b, rootdir cluster %u
+#>>>>>>44      ulelong         =2              \b, rootdir cluster %u
+#>>>>>>44      ulelong         =1              \b, rootdir cluster %u
+>>>>>>48       uleshort        >1              \b, infoSector %u
+#>>>>>>48      uleshort        =1              \b, infoSector %u (usual)
+>>>>>>48       uleshort        <1              \b, infoSector %u
+>>>>>>50       uleshort        >6              \b, Backup boot sector %u
+#>>>>>>50      uleshort        =6              \b, Backup boot sector %u (usual) 
+>>>>>>50       uleshort        <6              \b, Backup boot sector %u
+>>>>>>54       ulelong         >0              \b, reserved1 0x%x
+>>>>>>58       ulelong         >0              \b, reserved2 0x%x
+>>>>>>62       ulelong         >0              \b, reserved3 0x%x
+# same structure as FAT1X 
+>>>>>>64       ubyte           >0x80           \b, physical drive 0x%x
+#>>>>>>64      ubyte           =0x80           \b, physical drive 0x%x=80 (usual harddisk)
+>>>>>>64       ubyte&0x7F      >0              \b, physical drive 0x%x
+#>>>>>>64      ubyte           =0              \b, physical drive 0x%x=0 (usual floppy)
+>>>>>>65       ubyte           >0              \b, reserved 0x%x
+>>>>>>66       ubyte           >0x29           \b, dos < 4.0 BootSector (0x%x)
+>>>>>>66       ubyte           <0x29           \b, dos < 4.0 BootSector (0x%x)
+>>>>>>66       ubyte           =0x29
+>>>>>>>67      ulelong         x               \b, serial number 0x%x
+>>>>>>>71      string          <NO\ NAME       \b, label: "%11.11s"
+>>>>>>71       string          >NO\ NAME       \b, label: "%11.11s"
+>>>>>>71       string          =NO\ NAME       \b, unlabeled
+### FATs end
+>0x200 lelong  0x82564557              \b, BSD disklabel
+# FATX 
+0              string          FATX            FATX filesystem data
+
+
+# Minix filesystems - Juan Cespedes <cespedes@debian.org>
+0x410  leshort         0x137f          Minix filesystem
+0x410  beshort         0x137f          Minix filesystem (big endian),
+>0x402 beshort         !0              \b, %d zones
+>0x1e  string          minix           \b, bootable
+0x410  leshort         0x138f          Minix filesystem, 30 char names
+0x410  leshort         0x2468          Minix filesystem, version 2
+0x410  leshort         0x2478          Minix filesystem, version 2, 30 char names
+
+# romfs filesystems - Juan Cespedes <cespedes@debian.org>
+0      string          -rom1fs-\0      romfs filesystem, version 1
+>8     belong  x                       %d bytes,
+>16    string  x                       named %s.
+
+# netboot image - Juan Cespedes <cespedes@debian.org>
+0      lelong          0x1b031336L     Netboot image,
+>4     lelong&0xFFFFFF00       0
+>>4    lelong&0x100    0x000           mode 2
+>>4    lelong&0x100    0x100           mode 3
+>4     lelong&0xFFFFFF00       !0      unknown mode
+
+0x18b  string  OS/2    OS/2 Boot Manager
+
+9564   lelong          0x00011954      Unix Fast File system (little-endian),
+>8404  string          x               last mounted on %s,
+#>9504 ledate          x               last checked at %s,
+>8224  ledate          x               last written at %s,
+>8401  byte            x               clean flag %d,
+>8228  lelong          x               number of blocks %d,
+>8232  lelong          x               number of data blocks %d,
+>8236  lelong          x               number of cylinder groups %d,
+>8240  lelong          x               block size %d,
+>8244  lelong          x               fragment size %d,
+>8252  lelong          x               minimum percentage of free blocks %d,
+>8256  lelong          x               rotational delay %dms,
+>8260  lelong          x               disk rotational speed %drps,
+>8320  lelong          0               TIME optimization
+>8320  lelong          1               SPACE optimization
+
+9564   belong          0x00011954      Unix Fast File system (big-endian),
+>7168   long           0x4c41424c      Apple UFS Volume
+>>7186  string         x               named %s,
+>>7176  belong         x               volume label version %d,
+>>7180  bedate         x               created on %s,
+>8404  string          x               last mounted on %s,
+#>9504 bedate          x               last checked at %s,
+>8224  bedate          x               last written at %s,
+>8401  byte            x               clean flag %d,
+>8228  belong          x               number of blocks %d,
+>8232  belong          x               number of data blocks %d,
+>8236  belong          x               number of cylinder groups %d,
+>8240  belong          x               block size %d,
+>8244  belong          x               fragment size %d,
+>8252  belong          x               minimum percentage of free blocks %d,
+>8256  belong          x               rotational delay %dms,
+>8260  belong          x               disk rotational speed %drps,
+>8320  belong          0               TIME optimization
+>8320  belong          1               SPACE optimization
+
+# ext2/ext3 filesystems - Andreas Dilger <adilger@turbolabs.com>
+0x438  leshort         0xEF53          Linux
+>0x44c lelong          x               rev %d
+>0x43e leshort         x               \b.%d
+>0x45c lelong          ^0x0000004      ext2 filesystem data
+>>0x43a        leshort         ^0x0000001      (mounted or unclean)
+>0x45c lelong          &0x0000004      ext3 filesystem data
+>>0x460        lelong          &0x0000004      (needs journal recovery)
+>0x43a leshort         &0x0000002      (errors)
+>0x460 lelong          &0x0000001      (compressed)
+#>0x460        lelong          &0x0000002      (filetype)
+#>0x464        lelong          &0x0000001      (sparse_super)
+>0x464 lelong          &0x0000002      (large files)
+
+# SGI disk labels - Nathan Scott <nathans@debian.org>
+0      belong          0x0BE5A941      SGI disk label (volume header)
+
+# SGI XFS filesystem - Nathan Scott <nathans@debian.org>
+0      belong          0x58465342      SGI XFS filesystem data
+>0x4   belong          x               (blksz %d,
+>0x68  beshort         x               inosz %d,
+>0x64  beshort         ^0x2004         v1 dirs)
+>0x64  beshort         &0x2004         v2 dirs)
+
+############################################################################
+# Minix-ST kernel floppy
+0x800  belong          0x46fc2700      Atari-ST Minix kernel image
+>19    string          \240\5\371\5\0\011\0\2\0        \b, 720k floppy
+>19    string          \320\2\370\5\0\011\0\1\0        \b, 360k floppy
+
+############################################################################
+# Hmmm, is this a better way of detecting _standard_ floppy images ?
+19     string          \320\2\360\3\0\011\0\1\0        DOS floppy 360k
+>0x1FE leshort         0xAA55          \b, x86 hard disk boot sector
+19     string          \240\5\371\3\0\011\0\2\0        DOS floppy 720k
+>0x1FE leshort         0xAA55          \b, x86 hard disk boot sector
+19     string          \100\013\360\011\0\022\0\2\0    DOS floppy 1440k
+>0x1FE leshort         0xAA55          \b, x86 hard disk boot sector
+
+19     string          \240\5\371\5\0\011\0\2\0        DOS floppy 720k, IBM
+>0x1FE leshort         0xAA55          \b, x86 hard disk boot sector
+19     string          \100\013\371\5\0\011\0\2\0      DOS floppy 1440k, mkdosfs
+>0x1FE leshort         0xAA55          \b, x86 hard disk boot sector
+
+19     string          \320\2\370\5\0\011\0\1\0        Atari-ST floppy 360k
+19     string          \240\5\371\5\0\011\0\2\0        Atari-ST floppy 720k
+
+#  Valid media descriptor bytes for MS-DOS:
+#
+#     Byte   Capacity   Media Size and Type
+#     -------------------------------------------------
+#
+#     F0     2.88 MB    3.5-inch, 2-sided, 36-sector
+#     F0     1.44 MB    3.5-inch, 2-sided, 18-sector
+#     F9     720K       3.5-inch, 2-sided, 9-sector
+#     F9     1.2 MB     5.25-inch, 2-sided, 15-sector
+#     FD     360K       5.25-inch, 2-sided, 9-sector
+#     FF     320K       5.25-inch, 2-sided, 8-sector
+#     FC     180K       5.25-inch, 1-sided, 9-sector
+#     FE     160K       5.25-inch, 1-sided, 8-sector
+#     FE     250K       8-inch, 1-sided, single-density
+#     FD     500K       8-inch, 2-sided, single-density
+#     FE     1.2 MB     8-inch, 2-sided, double-density
+#     F8     -----      Fixed disk 
+#
+#     FC     xxxK       Apricot 70x1x9 boot disk.
+#
+# Originally a bitmap:
+#  xxxxxxx0    Not two sided
+#  xxxxxxx1    Double sided
+#  xxxxxx0x    Not 8 SPT
+#  xxxxxx1x    8 SPT
+#  xxxxx0xx    Not Removable drive
+#  xxxxx1xx    Removable drive
+#  11111xxx    Must be one.
+#
+# But now it's rather random:
+#  111111xx    Low density disk
+#        00    SS, Not 8 SPT
+#        01    DS, Not 8 SPT
+#        10    SS, 8 SPT
+#        11    DS, 8 SPT
+#
+#  11111001    Double density 3½ floppy disk, high density 5¼
+#  11110000    High density 3½ floppy disk
+#  11111000    Hard disk any format
+#
+
+# CDROM Filesystems
+32769    string    CD001     ISO 9660 CD-ROM filesystem data
+# "application id" which appears to be used as a volume label
+>32808  string    >\0       '%s'
+>34816  string    \000CD001\001EL\ TORITO\ SPECIFICATION    (bootable)
+37633    string    CD001     ISO 9660 CD-ROM filesystem data (raw 2352 byte sectors)
+32776    string    CDROM     High Sierra CD-ROM filesystem data
+
+# cramfs filesystem - russell@coker.com.au
+0       lelong    0x28cd3d45      Linux Compressed ROM File System data, little endian
+>4      lelong  x size %d
+>8      lelong  &1 version #2
+>8      lelong  &2 sorted_dirs
+>8      lelong  &4 hole_support
+>32     lelong  x CRC 0x%x,
+>36     lelong  x edition %d,
+>40     lelong  x %d blocks,
+>44     lelong  x %d files
+
+0       belong    0x28cd3d45      Linux Compressed ROM File System data, big endian
+>4      belong  x size %d
+>8      belong  &1 version #2
+>8      belong  &2 sorted_dirs
+>8      belong  &4 hole_support
+>32     belong  x CRC 0x%x,
+>36     belong  x edition %d,
+>40     belong  x %d blocks,
+>44     belong  x %d files
+
+# reiserfs - russell@coker.com.au
+0x10034                string  ReIsErFs        ReiserFS V3.5
+0x10034                string  ReIsEr2Fs       ReiserFS V3.6
+>0x1002c       leshort x               block size %d
+>0x10032       leshort &2              (mounted or unclean)
+>0x10000       lelong  x               num blocks %d
+>0x10040       lelong  1               tea hash
+>0x10040       lelong  2               yura hash
+>0x10040       lelong  3               r5 hash
+
+# JFFS - russell@coker.com.au
+0      lelong  0x34383931      Linux Journalled Flash File system, little endian
+0      belong  0x34383931      Linux Journalled Flash File system, big endian
+
+# EST flat binary format (which isn't, but anyway)
+# From: Mark Brown <broonie@sirena.org.uk>
+0      string  ESTFBINR        EST flat binary
+
+# Aculab VoIP firmware
+# From: Mark Brown <broonie@sirena.org.uk>
+0      string  VoIP\ Startup\ and      Aculab VoIP firmware
+>35    string  x       format %s
+
+# PPCBoot image file
+# From: Mark Brown <broonie@sirena.org.uk>
+0      belong  0x27051956      PPCBoot image
+>4     string  PPCBoot
+>>12   string  x               version %s
+
+# JFFS2 file system
+0       leshort         0x1984                  Linux old jffs2 filesystem data little endian
+0       lelong          0xe0011985              Linux jffs2 filesystem data little endian
+
+#------------------------------------------------------------------------------
+# hp:  file(1) magic for Hewlett Packard machines (see also "printer")
+#
+# XXX - somebody should figure out whether any byte order needs to be
+# applied to the "TML" stuff; I'm assuming the Apollo stuff is
+# big-endian as it was mostly 68K-based.
+#
+# I think the 500 series was the old stack-based machines, running a
+# UNIX environment atop the "SUN kernel"; dunno whether it was
+# big-endian or little-endian.
+#
+# Daniel Quinlan (quinlan@yggdrasil.com): hp200 machines are 68010 based;
+# hp300 are 68020+68881 based; hp400 are also 68k.  The following basic
+# HP magic is useful for reference, but using "long" magic is a better
+# practice in order to avoid collisions.
+#
+# Guy Harris (guy@netapp.com): some additions to this list came from
+# HP-UX 10.0's "/usr/include/sys/unistd.h" (68030, 68040, PA-RISC 1.1,
+# 1.2, and 2.0).  The 1.2 and 2.0 stuff isn't in the HP-UX 10.0
+# "/etc/magic", though, except for the "archive file relocatable library"
+# stuff, and the 68030 and 68040 stuff isn't there at all - are they not
+# used in executables, or have they just not yet updated "/etc/magic"
+# completely?
+#
+# 0    beshort         200             hp200 (68010) BSD binary
+# 0    beshort         300             hp300 (68020+68881) BSD binary
+# 0    beshort         0x20c           hp200/300 HP-UX binary
+# 0    beshort         0x20d           hp400 (68030) HP-UX binary
+# 0    beshort         0x20e           hp400 (68040?) HP-UX binary
+# 0    beshort         0x20b           PA-RISC1.0 HP-UX binary
+# 0    beshort         0x210           PA-RISC1.1 HP-UX binary
+# 0    beshort         0x211           PA-RISC1.2 HP-UX binary
+# 0    beshort         0x214           PA-RISC2.0 HP-UX binary
+
+#
+# The "misc" stuff needs a byte order; the archives look suspiciously
+# like the old 177545 archives (0xff65 = 0177545).
+#
+#### Old Apollo stuff
+0      beshort         0627            Apollo m68k COFF executable
+>18    beshort         ^040000         not stripped
+>22    beshort         >0              - version %ld
+0      beshort         0624            apollo a88k COFF executable
+>18    beshort         ^040000         not stripped
+>22    beshort         >0              - version %ld
+0       long            01203604016     TML 0123 byte-order format
+0       long            01702407010     TML 1032 byte-order format
+0       long            01003405017     TML 2301 byte-order format
+0       long            01602007412     TML 3210 byte-order format
+#### PA-RISC 1.1
+0      belong          0x02100106      PA-RISC1.1 relocatable object
+0      belong          0x02100107      PA-RISC1.1 executable
+>168   belong          &0x00000004     dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x02100108      PA-RISC1.1 shared executable
+>168   belong&0x4      0x4             dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x0210010b      PA-RISC1.1 demand-load executable
+>168   belong&0x4      0x4             dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x0210010e      PA-RISC1.1 shared library
+>96    belong          >0              - not stripped
+
+0      belong          0x0210010d      PA-RISC1.1 dynamic load library
+>96    belong          >0              - not stripped
+
+#### PA-RISC 2.0
+0      belong          0x02140106      PA-RISC2.0 relocatable object
+
+0       belong         0x02140107      PA-RISC2.0 executable
+>168   belong          &0x00000004     dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0       belong         0x02140108      PA-RISC2.0 shared executable
+>168   belong          &0x00000004     dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0       belong         0x0214010b      PA-RISC2.0 demand-load executable
+>168   belong          &0x00000004     dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0       belong         0x0214010e      PA-RISC2.0 shared library
+>96    belong          >0              - not stripped
+
+0       belong         0x0214010d      PA-RISC2.0 dynamic load library
+>96    belong          >0              - not stripped
+
+#### 800
+0      belong          0x020b0106      PA-RISC1.0 relocatable object
+
+0      belong          0x020b0107      PA-RISC1.0 executable
+>168   belong&0x4      0x4             dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x020b0108      PA-RISC1.0 shared executable
+>168   belong&0x4      0x4             dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x020b010b      PA-RISC1.0 demand-load executable
+>168   belong&0x4      0x4             dynamically linked
+>(144) belong          0x054ef630      dynamically linked
+>96    belong          >0              - not stripped
+
+0      belong          0x020b010e      PA-RISC1.0 shared library
+>96    belong          >0              - not stripped
+
+0      belong          0x020b010d      PA-RISC1.0 dynamic load library
+>96    belong          >0              - not stripped
+
+0      belong          0x213c6172      archive file
+>68    belong          0x020b0619      - PA-RISC1.0 relocatable library
+>68    belong          0x02100619      - PA-RISC1.1 relocatable library
+>68    belong          0x02110619      - PA-RISC1.2 relocatable library
+>68    belong          0x02140619      - PA-RISC2.0 relocatable library
+
+#### 500
+0      long            0x02080106      HP s500 relocatable executable
+>16    long            >0              - version %ld
+
+0      long            0x02080107      HP s500 executable
+>16    long            >0              - version %ld
+
+0      long            0x02080108      HP s500 pure executable
+>16    long            >0              - version %ld
+
+#### 200
+0      belong          0x020c0108      HP s200 pure executable
+>4     beshort         >0              - version %ld
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x40000000     dynamically linked
+>8     belong          &0x20000000     debuggable
+>36    belong          >0              not stripped
+
+0      belong          0x020c0107      HP s200 executable
+>4     beshort         >0              - version %ld
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x40000000     dynamically linked
+>8     belong          &0x20000000     debuggable
+>36    belong          >0              not stripped
+
+0      belong          0x020c010b      HP s200 demand-load executable
+>4     beshort         >0              - version %ld
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x40000000     dynamically linked
+>8     belong          &0x20000000     debuggable
+>36    belong          >0              not stripped
+
+0      belong          0x020c0106      HP s200 relocatable executable
+>4     beshort         >0              - version %ld
+>6     beshort         >0              - highwater %d
+>8     belong          &0x80000000     save fp regs
+>8     belong          &0x20000000     debuggable
+>8     belong          &0x10000000     PIC
+
+0      belong          0x020a0108      HP s200 (2.x release) pure executable
+>4     beshort         >0              - version %ld
+>36    belong          >0              not stripped
+
+0      belong          0x020a0107      HP s200 (2.x release) executable
+>4     beshort         >0              - version %ld
+>36    belong          >0              not stripped
+
+0      belong          0x020c010e      HP s200 shared library
+>4     beshort         >0              - version %ld
+>6     beshort         >0              - highwater %d
+>36    belong          >0              not stripped
+
+0      belong          0x020c010d      HP s200 dynamic load library
+>4     beshort         >0              - version %ld
+>6     beshort         >0              - highwater %d
+>36    belong          >0              not stripped
+
+#### MISC
+0      long            0x0000ff65      HP old archive
+0      long            0x020aff65      HP s200 old archive
+0      long            0x020cff65      HP s200 old archive
+0      long            0x0208ff65      HP s500 old archive
+
+0      long            0x015821a6      HP core file
+
+0      long            0x4da7eee8      HP-WINDOWS font
+>8     byte            >0              - version %ld
+0      string          Bitmapfile      HP Bitmapfile
+
+0      string          IMGfile CIS     compimg HP Bitmapfile
+# XXX - see "lif"
+#0     short           0x8000          lif file
+0      long            0x020c010c      compiled Lisp
+
+0      string          msgcat01        HP NLS message catalog,
+>8     long            >0              %d messages
+
+# addendum to /etc/magic with HP-48sx file-types by phk@data.fls.dk 1jan92
+0      string          HPHP48-         HP48 binary
+>7     byte            >0              - Rev %c
+>8     beshort         0x1129          (ADR)
+>8     beshort         0x3329          (REAL)
+>8     beshort         0x5529          (LREAL)
+>8     beshort         0x7729          (COMPLX)
+>8     beshort         0x9d29          (LCOMPLX)
+>8     beshort         0xbf29          (CHAR)
+>8     beshort         0xe829          (ARRAY)
+>8     beshort         0x0a2a          (LNKARRAY)
+>8     beshort         0x2c2a          (STRING)
+>8     beshort         0x4e2a          (HXS)
+>8     beshort         0x742a          (LIST)
+>8     beshort         0x962a          (DIR)
+>8     beshort         0xb82a          (ALG)
+>8     beshort         0xda2a          (UNIT)
+>8     beshort         0xfc2a          (TAGGED)
+>8     beshort         0x1e2b          (GROB)
+>8     beshort         0x402b          (LIB)
+>8     beshort         0x622b          (BACKUP)
+>8     beshort         0x882b          (LIBDATA)
+>8     beshort         0x9d2d          (PROG)
+>8     beshort         0xcc2d          (CODE)
+>8     beshort         0x482e          (GNAME)
+>8     beshort         0x6d2e          (LNAME)
+>8     beshort         0x922e          (XLIB)
+0      string          %%HP:           HP48 text
+>6     string          T(0)            - T(0)
+>6     string          T(1)            - T(1)
+>6     string          T(2)            - T(2)
+>6     string          T(3)            - T(3)
+>10    string          A(D)            A(D)
+>10    string          A(R)            A(R)
+>10    string          A(G)            A(G)
+>14    string          F(.)            F(.);
+>14    string          F(,)            F(,);
+
+# hpBSD magic numbers
+0      beshort         200             hp200 (68010) BSD
+>2     beshort         0407            impure binary
+>2     beshort         0410            read-only binary
+>2     beshort         0413            demand paged binary
+0      beshort         300             hp300 (68020+68881) BSD
+>2     beshort         0407            impure binary
+>2     beshort         0410            read-only binary
+>2     beshort         0413            demand paged binary
+#
+# From David Gero <dgero@nortelnetworks.com>
+# HP-UX 10.20 core file format from /usr/include/sys/core.h
+# Unfortunately, HP-UX uses corehead blocks without specifying the order
+# There are four we care about:
+#     CORE_KERNEL, which starts with the string "HP-UX"
+#     CORE_EXEC, which contains the name of the command
+#     CORE_PROC, which contains the signal number that caused the core dump
+#     CORE_FORMAT, which contains the version of the core file format (== 1)
+# The only observed order in real core files is KERNEL, EXEC, FORMAT, PROC
+# but we include all 6 variations of the order of the first 3, and
+# assume that PROC will always be last
+# Order 1: KERNEL, EXEC, FORMAT, PROC
+0x10           string  HP-UX
+>0             belong  2
+>>0xC          belong  0x3C
+>>>0x4C                belong  0x100
+>>>>0x58       belong  0x44
+>>>>>0xA0      belong  1
+>>>>>>0xAC     belong  4
+>>>>>>>0xB0    belong  1
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0x90  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+# Order 2: KERNEL, FORMAT, EXEC, PROC
+>>>0x4C                belong  1
+>>>>0x58       belong  4
+>>>>>0x5C      belong  1
+>>>>>>0x60     belong  0x100
+>>>>>>>0x6C    belong  0x44
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0xA4  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+# Order 3: FORMAT, KERNEL, EXEC, PROC
+0x24           string  HP-UX
+>0             belong  1
+>>0xC          belong  4
+>>>0x10                belong  1
+>>>>0x14       belong  2
+>>>>>0x20      belong  0x3C
+>>>>>>0x60     belong  0x100
+>>>>>>>0x6C    belong  0x44
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0xA4  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+# Order 4: EXEC, KERNEL, FORMAT, PROC
+0x64           string  HP-UX
+>0             belong  0x100
+>>0xC          belong  0x44
+>>>0x54                belong  2
+>>>>0x60       belong  0x3C
+>>>>>0xA0      belong  1
+>>>>>>0xAC     belong  4
+>>>>>>>0xB0    belong  1
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0x44  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+# Order 5: FORMAT, EXEC, KERNEL, PROC
+0x78           string  HP-UX
+>0             belong  1
+>>0xC          belong  4
+>>>0x10                belong  1
+>>>>0x14       belong  0x100
+>>>>>0x20      belong  0x44
+>>>>>>0x68     belong  2
+>>>>>>>0x74    belong  0x3C
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0x58  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+# Order 6: EXEC, FORMAT, KERNEL, PROC
+>0             belong  0x100
+>>0xC          belong  0x44
+>>>0x54                belong  1
+>>>>0x60       belong  4
+>>>>>0x64      belong  1
+>>>>>>0x68     belong  2
+>>>>>>>0x74    belong  0x2C
+>>>>>>>>0xB4   belong  4               core file
+>>>>>>>>>0x44  string  >\0             from '%s'
+>>>>>>>>>0xC4  belong  3               - received SIGQUIT
+>>>>>>>>>0xC4  belong  4               - received SIGILL
+>>>>>>>>>0xC4  belong  5               - received SIGTRAP
+>>>>>>>>>0xC4  belong  6               - received SIGABRT
+>>>>>>>>>0xC4  belong  7               - received SIGEMT
+>>>>>>>>>0xC4  belong  8               - received SIGFPE
+>>>>>>>>>0xC4  belong  10              - received SIGBUS
+>>>>>>>>>0xC4  belong  11              - received SIGSEGV
+>>>>>>>>>0xC4  belong  12              - received SIGSYS
+>>>>>>>>>0xC4  belong  33              - received SIGXCPU
+>>>>>>>>>0xC4  belong  34              - received SIGXFSZ
+
+# From: AMAKAWA Shuhei <sa264@cam.ac.uk>
+0      string  HPHP49-                 HP49 binary
+
+
+#------------------------------------------------------------------------------
+# JPEG images
+# SunOS 5.5.1 had
+#
+#      0       string          \377\330\377\340        JPEG file
+#      0       string          \377\330\377\356        JPG file
+#
+# both of which turn into "JPEG image data" here.
+#
+0      beshort         0xffd8          JPEG image data
+>6     string          JFIF            \b, JFIF standard
+# The following added by Erik Rossen <rossen@freesurf.ch> 1999-09-06
+# in a vain attempt to add image size reporting for JFIF.  Note that these
+# tests are not fool-proof since some perfectly valid JPEGs are currently
+# impossible to specify in magic(4) format.
+# First, a little JFIF version info:
+>>11   byte            x               \b %d.
+>>12   byte            x               \b%02d
+# Next, the resolution or aspect ratio of the image:
+#>>13  byte            0               \b, aspect ratio
+#>>13  byte            1               \b, resolution (DPI)
+#>>13  byte            2               \b, resolution (DPCM)
+#>>4   beshort         x               \b, segment length %d
+# Next, show thumbnail info, if it exists:
+>>18   byte            !0              \b, thumbnail %dx
+>>>19  byte            x               \b%d
+
+# EXIF moved down here to avoid reporting a bogus version number,
+# and EXIF version number printing added.
+#   - Patrik R=E5dman <patrik+file-magic@iki.fi>
+>6     string          Exif            \b, EXIF standard
+# Look for EXIF IFD offset in IFD 0, and then look for EXIF version tag in EXIF IFD.
+# All possible combinations of entries have to be enumerated, since no looping
+# is possible. And both endians are possible...
+# The combinations included below are from real-world JPEGs.
+# Little-endian
+>>12   string          II              
+# IFD 0 Entry #5:
+>>>70  leshort         0x8769          
+# EXIF IFD Entry #1:
+>>>>(78.l+14)  leshort 0x9000          
+>>>>>(78.l+23) byte    x               %c
+>>>>>(78.l+24) byte    x               \b.%c
+>>>>>(78.l+25) byte    !0x30           \b%c
+# IFD 0 Entry #9:
+>>>118 leshort         0x8769          
+# EXIF IFD Entry #3:
+>>>>(126.l+38) leshort 0x9000          
+>>>>>(126.l+47)        byte    x               %c
+>>>>>(126.l+48)        byte    x               \b.%c
+>>>>>(126.l+49)        byte    !0x30           \b%c
+# IFD 0 Entry #10
+>>>130 leshort         0x8769          
+# EXIF IFD Entry #3:
+>>>>(138.l+38) leshort 0x9000          
+>>>>>(138.l+47)        byte    x               %c
+>>>>>(138.l+48)        byte    x               \b.%c
+>>>>>(138.l+49)        byte    !0x30           \b%c
+# EXIF IFD Entry #4:
+>>>>(138.l+50) leshort 0x9000          
+>>>>>(138.l+59)        byte    x               %c
+>>>>>(138.l+60)        byte    x               \b.%c
+>>>>>(138.l+61)        byte    !0x30           \b%c
+# EXIF IFD Entry #5:
+>>>>(138.l+62) leshort 0x9000          
+>>>>>(138.l+71)        byte    x               %c
+>>>>>(138.l+72)        byte    x               \b.%c
+>>>>>(138.l+73)        byte    !0x30           \b%c
+# IFD 0 Entry #11
+>>>142 leshort         0x8769          
+# EXIF IFD Entry #3:
+>>>>(150.l+38) leshort 0x9000          
+>>>>>(150.l+47)        byte    x               %c
+>>>>>(150.l+48)        byte    x               \b.%c
+>>>>>(150.l+49)        byte    !0x30           \b%c
+# EXIF IFD Entry #4:
+>>>>(150.l+50) leshort 0x9000          
+>>>>>(150.l+59)        byte    x               %c
+>>>>>(150.l+60)        byte    x               \b.%c
+>>>>>(150.l+61)        byte    !0x30           \b%c
+# EXIF IFD Entry #5:
+>>>>(150.l+62) leshort 0x9000          
+>>>>>(150.l+71)        byte    x               %c
+>>>>>(150.l+72)        byte    x               \b.%c
+>>>>>(150.l+73)        byte    !0x30           \b%c
+# Big-endian
+>>12   string          MM              
+# IFD 0 Entry #9:
+>>>118 beshort         0x8769          
+# EXIF IFD Entry #1:
+>>>>(126.L+14) beshort 0x9000          
+>>>>>(126.L+23)        byte    x               %c
+>>>>>(126.L+24)        byte    x               \b.%c
+>>>>>(126.L+25)        byte    !0x30           \b%c
+# EXIF IFD Entry #3:
+>>>>(126.L+38) beshort 0x9000          
+>>>>>(126.L+47)        byte    x               %c
+>>>>>(126.L+48)        byte    x               \b.%c
+>>>>>(126.L+49)        byte    !0x30           \b%c
+# IFD 0 Entry #10
+>>>130 beshort         0x8769          
+# EXIF IFD Entry #3:
+>>>>(138.L+38) beshort 0x9000          
+>>>>>(138.L+47)        byte    x               %c
+>>>>>(138.L+48)        byte    x               \b.%c
+>>>>>(138.L+49)        byte    !0x30           \b%c
+# EXIF IFD Entry #5:
+>>>>(138.L+62) beshort 0x9000          
+>>>>>(138.L+71)        byte    x               %c
+>>>>>(138.L+72)        byte    x               \b.%c
+>>>>>(138.L+73)        byte    !0x30           \b%c
+# IFD 0 Entry #11
+>>>142 beshort         0x8769          
+# EXIF IFD Entry #4:
+>>>>(150.L+50) beshort 0x9000          
+>>>>>(150.L+59)        byte    x               %c
+>>>>>(150.L+60)        byte    x               \b.%c
+>>>>>(150.L+61)        byte    !0x30           \b%c
+# Here things get sticky.  We can do ONE MORE marker segment with
+# indirect addressing, and that's all.  It would be great if we could
+# do pointer arithemetic like in an assembler language.  Christos?
+# And if there was some sort of looping construct to do searches, plus a few
+# named accumulators, it would be even more effective...
+# At least we can show a comment if no other segments got inserted before:
+>(4.S+5)       byte            0xFE
+>>(4.S+8)      string          >\0             \b, comment: "%s"
+#>(4.S+5)      byte            0xFE            \b, comment
+#>>(4.S+6)     beshort         x               \b length=%d
+#>>(4.S+8)     string          >\0             \b, "%s"
+# Or, we can show the encoding type (I've included only the three most common)
+# and image dimensions if we are lucky and the SOFn (image segment) is here:
+>(4.S+5)       byte            0xC0            \b, baseline
+>>(4.S+6)      byte            x               \b, precision %d
+>>(4.S+7)      beshort         x               \b, %dx
+>>(4.S+9)      beshort         x               \b%d
+>(4.S+5)       byte            0xC1            \b, extended sequential
+>>(4.S+6)      byte            x               \b, precision %d
+>>(4.S+7)      beshort         x               \b, %dx
+>>(4.S+9)      beshort         x               \b%d
+>(4.S+5)       byte            0xC2            \b, progressive
+>>(4.S+6)      byte            x               \b, precision %d
+>>(4.S+7)      beshort         x               \b, %dx
+>>(4.S+9)      beshort         x               \b%d
+# I've commented-out quantisation table reporting.  I doubt anyone cares yet.
+#>(4.S+5)      byte            0xDB            \b, quantisation table
+#>>(4.S+6)     beshort         x               \b length=%d
+#>14   beshort         x               \b, %d x
+#>16   beshort         x               \b %d
+
+# HSI is Handmade Software's proprietary JPEG encoding scheme
+0      string          hsi1            JPEG image data, HSI proprietary
+
+# From: David Santinoli <david@santinoli.com>
+0      string          \x00\x00\x00\x0C\x6A\x50\x20\x20\x0D\x0A\x87\x0A        JPEG 2000 image data
+
+#------------------------------------------------------------------------------
+# sinclair:  file(1) sinclair QL
+
+# additions to /etc/magic by Thomas M. Ott (ThMO)
+
+# Sinclair QL floppy disk formats (ThMO)
+0      string  =QL5            QL disk dump data,
+>3     string  =A              720 KB,
+>3     string  =B              1.44 MB,
+>3     string  =C              3.2 MB,
+>4     string  >\0             label:%.10s
+
+# Sinclair QL OS dump (ThMO)
+# (NOTE: if `file' would be able to use indirect references in a endian format
+#       differing from the natural host format, this could be written more
+#       reliably and faster...)
+#
+# we *can't* lookup QL OS code dumps, because `file' is UNABLE to read more
+# than the first 8K of a file... #-(
+#
+#0             belong  =0x30000
+#>49124                belong  <47104
+#>>49128               belong  <47104
+#>>>49132      belong  <47104
+#>>>>49136     belong  <47104  QL OS dump data,
+#>>>>>49148    string  >\0     type %.3s,
+#>>>>>49142    string  >\0     version %.4s
+
+# Sinclair QL firmware executables (ThMO)
+0      string  NqNqNq`\004     QL firmware executable (BCPL)
+
+# Sinclair QL libraries (was ThMO)
+0      beshort 0xFB01          QDOS object
+>2     pstring x               '%s'
+
+# Sinclair QL executables (was ThMO)
+4      belong  0x4AFB          QDOS executable
+>9     pstring x               '%s'
+
+# Sinclair QL ROM (ThMO)
+0      belong  =0x4AFB0001     QL plugin-ROM data,
+>9     pstring =\0             un-named
+>9     pstring >\0             named: %s
+#------------------------------------------------------------------------------
+# acorn:  file(1) magic for files found on Acorn systems
+#
+
+# RISC OS Chunk File Format
+# From RISC OS Programmer's Reference Manual, Appendix D
+# We guess the file type from the type of the first chunk.
+0      lelong          0xc3cbc6c5      RISC OS Chunk data
+>12    string          OBJ_            \b, AOF object
+>12    string          LIB_            \b, ALF library
+
+# RISC OS AIF, contains "SWI OS_Exit" at offset 16.
+16     lelong          0xef000011      RISC OS AIF executable
+
+# RISC OS Draw files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0      string          Draw            RISC OS Draw file data
+
+# RISC OS new format font files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0      string          FONT\0          RISC OS outline font data,
+>5     byte            x               version %d
+0      string          FONT\1          RISC OS 1bpp font data,
+>5     byte            x               version %d
+0      string          FONT\4          RISC OS 4bpp font data
+>5     byte            x               version %d
+
+# RISC OS Music files
+# From RISC OS Programmer's Reference Manual, Appendix E
+0      string          Maestro\r       RISC OS music file
+>8     byte            x               version %d
+
+
+#------------------------------------------------------------------------------
+# iff: file(1) magic for Interchange File Format (see also "audio" & "images")
+#
+# Daniel Quinlan (quinlan@yggdrasil.com) -- IFF was designed by Electronic
+# Arts for file interchange.  It has also been used by Apple, SGI, and
+# especially Commodore-Amiga.
+#
+# IFF files begin with an 8 byte FORM header, followed by a 4 character
+# FORM type, which is followed by the first chunk in the FORM.
+
+0      string          FORM            IFF data
+#>4    belong          x               \b, FORM is %d bytes long
+# audio formats
+>8     string          AIFF            \b, AIFF audio
+>8     string          AIFC            \b, AIFF-C compressed audio
+>8     string          8SVX            \b, 8SVX 8-bit sampled sound voice
+>8     string          SAMP            \b, SAMP sampled audio
+>8     string          DTYP            \b, DTYP datatype description
+>8     string          PTCH            \b, PTCH binary patch
+# image formats
+>8     string          ILBMBMHD        \b, ILBM interleaved image
+>>20   beshort         x               \b, %d x
+>>22   beshort         x               %d
+>8     string          RGBN            \b, RGBN 12-bit RGB image
+>8     string          RGB8            \b, RGB8 24-bit RGB image
+>8     string          DR2D            \b, DR2D 2-D object
+>8     string          TDDD            \b, TDDD 3-D rendering
+# other formats
+>8     string          FTXT            \b, FTXT formatted text
+>8     string          CTLG            \b, CTLG message catalog
+>8     string          PREF            \b, PREF preferences
+
+#------------------------------------------------------------------------------
+# lif:  file(1) magic for lif
+#
+# (Daniel Quinlan <quinlan@yggdrasil.com>)
+#
+0      beshort         0x8000          lif file
+
+#------------------------------------------------------------------------------
+# mirage:  file(1) magic for Mirage executables
+#
+# XXX - byte order?
+#
+0      long    31415           Mirage Assembler m.out executable
+
+#------------------------------------------------------------------------------
+# netscape:  file(1) magic for Netscape files
+# "H. Nanosecond" <aldomel@ix.netcom.com>
+# version 3 and 4 I think
+#
+
+# Netscape Address book  .nab
+0      string \000\017\102\104\000\000\000\000\000\000\001\000\000\000\000\002\000\000\000\002\000\000\004\000 Netscape Address book
+
+# Netscape Communicator address book
+0   string   \000\017\102\111 Netscape Communicator address book
+
+# .snm Caches
+0      string          #\ Netscape\ folder\ cache      Netscape folder cache
+0      string  \000\036\204\220\000    Netscape folder cache
+# .n2p 
+# Net 2 Phone 
+#0     string  123\130\071\066\061\071\071\071\060\070\061\060\061\063\060
+0      string  SX961999        Net2phone
+
+#
+#This is files ending in .art, FIXME add more rules
+0       string          JG\004\016\0\0\0\0      ART
+
+#------------------------------------------------------------------------------
+# olf:  file(1) magic for OLF executables
+#
+# We have to check the byte order flag to see what byte order all the
+# other stuff in the header is in.
+#
+# MIPS R3000 may also be for MIPS R2000.
+# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
+#
+# Created by Erik Theisen <etheisen@openbsd.org>
+# Based on elf from Daniel Quinlan <quinlan@yggdrasil.com>
+0      string          \177OLF         OLF
+>4     byte            0               invalid class
+>4     byte            1               32-bit
+>4     byte            2               64-bit
+>7     byte            0               invalid os
+>7     byte            1               OpenBSD
+>7     byte            2               NetBSD
+>7     byte            3               FreeBSD
+>7     byte            4               4.4BSD
+>7     byte            5               Linux
+>7     byte            6               SVR4
+>7     byte            7               esix
+>7     byte            8               Solaris
+>7     byte            9               Irix
+>7     byte            10              SCO
+>7     byte            11              Dell
+>7     byte            12              NCR
+>5     byte            0               invalid byte order
+>5     byte            1               LSB
+>>16   leshort         0               no file type,
+>>16   leshort         1               relocatable,
+>>16   leshort         2               executable,
+>>16   leshort         3               shared object,
+# Core handling from Peter Tobias <tobias@server.et-inf.fho-emden.de>
+# corrections by Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
+>>16   leshort         4               core file
+>>>(0x38+0xcc) string  >\0             of '%s'
+>>>(0x38+0x10) lelong  >0              (signal %d),
+>>16   leshort         &0xff00         processor-specific,
+>>18   leshort         0               no machine,
+>>18   leshort         1               AT&T WE32100 - invalid byte order,
+>>18   leshort         2               SPARC - invalid byte order,
+>>18   leshort         3               Intel 80386,
+>>18   leshort         4               Motorola 68000 - invalid byte order,
+>>18   leshort         5               Motorola 88000 - invalid byte order,
+>>18   leshort         6               Intel 80486,
+>>18   leshort         7               Intel 80860,
+>>18   leshort         8               MIPS R3000_BE - invalid byte order,
+>>18   leshort         9               Amdahl - invalid byte order,
+>>18   leshort         10              MIPS R3000_LE,
+>>18   leshort         11              RS6000 - invalid byte order,
+>>18   leshort         15              PA-RISC - invalid byte order,
+>>18   leshort         16              nCUBE,
+>>18   leshort         17              VPP500,
+>>18   leshort         18              SPARC32PLUS,
+>>18   leshort         20              PowerPC,
+>>18   leshort         0x9026          Alpha,
+>>20   lelong          0               invalid version
+>>20   lelong          1               version 1
+>>36   lelong          1               MathCoPro/FPU/MAU Required
+>8     string          >\0             (%s)
+>5     byte            2               MSB
+>>16   beshort         0               no file type,
+>>16   beshort         1               relocatable,
+>>16   beshort         2               executable,
+>>16   beshort         3               shared object,
+>>16   beshort         4               core file,
+>>>(0x38+0xcc) string  >\0             of '%s'
+>>>(0x38+0x10) belong  >0              (signal %d),
+>>16   beshort         &0xff00         processor-specific,
+>>18   beshort         0               no machine,
+>>18   beshort         1               AT&T WE32100,
+>>18   beshort         2               SPARC,
+>>18   beshort         3               Intel 80386 - invalid byte order,
+>>18   beshort         4               Motorola 68000,
+>>18   beshort         5               Motorola 88000,
+>>18   beshort         6               Intel 80486 - invalid byte order,
+>>18   beshort         7               Intel 80860,
+>>18   beshort         8               MIPS R3000_BE,
+>>18   beshort         9               Amdahl,
+>>18   beshort         10              MIPS R3000_LE - invalid byte order,
+>>18   beshort         11              RS6000,
+>>18   beshort         15              PA-RISC,
+>>18   beshort         16              nCUBE,
+>>18   beshort         17              VPP500,
+>>18   beshort         18              SPARC32PLUS,
+>>18   beshort         20              PowerPC or cisco 4500,
+>>18   beshort         21              cisco 7500,
+>>18   beshort         24              cisco SVIP,
+>>18   beshort         25              cisco 7200,
+>>18   beshort         36              cisco 12000,
+>>18   beshort         0x9026          Alpha,
+>>20   belong          0               invalid version
+>>20   belong          1               version 1
+>>36   belong          1               MathCoPro/FPU/MAU Required
+
+#------------------------------------------------------------------------------
+# VXL: file(1) magic for VXL binary IO data files
+#
+# from Ian Scott <scottim@sf.net>
+#
+# VXL is a collection of C++ libraries for Computer Vision.
+# See the vsl chapter in the VXL Book for more info
+# http://www.isbe.man.ac.uk/public_vxl_doc/books/vxl/book.html
+# http:/vxl.sf.net
+
+2      lelong  0x472b2c4e      VXL data file,
+>0     leshort >0              schema version no %d
+
+#------------------------------------------------------------------------------
+# unknown:  file(1) magic for unknown machines
+#
+# XXX - this probably should be pruned, as it'll match PDP-11 and
+# VAX image formats.
+#
+# 0x107 is 0407; 0x108 is 0410; both are PDP-11 (executable and pure,
+# respectively).
+#
+# 0x109 is 0411; that's PDP-11 split I&D, but the PDP-11 version doesn't
+# have the "version %ld", which may be a bogus COFFism (I don't think
+# there ever was COFF for the PDP-11).
+#
+# 0x10B is 0413; that's VAX demand-paged, but this is a short, not a
+# long, as it would be on a VAX.
+#
+# 0x10C is 0414 and 0x10E is 416; those *are* unknown.
+#
+0      short           0x107           unknown machine executable
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      short           0x108           unknown pure executable
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      short           0x109           PDP-11 separate I&D
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      short           0x10b           unknown pure executable
+>8     short           >0              not stripped
+>15    byte            >0              - version %ld
+0      long            0x10c           unknown demand paged pure executable
+>16    long            >0              not stripped
+0      long            0x10e           unknown readable demand paged pure executable
+
+#------------------------------------------------------------------------------
+# Hierarchical Data Format, used to facilitate scientific data exchange
+# specifications at http://hdf.ncsa.uiuc.edu/
+
+0      belong          0x0e031301      Hierarchical Data Format (version 4) data
+0      string          \211HDF\r\n\032 Hierarchical Data Format (version 5) data
+
+#------------------------------------------------------------------------------
+# mail.news:  file(1) magic for mail and news
+#
+# Unfortunately, saved netnews also has From line added in some news software.
+#0     string          From            mail text
+# There are tests to ascmagic.c to cope with mail and news.
+0      string          Relay-Version:  old news text
+0      string          #!\ rnews       batched news text
+0      string          N#!\ rnews      mailed, batched news text
+0      string          Forward\ to     mail forwarding text
+0      string          Pipe\ to        mail piping text
+0      string          Return-Path:    smtp mail text
+0      string          Path:           news text
+0      string          Xref:           news text
+0      string          From:           news or mail text
+0      string          Article         saved news text
+0      string          BABYL           Emacs RMAIL text
+0      string          Received:       RFC 822 mail text
+0      string          MIME-Version:   MIME entity text
+#0     string          Content-        MIME entity text
+
+# TNEF files...
+0      lelong          0x223E9F78      Transport Neutral Encapsulation Format
+
+# From: Kevin Sullivan <ksulliva@psc.edu>
+0      string          *mbx*           MBX mail folder
+
+# From: Simon Matter <simon.matter@invoca.ch>
+0      string          \241\002\213\015skiplist\ file\0\0\0    Cyrus skiplist DB
+
+# JAM(mbp) Fidonet message area databases
+# JHR file
+0      string  JAM\0                   JAM message area header file
+>12    leshort >0                      (%d messages)
+
+# Squish Fidonet message area databases
+# SQD file (requires at least one message in the area)
+256    leshort 0xAFAE4453              Squish message area data file
+>4     leshort >0                      (%d messages)
+#------------------------------------------------------------------------------
+# modem:  file(1) magic for modem programs
+#
+# From: Florian La Roche <florian@knorke.saar.de>
+4      string          Research,       Digifax-G3-File
+>29    byte            1               , fine resolution
+>29    byte            0               , normal resolution
+
+0      short           0x0100          raw G3 data, byte-padded
+0      short           0x1400          raw G3 data
+#
+# Magic data for vgetty voice formats
+# (Martin Seine & Marc Eberhard)
+
+#
+# raw modem data version 1
+#
+0    string    RMD1      raw modem data
+>4   string    >\0       (%s /
+>20  short     >0        compression type 0x%04x)
+
+#
+# portable voice format 1
+#
+0    string    PVF1\n         portable voice format
+>5   string    >\0       (binary %s)
+
+#
+# portable voice format 2
+#
+0    string    PVF2\n         portable voice format
+>5   string >\0          (ascii %s)
+
+
+#------------------------------------------------------------------------------
+# xwindows:  file(1) magic for various X/Window system file formats.
+
+# Compiled X Keymap 
+# XKM (compiled X keymap) files (including version and byte ordering)
+1      string  mkx                             Compiled XKB Keymap: lsb,
+>0     byte    >0                              version %d
+>0     byte    =0                              obsolete
+0      string  xkm                             Compiled XKB Keymap: msb,
+>3     byte    >0                              version %d
+>0     byte    =0                              obsolete
+
+# xfsdump archive
+0      string  xFSdump0                        xfsdump archive
+>8     long    x       (version %d)
+
+# Jaleo XFS files
+0      long    395726                          Jaleo XFS file
+>4     long    x                               - version %ld
+>8     long    x                               - [%ld -
+>20    long    x                               \b%ldx
+>24    long    x                               \b%ldx
+>28    long    1008                            \bYUV422]
+>28    long    1000                            \bRGB24]
+
+#------------------------------------------------------------------------------
+# wordprocessors:  file(1) magic fo word processors.
+#
+####### PWP file format used on Smith Corona Personal Word Processors:
+2      string  \040\040\040\040\040\040\040\040\040\040\040ML4D\040\'92        Smith Corona PWP
+>24    byte    2       \b, single spaced
+>24    byte    3       \b, 1.5 spaced
+>24    byte    4       \b, double spaced
+>25    byte    0x42    \b, letter
+>25    byte    0x54    \b, legal
+>26    byte    0x46    \b, A4
+
+#WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+0      string  \377WPC\020\000\000\000\022\012\001\001\000\000\000\000 (WP) loadable text
+>15    byte    0       Optimized for Intel
+>15    byte    1       Optimized for Non-Intel
+1      string  WPC     (Corel/WP)
+>8     short   257     WordPerfect macro
+>8     short   258     WordPerfect help file
+>8     short   259     WordPerfect keyboard file
+>8     short   266     WordPerfect document
+>8     short   267     WordPerfect dictionary
+>8     short   268     WordPerfect thesaurus
+>8     short   269     WordPerfect block
+>8     short   270     WordPerfect rectangular block
+>8     short   271     WordPerfect column block
+>8     short   272     WordPerfect printer data
+>8     short   275     WordPerfect printer data
+>8     short   276     WordPerfect driver resource data
+>8     short   279     WordPerfect hyphenation code
+>8     short   280     WordPerfect hyphenation data
+>8     short   281     WordPerfect macro resource data
+>8     short   283     WordPerfect hyphenation lex
+>8     short   285     WordPerfect wordlist
+>8     short   286     WordPerfect equation resource data
+>8     short   289     WordPerfect spell rules
+>8     short   290     WordPerfect dictionary rules
+>8     short   295     WordPerfect spell rules (Microlytics)
+>8     short   299     WordPerfect settings file
+>8     short   301     WordPerfect 4.2 document
+>8     short   325     WordPerfect dialog file
+>8     short   332     WordPerfect button bar
+>8     short   513     Shell macro
+>8     short   522     Shell definition
+>8     short   769     Notebook macro
+>8     short   770     Notebook help file
+>8     short   771     Notebook keyboard file
+>8     short   778     Notebook definition
+>8     short   1026    Calculator help file
+>8     short   1538    Calendar help file
+>8     short   1546    Calendar data file
+>8     short   1793    Editor macro
+>8     short   1794    Editor help file
+>8     short   1795    Editor keyboard file
+>8     short   1817    Editor macro resource file
+>8     short   2049    Macro editor macro
+>8     short   2050    Macro editor help file
+>8     short   2051    Macro editor keyboard file
+>8     short   2305    PlanPerfect macro
+>8     short   2306    PlanPerfect help file
+>8     short   2307    PlanPerfect keyboard file
+>8     short   2314    PlanPerfect worksheet
+>8     short   2319    PlanPerfect printer definition
+>8     short   2322    PlanPerfect graphic definition
+>8     short   2323    PlanPerfect data
+>8     short   2324    PlanPerfect temporary printer
+>8     short   2329    PlanPerfect macro resource data
+>8     byte    11      Mail
+>8     short   2818    help file
+>8     short   2821    distribution list
+>8     short   2826    out box
+>8     short   2827    in box
+>8     short   2836    users archived mailbox
+>8     short   2837    archived message database
+>8     short   2838    archived attachments
+>8     short   3083    Printer temporary file
+>8     short   3330    Scheduler help file
+>8     short   3338    Scheduler in file
+>8     short   3339    Scheduler out file
+>8     short   3594    GroupWise settings file
+>8     short   3601    GroupWise directory services
+>8     short   3627    GroupWise settings file
+>8     short   4362    Terminal resource data
+>8     short   4363    Terminal resource data
+>8     short   4395    Terminal resource data
+>8     short   4619    GUI loadable text
+>8     short   4620    graphics resource data
+>8     short   4621    printer settings file
+>8     short   4622    port definition file
+>8     short   4623    print queue parameters
+>8     short   4624    compressed file
+>8     short   5130    Network service msg file
+>8     short   5131    Network service msg file
+>8     short   5132    Async gateway login msg
+>8     short   5134    GroupWise message file
+>8     short   7956    GroupWise admin domain database
+>8     short   7957    GroupWise admin host database
+>8     short   7959    GroupWise admin remote host database
+>8     short   7960    GroupWise admin ADS deferment data file
+>8     short   8458    IntelliTAG (SGML) compiled DTD
+>8     long    18219264        WordPerfect graphic image (1.0)
+>8     long    18219520        WordPerfect graphic image (2.0)
+#end of WordPerfect type files Version 1.6 - PLEASE DO NOT REMOVE THIS LINE
+
+# Hangul (Korean) Word Processor File
+0      string  HWP\ Document\ File     Hangul (Korean) Word Processor File
+
+# CosmicBook, from Benoît Rouits
+0       string  CSBK    Ted Neslson's CosmicBook hypertext file
+
+
+#------------------------------------------------------------------------------
+# sun:  file(1) magic for Sun machines
+#
+# Values for big-endian Sun (MC680x0, SPARC) binaries on pre-5.x
+# releases.  (5.x uses ELF.)
+#
+0      belong&077777777        0600413         sparc demand paged
+>0     byte            &0x80
+>>20   belong          <4096           shared library
+>>20   belong          =4096           dynamically linked executable
+>>20   belong          >4096           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+0      belong&077777777        0600410         sparc pure
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+0      belong&077777777        0600407         sparc
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+
+0      belong&077777777        0400413         mc68020 demand paged
+>0     byte            &0x80
+>>20   belong          <4096           shared library
+>>20   belong          =4096           dynamically linked executable
+>>20   belong          >4096           dynamically linked executable
+>16    belong          >0              not stripped
+0      belong&077777777        0400410         mc68020 pure
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+0      belong&077777777        0400407         mc68020
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+
+0      belong&077777777        0200413         mc68010 demand paged
+>0     byte            &0x80
+>>20   belong          <4096           shared library
+>>20   belong          =4096           dynamically linked executable
+>>20   belong          >4096           dynamically linked executable
+>16    belong          >0              not stripped
+0      belong&077777777        0200410         mc68010 pure
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+0      belong&077777777        0200407         mc68010
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+
+# reworked these to avoid anything beginning with zero becoming "old sun-2"
+0      belong          0407            old sun-2 executable
+>16    belong          >0              not stripped
+0      belong          0410            old sun-2 pure executable
+>16    belong          >0              not stripped
+0      belong          0413            old sun-2 demand paged executable
+>16    belong          >0              not stripped
+
+#
+# Core files.  "SPARC 4.x BCP" means "core file from a SunOS 4.x SPARC
+# binary executed in compatibility mode under SunOS 5.x".
+#
+0      belong          0x080456        SunOS core file
+>4     belong          432             (SPARC)
+>>132  string          >\0             from '%s'
+>>116  belong          =3              (quit)
+>>116  belong          =4              (illegal instruction)
+>>116  belong          =5              (trace trap)
+>>116  belong          =6              (abort)
+>>116  belong          =7              (emulator trap)
+>>116  belong          =8              (arithmetic exception)
+>>116  belong          =9              (kill)
+>>116  belong          =10             (bus error)
+>>116  belong          =11             (segmentation violation)
+>>116  belong          =12             (bad argument to system call)
+>>116  belong          =29             (resource lost)
+>>120  belong          x               (T=%dK,
+>>124  belong          x               D=%dK,
+>>128  belong          x               S=%dK)
+>4     belong          826             (68K)
+>>128  string          >\0             from '%s'
+>4     belong          456             (SPARC 4.x BCP)
+>>152  string          >\0             from '%s'
+# Sun SunPC
+0      long            0xfa33c08e      SunPC 4.0 Hard Disk
+0      string          #SUNPC_CONFIG   SunPC 4.0 Properties Values
+# Sun snoop (see RFC 1761, which describes the capture file format).
+#
+0      string          snoop           Snoop capture file
+>8     belong          >0              - version %ld
+>12    belong          0               (IEEE 802.3)
+>12    belong          1               (IEEE 802.4)
+>12    belong          2               (IEEE 802.5)
+>12    belong          3               (IEEE 802.6)
+>12    belong          4               (Ethernet)
+>12    belong          5               (HDLC)
+>12    belong          6               (Character synchronous)
+>12    belong          7               (IBM channel-to-channel adapter)
+>12    belong          8               (FDDI)
+>12    belong          9               (Unknown)
+
+# Microsoft ICM color profile
+36     string          acspMSFT        Microsoft ICM Color Profile
+# Sun KCMS
+36     string          acsp            Kodak Color Management System, ICC Profile
+
+#---------------------------------------------------------------------------
+# The following entries have been tested by Duncan Laurie <duncan@sun.com> (a
+# lead Sun/Cobalt developer) who agrees that they are good and worthy of
+# inclusion.
+
+# Boot ROM images for Sun/Cobalt Linux server appliances
+0       string  Cobalt\ Networks\ Inc.\nFirmware\ v     Paged COBALT boot rom
+>38     string x        V%.4s
+
+# New format for Sun/Cobalt boot ROMs is annoying, it stores the version code
+# at the very end where file(1) can't get it.
+0       string CRfs     COBALT boot rom data (Flat boot rom or file system)
+
+
+
+#------------------------------------------------------------------------------
+# Sketch Drawings: http://sketch.sourceforge.net/ 
+# From: Edwin Mons <e@ik.nu>
+0      string  ##Sketch        Sketch document text
+#------------------------------------------------------------------------------
+# bFLT: file(1) magic for BFLT uclinux binary files
+#
+# From Philippe De Muyter <phdm@macqel.be>
+#
+0      string          bFLT            BFLT executable
+>4     belong          x               - version %ld
+>4     belong          4
+>>36   belong&0x1      0x1             ram
+>>36   belong&0x2      0x2             gotpic
+>>36   belong&0x4      0x4             gzip
+>>36   belong&0x8      0x8             gzdata
+#
+# i80960 b.out objects and archives
+#
+0      long            0x10d           i960 b.out relocatable object
+>16    long            >0              not stripped
+#
+# b.out archive (hp-rt on i960)
+0      string          !<bout>         b.out archive
+>8     string          __.SYMDEF       random library
+
+#------------------------------------------------------------------------------
+# hitach-sh: file(1) magic for Hitachi Super-H
+#
+# Super-H COFF
+#
+0      beshort         0x0500          Hitachi SH big-endian COFF
+>18    beshort&0x0002  =0x0000         object
+>18    beshort&0x0002  =0x0002         executable
+>18    beshort&0x0008  =0x0008         \b, stripped
+>18    beshort&0x0008  =0x0000         \b, not stripped
+#
+0      leshort         0x0550          Hitachi SH little-endian COFF
+>18    leshort&0x0002  =0x0000         object
+>18    leshort&0x0002  =0x0002         executable
+>18    leshort&0x0008  =0x0008         \b, stripped
+>18    leshort&0x0008  =0x0000         \b, not stripped
+
+
+#------------------------------------------------------------------------------
+# matroska:  file(1) magic for Matroska files
+#
+# See http://www.matroska.org/
+#
+
+# EBML id:
+0              belong          0x1a45dfa3
+# DocType id:
+>5             beshort         0x4282
+# DocType contents:
+>>8            string          matroska        Matroska data
+
+
+#------------------------------------------------------------------------------
+# ocaml: file(1) magic for Objective Caml files.
+0      string  Caml1999        Objective caml
+>8     string  X               exec file
+>8     string  I               interface file (.cmi)
+>8     string  O               object file (.cmo)
+>8     string  A               library file (.cma)
+>8     string  Y               native object file (.cmx)
+>8     string  Z               native library file (.cmxa)
+>8     string  M               abstract syntax tree implementation file
+>8     string  N               abstract syntax tree interface file
+>9     string  >\0             (Version %3.3s).
+
+#------------------------------------------------------------------------------
+# vax:  file(1) magic for VAX executable/object and APL workspace
+#
+0      lelong          0101557         VAX single precision APL workspace
+0      lelong          0101556         VAX double precision APL workspace
+
+#
+# VAX a.out (32V, BSD)
+#
+0      lelong          0407            VAX executable
+>16    lelong          >0              not stripped
+
+0      lelong          0410            VAX pure executable
+>16    lelong          >0              not stripped
+
+0      lelong          0413            VAX demand paged pure executable
+>16    lelong          >0              not stripped
+
+0      lelong          0420            VAX demand paged (first page unmapped) pure executable
+>16    lelong          >0              not stripped
+
+#
+# VAX COFF
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0      leshort         0570            VAX COFF executable
+>12    lelong          >0              not stripped
+>22    leshort         >0              - version %ld
+0      leshort         0575            VAX COFF pure executable
+>12    lelong          >0              not stripped
+>22    leshort         >0              - version %ld
+
+#------------------------------------------------------------------------------
+# clipper:  file(1) magic for Intergraph (formerly Fairchild) Clipper.
+#
+# XXX - what byte order does the Clipper use?
+#
+# XXX - what's the "!" stuff:
+#
+# >18  short           !074000,000000  C1 R1 
+# >18  short           !074000,004000  C2 R1
+# >18  short           !074000,010000  C3 R1
+# >18  short           !074000,074000  TEST
+#
+# I shall assume it's ANDing the field with the first value and
+# comparing it with the second, and rewrite it as:
+#
+# >18  short&074000    000000          C1 R1 
+# >18  short&074000    004000          C2 R1
+# >18  short&074000    010000          C3 R1
+# >18  short&074000    074000          TEST
+#
+# as SVR3.1's "file" doesn't support anything of the "!074000,000000"
+# sort, nor does SunOS 4.x, so either it's something Intergraph added
+# in CLIX, or something AT&T added in SVR3.2 or later, or something
+# somebody else thought was a good idea; it's not documented in the
+# man page for this version of "magic", nor does it appear to be
+# implemented (at least not after I blew off the bogus code to turn
+# old-style "&"s into new-style "&"s, which just didn't work at all).
+#
+0      short           0575            CLIPPER COFF executable (VAX #)
+>20    short           0407            (impure)
+>20    short           0410            (5.2 compatible)
+>20    short           0411            (pure)
+>20    short           0413            (demand paged)
+>20    short           0443            (target shared library)
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+0      short           0577            CLIPPER COFF executable
+>18    short&074000    000000          C1 R1 
+>18    short&074000    004000          C2 R1
+>18    short&074000    010000          C3 R1
+>18    short&074000    074000          TEST
+>20    short           0407            (impure)
+>20    short           0410            (pure)
+>20    short           0411            (separate I&D)
+>20    short           0413            (paged)
+>20    short           0443            (target shared library)
+>12    long            >0              not stripped
+>22    short           >0              - version %ld
+>48    long&01         01              alignment trap enabled
+>52    byte            1               -Ctnc
+>52    byte            2               -Ctsw
+>52    byte            3               -Ctpw
+>52    byte            4               -Ctcb
+>53    byte            1               -Cdnc
+>53    byte            2               -Cdsw
+>53    byte            3               -Cdpw
+>53    byte            4               -Cdcb
+>54    byte            1               -Csnc
+>54    byte            2               -Cssw
+>54    byte            3               -Cspw
+>54    byte            4               -Cscb
+4      string          pipe            CLIPPER instruction trace
+4      string          prof            CLIPPER instruction profile
+
+#------------------------------------------------------------------------------
+# frame:  file(1) magic for FrameMaker files
+#
+# This stuff came on a FrameMaker demo tape, most of which is
+# copyright, but this file is "published" as witness the following:
+#
+0      string          \<MakerFile     FrameMaker document
+>11    string          5.5              (5.5
+>11    string          5.0              (5.0
+>11    string          4.0              (4.0
+>11    string          3.0              (3.0
+>11    string          2.0              (2.0
+>11    string          1.0              (1.0
+>14    byte            x                 %c)
+0      string          \<MIFFile       FrameMaker MIF (ASCII) file
+>9     string          4.0              (4.0)
+>9     string          3.0              (3.0)
+>9     string          2.0              (2.0)
+>9     string          1.0              (1.x)
+0      string          \<MakerDictionary       FrameMaker Dictionary text
+>17    string          3.0              (3.0)
+>17    string          2.0              (2.0)
+>17    string          1.0              (1.x)
+0      string          \<MakerScreenFont       FrameMaker Font file
+>17    string          1.01             (%s)
+0      string          \<MML           FrameMaker MML file
+0      string          \<BookFile      FrameMaker Book file
+>10    string          3.0              (3.0
+>10    string          2.0              (2.0
+>10    string          1.0              (1.0
+>13    byte            x                 %c)
+# XXX - this book entry should be verified, if you find one, uncomment this
+#0     string          \<Book\         FrameMaker Book (ASCII) file
+#>6    string          3.0              (3.0)
+#>6    string          2.0              (2.0)
+#>6    string          1.0              (1.0)
+0      string          \<Maker Intermediate Print File FrameMaker IPL file
+
+#------------------------------------------------------------------------------
+# magic:  file(1) magic for magic files
+#
+0      string          #\ Magic        magic text file for file(1) cmd
+0      lelong          0xF11E041C      magic binary file for file(1) cmd
+>4     lelong          x               (version %d) (little endian)
+0      belong          0xF11E041C      magic binary file for file(1) cmd
+>4     belong          x               (version %d) (big endian)
+
+#------------------------------------------------------------------------------
+# sql:  file(1) magic for SQL files
+#
+# From: "Marty Leisner" <mleisner@eng.mc.xerox.com>
+# Recognize some MySQL files.
+#
+0      beshort                 0xfe01          MySQL table definition file
+>2     byte                    x               Version %d
+0      belong&0xffffff00       0xfefe0300      MySQL MISAM index file
+>3     byte                    x               Version %d
+0      belong&0xffffff00       0xfefe0700      MySQL MISAM compressed data file
+>3     byte                    x               Version %d
+0      belong&0xffffff00       0xfefe0500      MySQL ISAM index file
+>3     byte                    x               Version %d
+0      belong&0xffffff00       0xfefe0600      MySQL ISAM compressed data file
+>3     byte                    x               Version %d
+0      string                  \376bin         MySQL replication log
+
+#------------------------------------------------------------------------------
+# dact:  file(1) magic for DACT compressed files
+#
+0      long            0x444354C3      DACT compressed data
+>4     byte            >-1             (version %i.
+>5     byte            >-1             $BS%i.
+>6     byte            >-1             $BS%i)
+>7     long            >0              $BS, original size: %i bytes
+>15    long            >30             $BS, block size: %i bytes
+#
+# GNU nlsutils message catalog file format
+#
+0      string          \336\22\4\225   GNU message catalog (little endian),
+>4     lelong          x               revision %d,
+>8     lelong          x               %d messages
+0      string          \225\4\22\336   GNU message catalog (big endian),
+>4     belong          x               revision %d,
+>8     belong          x               %d messages
+# message catalogs, from Mitchum DSouza <m.dsouza@mrc-apu.cam.ac.uk>
+0      string          *nazgul*        Nazgul style compiled message catalog
+>8     lelong          >0              \b, version %ld
+# GnuPG
+# The format is very similar to pgp
+0      string          \001gpg                 GPG key trust database
+>4     byte            x                       version %d
+0       beshort         0x9901                  GPG key public ring
+# This magic is not particularly good, as the keyrings don't have true
+# magic. Nevertheless, it covers many keyrings.
+
+# Gnumeric spreadsheet
+# This entry is only semi-helpful, as Gnumeric compresses its files, so
+# they will ordinarily reported as "compressed", but at least -z helps
+39      string          =<gmr:Workbook           Gnumeric spreadsheet
+
+#------------------------------------------------------------------------------
+# ibm6000:  file(1) magic for RS/6000 and the RT PC.
+#
+0      beshort         0x01df          executable (RISC System/6000 V3.1) or obj module
+>12    belong          >0              not stripped
+# Breaks sun4 statically linked execs.
+#0      beshort                0x0103          executable (RT Version 2) or obj module
+#>2    byte            0x50            pure
+#>28   belong          >0              not stripped
+#>6    beshort         >0              - version %ld
+0      beshort         0x0104          shared library
+0      beshort         0x0105          ctab data
+0      beshort         0xfe04          structured file
+0      string          0xabcdef        AIX message catalog
+0      belong          0x000001f9      AIX compiled message catalog
+0      string          \<aiaff>        archive
+0      string          \<bigaf>        archive (big format)
+
+
+#------------------------------------------------------------------------------
+# os2:  file(1) magic for OS/2 files
+#
+
+# Provided 1998/08/22 by
+# David Mediavilla <davidme.news@REMOVEIFNOTSPAMusa.net>
+1      string  InternetShortcut        MS Windows 95 Internet shortcut text
+>24    string  >\                      (URL=<%s>)
+
+# OS/2 URL objects
+# Provided 1998/08/22 by
+# David Mediavilla <davidme.news@REMOVEIFNOTSPAMusa.net>
+#0     string  http:                   OS/2 URL object text
+#>5    string  >\                      (WWW) <http:%s>
+#0     string  mailto:                 OS/2 URL object text
+#>7    string  >\                      (email) <%s>
+#0     string  news:                   OS/2 URL object text
+#>5    string  >\                      (Usenet) <%s>
+#0     string  ftp:                    OS/2 URL object text
+#>4    string  >\                      (FTP) <ftp:%s>
+#0     string  file:                   OS/2 URL object text
+#>5    string  >\                      (Local file) <%s>
+
+# >>>>> OS/2 INF/HLP <<<<<  (source: Daniel Dissett ddissett@netcom.com)
+# Carl Hauser (chauser.parc@xerox.com) and 
+# Marcus Groeber (marcusg@ph-cip.uni-koeln.de)
+# list the following header format in inf02a.doc:
+#
+#  int16 ID;           // ID magic word (5348h = "HS")
+#  int8  unknown1;     // unknown purpose, could be third letter of ID
+#  int8  flags;        // probably a flag word...
+#                      //  bit 0: set if INF style file
+#                      //  bit 4: set if HLP style file
+#                      // patching this byte allows reading HLP files
+#                      // using the VIEW command, while help files 
+#                      // seem to work with INF settings here as well.
+#  int16 hdrsize;      // total size of header
+#  int16 unknown2;     // unknown purpose
+# 
+0   string  HSP\x01\x9b\x00 OS/2 INF
+>107 string >0                      (%s)
+0   string  HSP\x10\x9b\x00     OS/2 HLP
+>107 string >0                      (%s)
+
+# OS/2 INI (this is a guess)
+0  string   \xff\xff\xff\xff\x14\0\0\0  OS/2 INI
+#------------------------------------------------------------------------------
+#
+# RPM: file(1) magic for Red Hat Packages   Erik Troan (ewt@redhat.com)
+#
+0      beshort         0xedab
+>2     beshort         0xeedb          RPM
+>>4    byte            x               v%d
+>>6    beshort         0               bin
+>>6    beshort         1               src
+>>8    beshort         1               i386
+>>8    beshort         2               Alpha
+>>8    beshort         3               Sparc
+>>8    beshort         4               MIPS
+>>8    beshort         5               PowerPC
+>>8    beshort         6               68000
+>>8    beshort         7       SGI
+>>8    beshort         8               RS6000
+>>8    beshort         9               IA64
+>>8    beshort         10              Sparc64
+>>8    beshort         11              MIPSel
+>>8    beshort         12              ARM
+>>10   string          x               %s
+#-----------------------------------------------------------------------------
+# misctools:  file(1) magic for miscelanous UNIX tools.
+#
+0      string          %%!!            X-Post-It-Note text
+0      string          BEGIN:VCALENDAR         vCalendar calendar file
+
+#------------------------------------------------------------------------------
+# motorola:  file(1) magic for Motorola 68K and 88K binaries
+#
+# 68K
+#
+0      beshort         0520            mc68k COFF
+>18    beshort         ^00000020       object
+>18    beshort         &00000020       executable
+>12    belong          >0              not stripped
+>168   string          .lowmem         Apple toolbox
+>20    beshort         0407            (impure)
+>20    beshort         0410            (pure)
+>20    beshort         0413            (demand paged)
+>20    beshort         0421            (standalone)
+0      beshort         0521            mc68k executable (shared)
+>12    belong          >0              not stripped
+0      beshort         0522            mc68k executable (shared demand paged)
+>12    belong          >0              not stripped
+#
+# Motorola/UniSoft 68K Binary Compatibility Standard (BCS)
+#
+0      beshort         0554            68K BCS executable
+#
+# 88K
+#
+# Motorola/88Open BCS
+#
+0      beshort         0555            88K BCS executable
+#
+# Motorola S-Records, from Gerd Truschinski <gt@freebsd.first.gmd.de>
+0   string      S0          Motorola S-Record; binary data in text format
+
+# ATARI ST relocatable PRG
+#
+# from Oskar Schirmer <schirmer@scara.com> Feb 3, 2001
+# (according to Roland Waldi, Oct 21, 1987)
+# besides the magic 0x601a, the text segment size is checked to be
+# not larger than 1 MB (which is a lot on ST).
+# The additional 0x601b distinction I took from Doug Lee's magic.
+0      belong&0xFFFFFFF0       0x601A0000      Atari ST M68K contiguous executable
+>2     belong                  x               (txt=%ld,
+>6     belong                  x               dat=%ld,
+>10    belong                  x               bss=%ld,
+>14    belong                  x               sym=%ld)
+0      belong&0xFFFFFFF0       0x601B0000      Atari ST M68K non-contig executable
+>2     belong                  x               (txt=%ld,
+>6     belong                  x               dat=%ld,
+>10    belong                  x               bss=%ld,
+>14    belong                  x               sym=%ld)
+
+# Atari ST/TT... program format (sent by Wolfram Kleff <kleff@cs.uni-bonn.de>)
+0       beshort         0x601A          Atari 68xxx executable,
+>2      belong          x               text len %lu,
+>6      belong          x               data len %lu,
+>10     belong          x               BSS len %lu,
+>14     belong          x               symboltab len %lu,
+>18     belong          0
+>22     belong          &0x01           fastload flag,
+>22     belong          &0x02           may be loaded to alternate RAM,
+>22     belong          &0x04           malloc may be from alternate RAM,
+>22     belong          x               flags: 0x%lX,
+>26     beshort         0               no relocation tab
+>26     beshort         !0              + relocation tab
+>30     string          SFX             [Self-Extracting LZH SFX archive]
+>38     string          SFX             [Self-Extracting LZH SFX archive]
+>44     string          ZIP!            [Self-Extracting ZIP SFX archive]
+
+0       beshort         0x0064          Atari 68xxx CPX file
+>8      beshort         x               (version %04lx)
+#
+# Mach magic number info
+#
+0      long            0xefbe  OSF/Rose object
+# I386 magic number info
+#
+0      short           0565    i386 COFF object
+
+#------------------------------------------------------------------------------
+# perl:  file(1) magic for Larry Wall's perl language.
+#
+# The ``eval'' line recognizes an outrageously clever hack for USG systems.
+# Keith Waclena <keith@cerberus.uchicago.edu>
+# Send additions to <perl5-porters@perl.org>
+0      string/b        #!\ /bin/perl                   perl script text executable
+0      string          eval\ "exec\ /bin/perl          perl script text
+0      string/b        #!\ /usr/bin/perl               perl script text executable
+0      string          eval\ "exec\ /usr/bin/perl      perl script text
+0      string/b        #!\ /usr/local/bin/perl         perl script text
+0      string          eval\ "exec\ /usr/local/bin/perl        perl script text executable
+0      string          eval\ '(exit\ $?0)'\ &&\ eval\ 'exec    perl script text
+
+# a couple more, by me
+# XXX: christos matches
+#0     regex           package         Perl5 module source text (via regex)
+0      string          package         Perl5 module source text
+
+# Perl Storable data files.
+0      string  perl-store      perl Storable(v0.6) data
+>4     byte    >0      (net-order %d)
+>>4    byte    &01     (network-ordered)
+>>4    byte    =3      (major 1)
+>>4    byte    =2      (major 1)
+
+0      string  pst0    perl Storable(v0.7) data
+>4     byte    >0
+>>4    byte    &01     (network-ordered)
+>>4    byte    =5      (major 2)
+>>4    byte    =4      (major 2)
+>>5    byte    >0      (minor %d)
+
+#------------------------------------------------------------------------------
+# xenix:  file(1) magic for Microsoft Xenix
+#
+# "Middle model" stuff, and "Xenix 8086 relocatable or 80286 small
+# model" lifted from "magic.xenix", with comment "derived empirically;
+# treat as folklore until proven"
+#
+# "small model", "large model", "huge model" stuff lifted from XXX
+#
+# XXX - "x.out" collides with PDP-11 archives
+#
+0      string          core            core file (Xenix)
+0      byte            0x80            8086 relocatable (Microsoft)
+0      leshort         0xff65          x.out
+>2     string          __.SYMDEF        randomized
+>0     byte            x               archive
+0      leshort         0x206           Microsoft a.out
+>8     leshort         1               Middle model
+>0x1e  leshort         &0x10           overlay
+>0x1e  leshort         &0x2            separate
+>0x1e  leshort         &0x4            pure
+>0x1e  leshort         &0x800          segmented
+>0x1e  leshort         &0x400          standalone
+>0x1e  leshort         &0x8            fixed-stack
+>0x1c  byte            &0x80           byte-swapped
+>0x1c  byte            &0x40           word-swapped
+>0x10  lelong          >0              not-stripped
+>0x1e  leshort         ^0xc000         pre-SysV
+>0x1e  leshort         &0x4000         V2.3
+>0x1e  leshort         &0x8000         V3.0
+>0x1c  byte            &0x4            86
+>0x1c  byte            &0xb            186
+>0x1c  byte            &0x9            286
+>0x1c  byte            &0xa            386
+>0x1f  byte            <0x040          small model
+>0x1f  byte            =0x048          large model     
+>0x1f  byte            =0x049          huge model 
+>0x1e  leshort         &0x1            executable
+>0x1e  leshort         ^0x1            object file
+>0x1e  leshort         &0x40           Large Text
+>0x1e  leshort         &0x20           Large Data
+>0x1e  leshort         &0x120          Huge Objects Enabled
+>0x10  lelong          >0              not stripped
+
+0      leshort         0x140           old Microsoft 8086 x.out
+>0x3   byte            &0x4            separate
+>0x3   byte            &0x2            pure
+>0     byte            &0x1            executable
+>0     byte            ^0x1            relocatable
+>0x14  lelong          >0              not stripped
+
+0      lelong          0x206           b.out
+>0x1e  leshort         &0x10           overlay
+>0x1e  leshort         &0x2            separate
+>0x1e  leshort         &0x4            pure
+>0x1e  leshort         &0x800          segmented
+>0x1e  leshort         &0x400          standalone
+>0x1e  leshort         &0x1            executable
+>0x1e  leshort         ^0x1            object file
+>0x1e  leshort         &0x4000         V2.3
+>0x1e  leshort         &0x8000         V3.0
+>0x1c  byte            &0x4            86
+>0x1c  byte            &0xb            186
+>0x1c  byte            &0x9            286
+>0x1c  byte            &0x29           286
+>0x1c  byte            &0xa            386
+>0x1e  leshort         &0x4            Large Text
+>0x1e  leshort         &0x2            Large Data
+>0x1e  leshort         &0x102          Huge Objects Enabled
+
+0      leshort         0x580           XENIX 8086 relocatable or 80286 small model
+#------------------------------------------------------------------------------
+# file(1) magic for tgif(1) files
+# From Hendrik Scholz <hendrik@scholz.net>
+
+0   string  %TGIF\ 4   tgif version 4 object file
+
+
+#------------------------------------------------------------------------------
+# sc:  file(1) magic for "sc" spreadsheet
+#
+38     string          Spreadsheet     sc spreadsheet file
+
+#------------------------------------------------------------------------------
+# pyramid:  file(1) magic for Pyramids
+#
+# XXX - byte order?
+#
+0      long            0x50900107      Pyramid 90x family executable
+0      long            0x50900108      Pyramid 90x family pure executable
+>16    long            >0              not stripped
+0      long            0x5090010b      Pyramid 90x family demand paged pure executable
+>16    long            >0              not stripped
+
+#------------------------------------------------------------------------------
+# adventure: file(1) magic for Adventure game files
+#
+# from Allen Garvin <earendil@faeryland.tamu-commerce.edu>
+# Edited by Dave Chapeskie <dchapes@ddm.on.ca> Jun 28, 1998
+# Edited by Chris Chittleborough <cchittleborough@yahoo.com.au>, March 2002
+#
+# ALAN
+# I assume there are other, lower versions, but these are the only ones I
+# saw in the archive.
+0      beshort 0x0206  ALAN game data
+>2     byte    <10     version 2.6%d
+
+# Conflicts with too much other stuff!
+# Infocom
+# (Note: to avoid false matches Z-machine version 1 and 2 are not
+# recognized since only the oldest Zork I and II used them.  Similarly
+# there are 4 Infocom games that use version 4 that are not recognized.)
+#0     byte    3       Infocom game data (Z-machine 3,
+#>2    beshort <0x7fff Release %3d,
+#>26   beshort >0      Size %d*2
+#>18   string  >\0     Serial %.6s)
+#0     byte    5       Infocom game data (Z-machine 5,
+#>2    beshort <0x7fff Release %3d,
+#>26   beshort >0      Size %d*4
+#>18   string  >\0     Serial %.6s)
+#0     byte    6       Infocom game data (Z-machine 6,
+#>2    beshort <0x7fff Release %3d,
+#>26   beshort >0      Size %d*8
+#>18   string  >\0     Serial %.6s)
+#0     byte    8       Infocom game data (Z-machine 8,
+#>2    beshort <0x7fff Release %3d,
+#>26   beshort >0      Size %d*8
+#>18   string  >\0     Serial %.6s)
+
+# TADS (Text Adventure Development System)
+#  All files are machine-independent (games compile to byte-code) and are tagged
+#  with a version string of the form "V2.<digit>.<digit>\0" (but TADS 3 is
+#  on the way).
+#  Game files start with "TADS2 bin\n\r\032\0" then the compiler version.
+0      string  TADS2\ bin      TADS
+>9     belong  !0x0A0D1A00     game data, CORRUPTED
+>9     belong   0x0A0D1A00
+>>13   string  >\0             %s game data
+#  Resource files start with "TADS2 rsc\n\r\032\0" then the compiler version.
+0      string  TADS2\ rsc      TADS
+>9     belong  !0x0A0D1A00     resource data, CORRUPTED
+>9     belong   0x0A0D1A00
+>>13   string  >\0             %s resource data
+#  Some saved game files start with "TADS2 save/g\n\r\032\0", a little-endian
+#  2-byte length N, the N-char name of the game file *without* a NUL (darn!),
+# "TADS2 save\n\r\032\0" and the interpreter version. 
+0      string  TADS2\ save/g   TADS
+>12    belong  !0x0A0D1A00     saved game data, CORRUPTED
+>12    belong   0x0A0D1A00
+>>(16.s+32) string >\0         %s saved game data
+#  Other saved game files start with "TADS2 save\n\r\032\0" and the interpreter
+#  version.
+0      string  TADS2\ save     TADS
+>10    belong  !0x0A0D1A00     saved game data, CORRUPTED
+>10    belong   0x0A0D1A00
+>>14   string  >\0             %s saved game data
+
+#------------------------------------------------------------------------------
+# att3b:  file(1) magic for AT&T 3B machines
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+# 3B20
+#
+# The 3B20 conflicts with SCCS.
+#0     beshort         0550            3b20 COFF executable
+#>12   belong          >0              not stripped
+#>22   beshort         >0              - version %ld
+#0     beshort         0551            3b20 COFF executable (TV)
+#>12   belong          >0              not stripped
+#>22   beshort         >0              - version %ld
+#
+# WE32K
+#
+0      beshort         0560            WE32000 COFF
+>18    beshort         ^00000020       object
+>18    beshort         &00000020       executable
+>12    belong          >0              not stripped
+>18    beshort         ^00010000       N/A on 3b2/300 w/paging
+>18    beshort         &00020000       32100 required
+>18    beshort         &00040000       and MAU hardware required
+>20    beshort         0407            (impure)
+>20    beshort         0410            (pure)
+>20    beshort         0413            (demand paged)
+>20    beshort         0443            (target shared library)
+>22    beshort         >0              - version %ld
+0      beshort         0561            WE32000 COFF executable (TV)
+>12    belong          >0              not stripped
+#>18   beshort         &00020000       - 32100 required
+#>18   beshort         &00040000       and MAU hardware required
+#>22   beshort         >0              - version %ld
+#
+# core file for 3b2 
+0      string          \000\004\036\212\200    3b2 core file
+>364   string          >\0             of '%s'
+
+#------------------------------------------------------------------------------
+# flash:       file(1) magic for Macromedia Flash file format
+#
+# See
+#
+#      http://www.macromedia.com/software/flash/open/
+#
+0      string          FWS             Macromedia Flash data,
+>3     byte            x               version %d
+0      string          CWS             Macromedia Flash data (compressed),
+>3     byte            x               version %d
+#
+# From Dave Wilson
+0      string AGD4\xbe\xb8\xbb\xcb\x00 Macromedia Freehand 9 Document
+
+#------------------------------------------------------------------------------
+# karma:  file(1) magic for Karma data files
+#
+# From <rgooch@atnf.csiro.au>
+
+0      string          KarmaRHD Version        Karma Data Structure Version
+>16    belong          x               %lu
+#------------------------------------------------------------------------------
+# octave binary data file(1) magic, from Dirk Eddelbuettel <edd@debian.org>
+0      string          Octave-1-L      Octave binary data (little endian)
+0      string          Octave-1-B      Octave binary data (big endian)
+
+#------------------------------------------------------------------------------
+#
+# Parix COFF executables
+# From: Ignatios Souvatzis <ignatios@cs.uni-bonn.de>
+#
+0      beshort&0xfff   0xACE   PARIX
+>0     byte&0xf0       0x80    T800
+>0     byte&0xf0       0x90    T9000
+>19    byte&0x02       0x02    executable
+>19    byte&0x02       0x00    object
+>19    byte&0x0c       0x00    not stripped
+
+#------------------------------------------------------------------------------
+# plan9:  file(1) magic for AT&T Bell Labs' Plan 9 executables
+# From: "Stefan A. Haubenthal" <polluks@web.de>
+#
+0      belong          0x00000107      Plan 9 executable, Motorola 68k
+0      belong          0x000001EB      Plan 9 executable, Intel 386
+0      belong          0x00000247      Plan 9 executable, Intel 960
+0      belong          0x000002AB      Plan 9 executable, SPARC
+0      belong          0x00000407      Plan 9 executable, MIPS R3000
+0      belong          0x0000048B      Plan 9 executable, AT&T DSP 3210
+0      belong          0x00000517      Plan 9 executable, MIPS R4000 BE
+0      belong          0x000005AB      Plan 9 executable, AMD 29000
+0      belong          0x00000647      Plan 9 executable, ARM 7-something
+0      belong          0x000006EB      Plan 9 executable, PowerPC
+0      belong          0x00000797      Plan 9 executable, MIPS R4000 LE
+0      belong          0x0000084B      Plan 9 executable, DEC Alpha
+
+#------------------------------------------------------------------------------
+# troff:  file(1) magic for *roff
+#
+# updated by Daniel Quinlan (quinlan@yggdrasil.com)
+
+# troff input
+0      string          .\\"            troff or preprocessor input text
+0      string          '\\"            troff or preprocessor input text
+0      string          '.\\"           troff or preprocessor input text
+0      string          \\"             troff or preprocessor input text
+0      string          '''             troff or preprocessor input text
+
+# ditroff intermediate output text
+0      string          x\ T            ditroff output text
+>4     string          cat             for the C/A/T phototypesetter
+>4     string          ps              for PostScript
+>4     string          dvi             for DVI
+>4     string          ascii           for ASCII
+>4     string          lj4             for LaserJet 4
+>4     string          latin1          for ISO 8859-1 (Latin 1)
+>4     string          X75             for xditview at 75dpi
+>>7    string          -12             (12pt)
+>4     string          X100            for xditview at 100dpi
+>>8    string          -12             (12pt)
+
+# output data formats
+0      string          \100\357        very old (C/A/T) troff output data
+
+#------------------------------------------------------------------------------
+# spectrum:  file(1) magic for Spectrum emulator files.
+#
+# John Elliott <jce@seasip.demon.co.uk>
+
+#
+# Spectrum +3DOS header
+#
+0       string          PLUS3DOS\032    Spectrum +3 data
+>15     byte            0               - BASIC program
+>15     byte            1               - number array
+>15     byte            2               - character array
+>15     byte            3               - memory block
+>>16    belong          0x001B0040      (screen)
+>15     byte            4               - Tasword document
+>15     string          TAPEFILE        - ZXT tapefile
+#
+# Tape file. This assumes the .TAP starts with a Spectrum-format header,
+# which nearly all will.
+#
+0       string          \023\000\000    Spectrum .TAP data
+>4      string          x               "%-10.10s"
+>3      byte            0               - BASIC program
+>3      byte            1               - number array
+>3      byte            2               - character array
+>3      byte            3               - memory block
+>>14    belong          0x001B0040      (screen)
+
+# The following three blocks are from pak21-spectrum@srcf.ucam.org
+# TZX tape images
+0      string          ZXTape!\x1a     Spectrum .TZX data
+>8     byte            x               version %d
+>9     byte            x               .%d
+
+# RZX input recording files
+0      string          RZX!            Spectrum .RZX data
+>4     byte            x               version %d
+>5     byte            x               .%d
+
+# And three sorts of disk image
+0      string          MV\ -\ CPCEMU\ Disk-Fil Amstrad/Spectrum .DSK data
+0      string          MV\ -\ CPC\ format\ Dis Amstrad/Spectrum DU54 .DSK data
+0      string          EXTENDED\ CPC\ DSK\ Fil Amstrad/Spectrum Extended .DSK data
+
+#------------------------------------------------------------------------------
+# softquad:  file(1) magic for SoftQuad Publishing Software
+#
+# Author/Editor and RulesBuilder
+#
+# XXX - byte order?
+#
+0      string          \<!SQ\ DTD>     Compiled SGML rules file
+>9     string          >\0              Type %s
+0      string          \<!SQ\ A/E>     A/E SGML Document binary
+>9     string          >\0              Type %s
+0      string          \<!SQ\ STS>     A/E SGML binary styles file
+>9     string          >\0              Type %s
+0      short           0xc0de          Compiled PSI (v1) data
+0      short           0xc0da          Compiled PSI (v2) data
+>3     string          >\0             (%s)
+# Binary sqtroff font/desc files...
+0      short           0125252         SoftQuad DESC or font file binary
+>2     short           >0              - version %d
+# Bitmaps...
+0      string          SQ\ BITMAP1     SoftQuad Raster Format text
+#0     string          SQ\ BITMAP2     SoftQuad Raster Format data
+# sqtroff intermediate language (replacement for ditroff int. lang.)
+0      string          X\              SoftQuad troff Context intermediate
+>2     string          495             for AT&T 495 laser printer
+>2     string          hp              for Hewlett-Packard LaserJet
+>2     string          impr            for IMAGEN imPRESS
+>2     string          ps              for PostScript
+
+#------------------------------------------------------------------------------
+# Dyadic: file(1) magic for Dyalog APL.
+#
+0      byte    0xaa
+>1     byte    <4              Dyalog APL
+>>1    byte    0x00            incomplete workspace
+>>1    byte    0x01            component file
+>>1    byte    0x02            external variable
+>>1    byte    0x03            workspace
+>>2    byte    x               version %d
+>>3    byte    x               .%d
+
+#------------------------------------------------------------------------------
+# palm:  file(1) magic for PalmOS {.prc,.pdb}: applications, docfiles, and hacks
+#
+# Brian Lalor <blalor@hcirisc.cs.binghamton.edu>
+
+# appl
+60      belong                  0x6170706c      PalmOS application
+>0      string                  >\0             "%s"
+# TEXt
+60      belong                  0x54455874      AportisDoc file
+>0      string                  >\0             "%s"
+# HACK
+60      belong                  0x4841434b      HackMaster hack
+>0      string                  >\0             "%s"
+
+# Variety of PalmOS document types
+# Michael-John Turner <mj@debian.org>
+# Thanks to Hasan Umit Ezerce <humit@tr-net.net.tr> for his DocType
+60     string                  BVokBDIC        BDicty PalmOS document
+>0     string                  >\0             "%s"
+60     string                  DB99DBOS        DB PalmOS document
+>0     string                  >\0             "%s"
+60     string                  vIMGView        FireViewer/ImageViewer PalmOS document
+>0     string                  >\0             "%s"
+60     string                  PmDBPmDB        HanDBase PalmOS document
+>0     string                  >\0             "%s"
+60     string                  InfoINDB        InfoView PalmOS document
+>0     string                  >\0             "%s"
+60     string                  ToGoToGo        iSilo PalmOS document
+>0     string                  >\0             "%s"
+60     string                  JfDbJBas        JFile PalmOS document
+>0     string                  >\0             "%s"
+60     string                  JfDbJFil        JFile Pro PalmOS document
+>0     string                  >\0             "%s"
+60     string                  DATALSdb        List PalmOS document
+>0     string                  >\0             "%s"
+60     string                  Mdb1Mdb1        MobileDB PalmOS document
+>0     string                  >\0             "%s"
+60     string                  PNRdPPrs        PeanutPress PalmOS document
+>0     string                  >\0             "%s"
+60     string                  DataPlkr        Plucker PalmOS document
+>0     string                  >\0             "%s"
+60     string                  DataSprd        QuickSheet PalmOS document
+>0     string                  >\0             "%s"
+60     string                  SM01SMem        SuperMemo PalmOS document
+>0     string                  >\0             "%s"
+60     string                  DataTlPt        TealDoc PalmOS document
+>0     string                  >\0             "%s"
+60     string                  InfoTlIf        TealInfo PalmOS document
+>0     string                  >\0             "%s"
+60     string                  DataTlMl        TealMeal PalmOS document
+>0     string                  >\0             "%s"
+60     string                  DataTlPt        TealPaint PalmOS document
+>0     string                  >\0             "%s"
+60     string                  dataTDBP        ThinkDB PalmOS document
+>0     string                  >\0             "%s"
+60     string                  TdatTide        Tides PalmOS document
+>0     string                  >\0             "%s"
+60     string                  ToRaTRPW        TomeRaider PalmOS document
+>0     string                  >\0             "%s"
+
+# A GutenPalm zTXT etext for use on Palm Pilots (http://gutenpalm.sf.net)
+# For version 1.xx zTXTs, outputs version and numbers of bookmarks and
+#   annotations.
+# For other versions, just outputs version.
+#
+60             string          zTXT            A GutenPalm zTXT e-book
+>0             string          >\0             "%s"
+>(0x4E.L)      byte            0
+>>(0x4E.L+1)   byte            x               (v0.%02d)
+>(0x4E.L)      byte            1
+>>(0x4E.L+1)   byte            x               (v1.%02d)
+>>>(0x4E.L+10) beshort         >0
+>>>>(0x4E.L+10) beshort                <2              - 1 bookmark
+>>>>(0x4E.L+10) beshort                >1              - %d bookmarks
+>>>(0x4E.L+14) beshort         >0
+>>>>(0x4E.L+14) beshort                <2              - 1 annotation
+>>>>(0x4E.L+14) beshort                >1              - %d annotations
+>(0x4E.L)      byte            >1              (v%d.
+>>(0x4E.L+1)   byte            x               %02d)
+
+# Palm OS .prc file types
+60             string          libr            Palm OS dynamic library data
+>0             string          >\0             "%s"
+60             string          ptch            Palm OS operating system patch data
+>0             string          >\0             "%s"
+
+# Mobipocket (www.mobipocket.com), donated by Carl Witty
+60     string                  BOOKMOBI        Mobipocket E-book
+>0     string                  >\0             "%s"
+#------------------------------------------------------------------------------
+# pdf:  file(1) magic for Portable Document Format
+#
+
+0      string          %PDF-           PDF document
+>5     byte            x               \b, version %c
+>7     byte            x               \b.%c
+
+#------------------------------------------------------------------------------
+# vorbis:  file(1) magic for Ogg/Vorbis files
+#
+# From Felix von Leitner <leitner@fefe.de>
+# Extended by Beni Cherniavsky <cben@crosswinds.net>
+# Further extended by Greg Wooledge <greg@wooledge.org>
+#
+# Most (everything but the number of channels and bitrate) is commented
+# out with `##' as it's not interesting to the average user.  The most
+# probable things advanced users would want to uncomment are probably
+# the number of comments and the encoder version.
+#
+# --- Ogg Framing ---
+0              string          OggS            Ogg data
+>4             byte            !0              UNKNOWN REVISION %u
+##>4           byte            0               revision 0
+>4             byte            0
+##>>14         lelong          x               (Serial %lX)
+# non-Vorbis content: FLAC (Free Lossless Audio Codec, http://flac.sourceforge.net)
+>>28           string          fLaC            \b, FLAC audio
+# non-Vorbis content: Theora
+>>28           string          \x80theora      \b, Theora video
+# non-Vorbis content: Speex
+>>28           string          Speex\ \ \      \b, Speex audio
+# non-Vorbis content: OGM
+>>28           string          \x01video\0\0\0 \b, OGM video
+>>>37          string/c        div3            (DivX 3)
+>>>37          string/c        divx            (DivX 4)
+>>>37          string/c        dx50            (DivX 5)
+>>>37          string/c        xvid            (XviD)
+# --- First vorbis packet - general header ---
+>>28           string          \x01vorbis      \b, Vorbis audio,
+>>>35          lelong          !0              UNKNOWN VERSION %lu,
+##>>>35                lelong          0               version 0,
+>>>35          lelong          0
+>>>>39         ubyte           1               mono,
+>>>>39         ubyte           2               stereo,
+>>>>39         ubyte           >2              %u channels,
+>>>>40         lelong          x               %lu Hz
+# Minimal, nominal and maximal bitrates specified when encoding
+>>>>48         string          <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff       \b,
+# The above tests if at least one of these is specified:
+>>>>>52                lelong          !-1
+# Vorbis RC2 has a bug which puts -1000 in the min/max bitrate fields
+# instead of -1.
+# Vorbis 1.0 uses 0 instead of -1.
+>>>>>>52       lelong          !0
+>>>>>>>52      lelong          !-1000
+>>>>>>>>52     lelong          x               <%lu
+>>>>>48                lelong          !-1
+>>>>>>48       lelong          x               ~%lu
+>>>>>44                lelong          !-1
+>>>>>>44       lelong          !-1000
+>>>>>>>44      lelong          !0
+>>>>>>>>44     lelong          x               >%lu
+>>>>>48                string          <\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff       bps
+# -- Second vorbis header packet - the comments
+# A kludge to read the vendor string.  It's a counted string, not a
+# zero-terminated one, so file(1) can't read it in a generic way.
+# libVorbis is the only one existing currently, so I detect specifically
+# it.  The interesting value is the cvs date (8 digits decimal).
+# Post-RC1 Ogg files have the second header packet (and thus the version)
+# in a different place, so we must use an indirect offset.
+>>>(84.b+85)           string          \x03vorbis
+>>>>(84.b+96)          string/c        Xiphophorus\ libVorbis\ I       \b, created by: Xiphophorus libVorbis I
+>>>>>(84.b+120)                string          >00000000       
+# Map to beta version numbers:
+>>>>>>(84.b+120)       string          <20000508       (<beta1, prepublic)
+>>>>>>(84.b+120)       string          20000508        (1.0 beta 1 or beta 2)
+>>>>>>(84.b+120)       string          >20000508
+>>>>>>>(84.b+120)      string          <20001031       (beta2-3)
+>>>>>>(84.b+120)       string          20001031        (1.0 beta 3)
+>>>>>>(84.b+120)       string          >20001031
+>>>>>>>(84.b+120)      string          <20010225       (beta3-4)
+>>>>>>(84.b+120)       string          20010225        (1.0 beta 4)
+>>>>>>(84.b+120)       string          >20010225
+>>>>>>>(84.b+120)      string          <20010615       (beta4-RC1)
+>>>>>>(84.b+120)       string          20010615        (1.0 RC1)
+>>>>>>(84.b+120)       string          20010813        (1.0 RC2)
+>>>>>>(84.b+120)       string          20010816        (RC2 - Garf tuned v1)
+>>>>>>(84.b+120)       string          20011014        (RC2 - Garf tuned v2)
+>>>>>>(84.b+120)       string          20011217        (1.0 RC3)
+>>>>>>(84.b+120)       string          20011231        (1.0 RC3)
+# Some pre-1.0 CVS snapshots still had "Xiphphorus"...
+>>>>>>(84.b+120)       string          >20011231       (pre-1.0 CVS)
+# For the 1.0 release, Xiphophorus is replaced by Xiph.Org
+>>>>(84.b+96)          string/c        Xiph.Org\ libVorbis\ I  \b, created by: Xiph.Org libVorbis I
+>>>>>(84.b+117)                string          >00000000       
+>>>>>>(84.b+117)       string          <20020717       (pre-1.0 CVS)
+>>>>>>(84.b+117)       string          20020717        (1.0)
+>>>>>>(84.b+117)       string          20030909        (1.0.1)
+>>>>>>(84.b+117)       string          20040629        (1.1.0 RC1)
+
+#-----------------------------------------------
+# GNU Smalltalk image, starting at version 1.6.2
+# From: catull_us@yahoo.com
+#
+0      string  GSTIm\0\0       GNU SmallTalk
+# little-endian
+>7     byte&1  =0              LE image version
+>>10   byte    x               %d.
+>>9    byte    x               \b%d.
+>>8    byte    x               \b%d
+#>>12  lelong  x               , data: %ld
+#>>16  lelong  x               , table: %ld
+#>>20  lelong  x               , memory: %ld
+# big-endian
+>7     byte&1  =1              BE image version
+>>8    byte    x               %d.
+>>9    byte    x               \b%d.
+>>10   byte    x               \b%d
+#>>12  belong  x               , data: %ld
+#>>16  belong  x               , table: %ld
+#>>20  belong  x               , memory: %ld
+
+
+
+#------------------------------------------------------------------------------
+# sgml:  file(1) magic for Standard Generalized Markup Language
+# HyperText Markup Language (HTML) is an SGML document type,
+# from Daniel Quinlan (quinlan@yggdrasil.com)
+# adapted to string extenstions by Anthon van der Neut <anthon@mnt.org)
+0   string/cB  \<!DOCTYPE\ html        HTML document text
+0   string/cb  \<head                  HTML document text
+0   string/cb  \<title                 HTML document text
+0   string/cb  \<html                  HTML document text
+
+# Extensible markup language (XML), a subset of SGML
+# from Marc Prud'hommeaux (marc@apocalypse.org)
+0      string/cb       \<?xml                  XML document text
+0      string          \<?xml\ version "       XML
+0      string          \<?xml\ version="       XML
+>15    string          >\0                     %.3s document text
+>>23   string          \<xsl:stylesheet        (XSL stylesheet)
+>>24   string          \<xsl:stylesheet        (XSL stylesheet)
+0      string/b        \<?xml                  XML document text
+0      string/cb       \<?xml                  broken XML document text
+
+
+# SGML, mostly from rph@sq
+0   string/cb  \<!doctype              exported SGML document text
+0   string/cb  \<!subdoc               exported SGML subdocument text
+0   string/cb  \<!--                   exported SGML document text
+
+# Web browser cookie files
+# (Mozilla, Galeon, Netscape 4, Konqueror..)
+# Ulf Harnhammar <ulfh@update.uu.se>
+0      string  #\ HTTP\ Cookie\ File   Web browser cookie text
+0      string  #\ Netscape\ HTTP\ Cookie\ File Netscape cookie text
+0      string  #\ KDE\ Cookie\ File    Konqueror cookie text
+
+#------------------------------------------------------------------------------
+# msvc:  file(1) magic for msvc
+# "H. Nanosecond" <aldomel@ix.netcom.com>
+# Microsoft visual C
+# 
+# I have version 1.0
+
+# .aps
+0      string  HWB\000\377\001\000\000\000     Microsoft Visual C .APS file
+
+# .ide
+#too long 0    string  \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157\152\145\143\164\040\106\151\154\145\012\000\032\000\002\000\262\000\272\276\372\316        MSVC .ide
+0      string  \102\157\162\154\141\156\144\040\103\053\053\040\120\162\157    MSVC .ide
+
+# .res
+0      string  \000\000\000\000\040\000\000\000\377    MSVC .res
+0      string  \377\003\000\377\001\000\020\020\350    MSVC .res
+0      string  \377\003\000\377\001\000\060\020\350    MSVC .res
+
+#.lib
+0      string  \360\015\000\000        Microsoft Visual C library
+0      string  \360\075\000\000        Microsoft Visual C library
+0      string  \360\175\000\000        Microsoft Visual C library
+
+#.pch
+0      string  DTJPCH0\000\022\103\006\200     Microsoft Visual C .pch
+
+# .pdb
+# too long 0   string  Microsoft\ C/C++\ program\ database\ 
+0      string  Microsoft\ C/C++\       MSVC program database
+>18    string  program\ database\      
+>33    string  >\0     ver %s
+
+#.sbr
+0      string  \000\002\000\007\000    MSVC .sbr
+>5     string  >\0     %s
+
+#.bsc
+0      string  \002\000\002\001        MSVC .bsc
+
+#.wsp
+0      string  1.00\ .0000.0000\000\003        MSVC .wsp version 1.0000.0000
+# these seem to start with the version and contain menus
+
+#------------------------------------------------------------------------------
+# news:  file(1) magic for SunOS NeWS fonts (not "news" as in "netnews")
+#
+0      string          StartFontMetrics        ASCII font metrics
+0      string          StartFont       ASCII font bits
+0      belong          0x137A2944      NeWS bitmap font
+0      belong          0x137A2947      NeWS font family
+0      belong          0x137A2950      scalable OpenFont binary
+0      belong          0x137A2951      encrypted scalable OpenFont binary
+8      belong          0x137A2B45      X11/NeWS bitmap font
+8      belong          0x137A2B48      X11/NeWS font family
+
+# -----------------------------------------------------------
+# VMware specific files (deducted from version 1.1 and log file entries)
+# Anthon van der Neut (anthon@mnt.org)
+0      belong  0x4d52564e      VMware nvram 
+0      belong  0x434f5744      VMware
+>4     byte    3               virtual disk 
+>>32   lelong  x               (%d/
+>>36   lelong  x               \b%d/
+>>40   lelong  x               \b%d)
+>4     byte    2               undoable disk
+>>32   string  >\0             (%s)
+
+#------------------------------------------------------------------------------
+# diamond:  file(1) magic for Diamond system
+#
+# ... diamond is a multi-media mail and electronic conferencing system....
+#
+# XXX - I think it was either renamed Slate, or replaced by Slate....
+#
+#      The full deal is too long...
+#0     string  <list>\n<protocol\ bbn-multimedia-format>       Diamond Multimedia Document
+0      string  =<list>\n<protocol\ bbn-m       Diamond Multimedia Document
+
+#------------------------------------------------------------------------------
+# dump:  file(1) magic for dump file format--for new and old dump filesystems
+#
+# We specify both byte orders in order to recognize byte-swapped dumps.
+#
+24     belong  60012           new-fs dump file (big endian),
+>4     bedate  x               Previous dump %s,
+>8     bedate  x               This dump %s,
+>12    belong  >0              Volume %ld,
+>692   belong  0               Level zero, type:
+>692   belong  >0              Level %d, type:
+>0     belong  1               tape header,
+>0     belong  2               beginning of file record,
+>0     belong  3               map of inodes on tape,
+>0     belong  4               continuation of file record,
+>0     belong  5               end of volume,
+>0     belong  6               map of inodes deleted,
+>0     belong  7               end of medium (for floppy),
+>676   string  >\0             Label %s,
+>696   string  >\0             Filesystem %s,
+>760   string  >\0             Device %s,
+>824   string  >\0             Host %s,
+>888   belong  >0              Flags %x
+
+24     belong  60011           old-fs dump file (big endian),
+#>4    bedate  x               Previous dump %s,
+#>8    bedate  x               This dump %s,
+>12    belong  >0              Volume %ld,
+>692   belong  0               Level zero, type:
+>692   belong  >0              Level %d, type:
+>0     belong  1               tape header,
+>0     belong  2               beginning of file record,
+>0     belong  3               map of inodes on tape,
+>0     belong  4               continuation of file record,
+>0     belong  5               end of volume,
+>0     belong  6               map of inodes deleted,
+>0     belong  7               end of medium (for floppy),
+>676   string  >\0             Label %s,
+>696   string  >\0             Filesystem %s,
+>760   string  >\0             Device %s,
+>824   string  >\0             Host %s,
+>888   belong  >0              Flags %x
+
+24     lelong  60012           new-fs dump file (little endian),
+>4     ledate  x               This dump %s,
+>8     ledate  x               Previous dump %s,
+>12    lelong  >0              Volume %ld,
+>692   lelong  0               Level zero, type:
+>692   lelong  >0              Level %d, type:
+>0     lelong  1               tape header,
+>0     lelong  2               beginning of file record,
+>0     lelong  3               map of inodes on tape,
+>0     lelong  4               continuation of file record,
+>0     lelong  5               end of volume,
+>0     lelong  6               map of inodes deleted,
+>0     lelong  7               end of medium (for floppy),
+>676   string  >\0             Label %s,
+>696   string  >\0             Filesystem %s,
+>760   string  >\0             Device %s,
+>824   string  >\0             Host %s,
+>888   lelong  >0              Flags %x
+
+24     lelong  60011           old-fs dump file (little endian),
+#>4    ledate  x               Previous dump %s,
+#>8    ledate  x               This dump %s,
+>12    lelong  >0              Volume %ld,
+>692   lelong  0               Level zero, type:
+>692   lelong  >0              Level %d, type:
+>0     lelong  1               tape header,
+>0     lelong  2               beginning of file record,
+>0     lelong  3               map of inodes on tape,
+>0     lelong  4               continuation of file record,
+>0     lelong  5               end of volume,
+>0     lelong  6               map of inodes deleted,
+>0     lelong  7               end of medium (for floppy),
+>676   string  >\0             Label %s,
+>696   string  >\0             Filesystem %s,
+>760   string  >\0             Device %s,
+>824   string  >\0             Host %s,
+>888   lelong  >0              Flags %x
+
+#------------------------------------------------------------------------------
+# linux:  file(1) magic for Linux files
+#
+# Values for Linux/i386 binaries, from Daniel Quinlan <quinlan@yggdrasil.com>
+# The following basic Linux magic is useful for reference, but using
+# "long" magic is a better practice in order to avoid collisions.
+#
+# 2    leshort         100             Linux/i386
+# >0   leshort         0407            impure executable (OMAGIC)
+# >0   leshort         0410            pure executable (NMAGIC)
+# >0   leshort         0413            demand-paged executable (ZMAGIC)
+# >0   leshort         0314            demand-paged executable (QMAGIC)
+#
+0      lelong          0x00640107      Linux/i386 impure executable (OMAGIC)
+>16    lelong          0               \b, stripped
+0      lelong          0x00640108      Linux/i386 pure executable (NMAGIC)
+>16    lelong          0               \b, stripped
+0      lelong          0x0064010b      Linux/i386 demand-paged executable (ZMAGIC)
+>16    lelong          0               \b, stripped
+0      lelong          0x006400cc      Linux/i386 demand-paged executable (QMAGIC)
+>16    lelong          0               \b, stripped
+#
+0      string          \007\001\000    Linux/i386 object file
+>20    lelong          >0x1020         \b, DLL library
+# Linux-8086 stuff:
+0      string          \01\03\020\04   Linux-8086 impure executable
+>28    long            !0              not stripped
+0      string          \01\03\040\04   Linux-8086 executable
+>28    long            !0              not stripped
+#
+0      string          \243\206\001\0  Linux-8086 object file
+#
+0      string          \01\03\020\20   Minix-386 impure executable
+>28    long            !0              not stripped
+0      string          \01\03\040\20   Minix-386 executable
+>28    long            !0              not stripped
+# core dump file, from Bill Reynolds <bill@goshawk.lanl.gov>
+216    lelong          0421            Linux/i386 core file
+>220   string          >\0             of '%s'
+>200   lelong          >0              (signal %d)
+#
+# LILO boot/chain loaders, from Daniel Quinlan <quinlan@yggdrasil.com>
+# this can be overridden by the DOS executable (COM) entry
+2      string          LILO            Linux/i386 LILO boot/chain loader
+#
+# PSF fonts, from H. Peter Anvin <hpa@yggdrasil.com>
+0      leshort         0x0436          Linux/i386 PC Screen Font data,
+>2     byte            0               256 characters, no directory,
+>2     byte            1               512 characters, no directory,
+>2     byte            2               256 characters, Unicode directory,
+>2     byte            3               512 characters, Unicode directory,
+>3     byte            >0              8x%d
+# Linux swap file, from Daniel Quinlan <quinlan@yggdrasil.com>
+4086   string          SWAP-SPACE      Linux/i386 swap file
+# according to man page of mkswap (8) March 1999
+4086   string          SWAPSPACE2      Linux/i386 swap file (new style)
+>0x400 long            x               %d (4K pages)
+>0x404 long            x               size %d pages
+# ECOFF magic for OSF/1 and Linux (only tested under Linux though)
+#
+#      from Erik Troan (ewt@redhat.com) examining od dumps, so this
+#              could be wrong
+#      updated by David Mosberger (davidm@azstarnet.com) based on
+#      GNU BFD and MIPS info found below.
+#
+0      leshort         0x0183          ECOFF alpha
+>24    leshort         0407            executable
+>24    leshort         0410            pure
+>24    leshort         0413            demand paged
+>8     long            >0              not stripped
+>8     long            0               stripped
+>23    leshort         >0              - version %ld.
+#
+# Linux kernel boot images, from Albert Cahalan <acahalan@cs.uml.edu>
+# and others such as Axel Kohlmeyer <akohlmey@rincewind.chemie.uni-ulm.de>
+# and Nicolás Lichtmaier <nick@debian.org>
+# All known start with: b8 c0 07 8e d8 b8 00 90 8e c0 b9 00 01 29 f6 29
+# Linux kernel boot images (i386 arch) (Wolfram Kleff)
+514    string          HdrS            Linux kernel
+>510   leshort         0xAA55          x86 boot executable
+>>518  leshort         >=3D0x200
+>>529  byte            0               zImage,
+>>>529 byte            1               bzImage,
+>>>(526.s+0x200) string        >\0             version %s,
+>>498  leshort         1               RO-rootFS,
+>>498  leshort         0               RW-rootFS,
+>>508  leshort         >0              root_dev 0x%X,
+>>502  leshort         >0              swap_dev 0x%X,
+>>504  leshort         >0              RAMdisksize %u KB,
+>>506  leshort         0xFFFF          Normal VGA
+>>506  leshort         0xFFFE          Extended VGA
+>>506  leshort         0xFFFD          Prompt for Videomode
+>>506  leshort         >0              Video mode %d
+# This also matches new kernels, which were caught above by "HdrS".
+0              belong  0xb8c0078e      Linux kernel
+>0x1e3         string  Loading         version 1.3.79 or older
+>0x1e9         string  Loading         from prehistoric times
+
+# System.map files - Nicolás Lichtmaier <nick@debian.org>
+8      string  \ A\ _text      Linux kernel symbol map text
+
+# LSM entries - Nicolás Lichtmaier <nick@debian.org>
+0      string  Begin3  Linux Software Map entry text
+0      string  Begin4  Linux Software Map entry text (new format)
+
+# From Matt Zimmerman
+0       belong  0x4f4f4f4d      User-mode Linux COW file
+>4      belong  x               \b, version %d
+>8      string  >\0             \b, backing file %s
+
+############################################################################
+# Linux kernel versions
+
+0              string          \xb8\xc0\x07\x8e\xd8\xb8\x00\x90        Linux
+>497           leshort         0               x86 boot sector
+>>514          belong          0x8e    of a kernel from the dawn of time!
+>>514          belong          0x908ed8b4      version 0.99-1.1.42
+>>514          belong          0x908ed8b8      for memtest86
+
+>497           leshort         !0              x86 kernel
+>>504          leshort         >0              RAMdisksize=%u KB
+>>502          leshort         >0              swap=0x%X
+>>508          leshort         >0              root=0x%X
+>>>498         leshort         1               \b-ro
+>>>498         leshort         0               \b-rw
+>>506          leshort         0xFFFF          vga=normal
+>>506          leshort         0xFFFE          vga=extended
+>>506          leshort         0xFFFD          vga=ask
+>>506          leshort         >0              vga=%d
+>>514          belong          0x908ed881      version 1.1.43-1.1.45
+>>514          belong          0x15b281cd
+>>>0xa8e       belong          0x55AA5a5a      version 1.1.46-1.2.13,1.3.0
+>>>0xa99       belong          0x55AA5a5a      version 1.3.1,2
+>>>0xaa3       belong          0x55AA5a5a      version 1.3.3-1.3.30
+>>>0xaa6       belong          0x55AA5a5a      version 1.3.31-1.3.41
+>>>0xb2b       belong          0x55AA5a5a      version 1.3.42-1.3.45
+>>>0xaf7       belong          0x55AA5a5a      version 1.3.46-1.3.72
+>>514          string          HdrS
+>>>518         leshort         >0x1FF
+>>>>529                byte            0               \b, zImage
+>>>>529                byte            1               \b, bzImage
+>>>>(526.s+0x200) string       >\0             \b, version %s
+
+# Linux boot sector thefts.
+0              belong          0xb8c0078e      Linux
+>0x1e6         belong          0x454c4b53      ELKS Kernel
+>0x1e6         belong          !0x454c4b53     style boot sector
+
+############################################################################
+# Linux 8086 executable
+0      lelong&0xFF0000FF 0xC30000E9    Linux-Dev86 executable, headerless
+>5     string          .               
+>>4    string          >\0             \b, libc version %s
+
+0      lelong&0xFF00FFFF 0x4000301     Linux-8086 executable
+>2     byte&0x01       !0              \b, unmapped zero page
+>2     byte&0x20       0               \b, impure
+>2     byte&0x20       !0
+>>2    byte&0x10       !0              \b, A_EXEC
+>2     byte&0x02       !0              \b, A_PAL
+>2     byte&0x04       !0              \b, A_NSYM
+>2     byte&0x08       !0              \b, A_STAND
+>2     byte&0x40       !0              \b, A_PURE
+>2     byte&0x80       !0              \b, A_TOVLY
+>28     long            !0              \b, not stripped
+>37    string          .               
+>>36   string          >\0             \b, libc version %s
+
+# 0    lelong&0xFF00FFFF 0x10000301    ld86 I80386 executable
+# 0    lelong&0xFF00FFFF 0xB000301     ld86 M68K executable
+# 0    lelong&0xFF00FFFF 0xC000301     ld86 NS16K executable
+# 0    lelong&0xFF00FFFF 0x17000301    ld86 SPARC executable
+
+# SYSLINUX boot logo files (from 'ppmtolss16' sources)
+# http://syslinux.zytor.com/
+#
+0      lelong  =0x1413f33d             SYSLINUX' LSS16 image data
+>4     leshort x                       \b, width %d
+>6     leshort x                       \b, height %d
+#------------------------------------------------------------------------------
+# mime:  file(1) magic for MIME encoded files
+#
+0      string          Content-Type:\
+>14    string          >\0             %s
+0      string          Content-Type:
+>13    string          >\0             %s
+
+#------------------------------------------------------------------------------
+# zilog:  file(1) magic for Zilog Z8000.
+#
+# Was it big-endian or little-endian?  My Product Specification doesn't
+# say.
+#
+0      long            0xe807          object file (z8000 a.out)
+0      long            0xe808          pure object file (z8000 a.out)
+0      long            0xe809          separate object file (z8000 a.out)
+0      long            0xe805          overlay object file (z8000 a.out)
+
+#------------------------------------------------------------------------------
+# sgi:  file(1) magic for Silicon Graphics applications
+
+#
+#
+# Performance Co-Pilot file types
+0      string  PmNs                            PCP compiled namespace (V.0)
+0      string  PmN                             PCP compiled namespace
+>3     string  >\0                             (V.%1.1s)
+3      lelong  0x84500526                      PCP archive
+>7     byte    x                               (V.%d)
+>20    lelong  -2                              temporal index
+>20    lelong  -1                              metadata
+>20    lelong  0                               log volume #0
+>20    lelong  >0                              log volume #%ld
+>24    string  >\0                             host: %s
+0      string  PCPFolio                        PCP 
+>9     string  Version:                        Archive Folio
+>18    string  >\0                             (V.%s)
+0      string  #pmchart                        PCP pmchart view
+>9     string  Version
+>17    string  >\0                             (V%-3.3s)
+0      string  pmview                          PCP pmview config
+>7     string  Version
+>15    string  >\0                             (V%-3.3s)
+0      string  #pmlogger                       PCP pmlogger config
+>10    string  Version
+>18    string  >\0                             (V%1.1s)
+0      string  PcPh                            PCP Help 
+>4     string  1                               Index
+>4     string  2                               Text
+>5     string  >\0                             (V.%1.1s)
+0      string  #pmieconf-rules                 PCP pmieconf rules
+>16    string  >\0                             (V.%1.1s)
+3      string  pmieconf-pmie                   PCP pmie config
+>17    string  >\0                             (V.%1.1s)
+
+# SpeedShop data files
+0      lelong  0x13130303                      SpeedShop data file
+
+# mdbm files
+0      lelong  0x01023962                      mdbm file, version 0 (obsolete)
+0      string  mdbm                            mdbm file,
+>5     byte    x                               version %d,
+>6     byte    x                               2^%d pages,
+>7     byte    x                               pagesize 2^%d,
+>17    byte    x                               hash %d,
+>11    byte    x                               dataformat %d
+
+# Alias|Wavefront Maya files
+0      string  //Maya ASCII    Alias|Wavefront Maya Ascii File,
+>13    string  >\0     version %s
+8      string  MAYAFOR4        Alias|Wavefront Maya Binary File,
+>32    string  >\0     version %s scene
+8      string  MayaFOR4        Alias|Wavefront Maya Binary File,
+>32    string  >\0     version %s scene
+8      string  CIMG            Alias|Wavefront Maya Image File
+8      string  DEEP            Alias|Wavefront Maya Image File
+
+#------------------------------------------------------------------------------
+# sequent:  file(1) magic for Sequent machines
+#
+# Sequent information updated by Don Dwiggins <atsun!dwiggins>.
+# For Sequent's multiprocessor systems (incomplete).
+0      lelong  0x00ea          BALANCE NS32000 .o
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      lelong  0x10ea          BALANCE NS32000 executable (0 @ 0)
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      lelong  0x20ea          BALANCE NS32000 executable (invalid @ 0)
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      lelong  0x30ea          BALANCE NS32000 standalone executable
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+#
+# Symmetry information added by Jason Merrill <jason@jarthur.claremont.edu>.
+# Symmetry magic nums will not be reached if DOS COM comes before them;
+# byte 0xeb is matched before these get a chance.
+0      leshort 0x12eb          SYMMETRY i386 .o
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      leshort 0x22eb          SYMMETRY i386 executable (0 @ 0)
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      leshort 0x32eb          SYMMETRY i386 executable (invalid @ 0)
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+0      leshort 0x42eb          SYMMETRY i386 standalone executable
+>16    lelong  >0              not stripped
+>124   lelong  >0              version %ld
+
+#------------------------------------------------------------------------------
+# blit:  file(1) magic for 68K Blit stuff as seen from 680x0 machine
+#
+# Note that this 0407 conflicts with several other a.out formats...
+#
+# XXX - should this be redone with "be" and "le", so that it works on
+# little-endian machines as well?  If so, what's the deal with
+# "VAX-order" and "VAX-order2"?
+#
+#0     long            0407            68K Blit (standalone) executable
+#0     short           0407            VAX-order2 68K Blit (standalone) executable
+0      short           03401           VAX-order 68K Blit (standalone) executable
+0      long            0406            68k Blit mpx/mux executable
+0      short           0406            VAX-order2 68k Blit mpx/mux executable
+0      short           03001           VAX-order 68k Blit mpx/mux executable
+# Need more values for WE32 DMD executables.
+# Note that 0520 is the same as COFF
+#0     short           0520            tty630 layers executable
+#------------------------------------------------------------------------------
+# impulse tracker:  file(1) magic for Impulse Tracker data files
+#
+# From <collver1@attbi.com>
+# These are the /etc/magic entries to decode modules, instruments, and
+# samples in Impulse Tracker's native format.
+
+0      string          IMPS            Impulse Tracker Sample
+>18    byte            &2              16 bit
+>18    byte            ^2              8 bit
+>18    byte            &4              stereo
+>18    byte            ^4              mono
+0      string          IMPI            Impulse Tracker Instrument
+>28    leshort         !0              ITv%x
+>30    byte            !0              %d samples
+0      string          IMPM            Impulse Tracker Module
+>40    leshort         !0              compatible w/ITv%x
+>42    leshort         !0              created w/ITv%x
+
+#------------------------------------------------------------------------------
+# island:  file(1) magic for IslandWite/IslandDraw, from SunOS 5.5.1
+# "/etc/magic":
+# From: guy@netapp.com (Guy Harris)
+#
+4      string          pgscriptver     IslandWrite document
+13     string          DrawFile        IslandDraw document
+
+
+#------------------------------------------------------------------------------
+# maple:  file(1) magic for maple files
+# "H. Nanosecond" <aldomel@ix.netcom.com>
+# Maple V release 4, a multi-purpose math program
+#
+
+# maple library .lib
+0      string  \000MVR4\nI     MapleVr4 library
+
+# .ind
+# no magic for these :-(
+# they are compiled indexes for maple files
+
+# .hdb 
+0      string  \000\004\000\000        Maple help database
+
+# .mhp
+# this has the form <PACKAGE=name>
+0      string  \<PACKAGE=      Maple help file
+0      string  \<HELP\ NAME=   Maple help file
+0      string  \n\<HELP\ NAME= Maple help file with extra carriage return at start (yuck)
+#0     string  #\ Newton       Maple help file, old style
+0      string  #\ daub Maple help file, old style
+#0     string  #===========    Maple help file, old style
+
+# .mws
+0      string  \000\000\001\044\000\221        Maple worksheet
+#this is anomalous
+0      string  WriteNow\000\002\000\001\000\000\000\000\100\000\000\000\000\000        Maple worksheet, but weird
+# this has the form {VERSION 2 3 "IBM INTEL NT" "2.3" }\n
+# that is {VERSION major_version miunor_version computer_type version_string}
+0      string  {VERSION\       Maple worksheet
+>9     string  >\0     version %.1s.
+>>10   string
+>>>11  string  >\0     %.1s
+
+# .mps
+0      string  \0\0\001$       Maple something
+# from byte 4 it is either 'nul E' or 'soh R'
+# I think 'nul E' means a file that was saved as  a different name
+# a sort of revision marking
+# 'soh R' means new 
+>4     string  \000\105        An old revision
+>4     string  \001\122        The latest save
+
+# .mpl
+# some of these are the same as .mps above
+#0000000 000 000 001 044 000 105 same as .mps
+#0000000 000 000 001 044 001 122 same as .mps
+
+0      string  #\n##\ <SHAREFILE=      Maple something
+0      string  \n#\n##\ <SHAREFILE=    Maple something
+0      string  ##\ <SHAREFILE= Maple something
+0      string  #\r##\ <SHAREFILE=      Maple something
+0      string  \r#\r##\ <SHAREFILE=    Maple something
+0      string  #\ \r##\ <DESCRIBE>     Maple something anomalous.
+#
+# Copyright (c) 1996 Ignatios Souvatzis. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#      This product includes software developed by Ignatios Souvatzis for
+#      the NetBSD project.
+# 4. The name of the author may not be used to endorse or promote products
+#    derived from this software without specific prior written permission.
+#
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+#
+#
+# OS9/6809 module descriptions:
+#
+0      beshort         0x87CD  OS9/6809 module:
+#
+>6     byte&0x0f       0x00    non-executable
+>6     byte&0x0f       0x01    machine language
+>6     byte&0x0f       0x02    BASIC I-code
+>6     byte&0x0f       0x03    Pascal P-code
+>6     byte&0x0f       0x04    C I-code
+>6     byte&0x0f       0x05    COBOL I-code
+>6     byte&0x0f       0x06    Fortran I-code
+#
+>6     byte&0xf0       0x10    program executable
+>6     byte&0xf0       0x20    subroutine
+>6     byte&0xf0       0x30    multi-module
+>6     byte&0xf0       0x40    data module
+#
+>6     byte&0xf0       0xC0    system module
+>6     byte&0xf0       0xD0    file manager
+>6     byte&0xf0       0xE0    device driver
+>6     byte&0xf0       0xF0    device descriptor
+#
+# OS9/m68k stuff (to be continued)
+#
+0      beshort         0x4AFC  OS9/68K module:
+#
+# attr
+>0x14  byte&0x80       0x80    re-entrant
+>0x14  byte&0x40       0x40    ghost
+>0x14  byte&0x20       0x20    system-state
+#
+# lang:
+#
+>0x13  byte            1       machine language
+>0x13  byte            2       BASIC I-code
+>0x13  byte            3       Pascal P-code
+>0x13  byte            4       C I-code
+>0x13  byte            5       COBOL I-code
+>0x13  byte            6       Fortran I-code
+#
+#
+# type:
+#
+>0x12  byte            1       program executable
+>0x12  byte            2       subroutine
+>0x12  byte            3       multi-module
+>0x12  byte            4       data module
+>0x12  byte            11      trap library
+>0x12  byte            12      system module
+>0x12  byte            13      file manager
+>0x12  byte            14      device driver
+>0x12  byte            15      device descriptor
+
+#------------------------------------------------------------------------------
+# pkgadd:  file(1) magic for SysV R4 PKG Datastreams
+#
+0       string          #\ PaCkAgE\ DaTaStReAm  pkg Datastream (SVR4)
+
+#------------------------------------------------------------------------------
+# xo65 object files
+# From: "Ullrich von Bassewitz" <uz@cc65.org>
+#
+0      string          \x55\x7A\x6E\x61        xo65 object,
+>4     leshort         x                       version %d,
+>6     leshort&0x0001 =0x0001                  with debug info
+>6     leshort&0x0001 =0x0000                  no debug info
+
+# xo65 library files
+0      string          \x6E\x61\x55\x7A        xo65 library,
+>4     leshort         x                       version %d
+
+# o65 object files
+0      string          \x01\x00\x6F\x36\x35    o65
+>6     leshort&0x1000  =0x0000                 executable,
+>6     leshort&0x1000  =0x1000                 object,
+>5     byte            x                       version %d,
+>6     leshort&0x8000  =0x8000                 65816,
+>6     leshort&0x8000  =0x0000                 6502,
+>6     leshort&0x2000  =0x2000                 32 bit,
+>6     leshort&0x2000  =0x0000                 16 bit,
+>6     leshort&0x4000  =0x4000                 page reloc,
+>6     leshort&0x4000  =0x0000                 byte reloc,
+>6     leshort&0x0003  =0x0000                 alignment 1
+>6     leshort&0x0003  =0x0001                 alignment 2
+>6     leshort&0x0003  =0x0002                 alignment 4
+>6     leshort&0x0003  =0x0003                 alignment 256
+#------------------------------------------------------------------------------
+# Virtutech Compressed Random Access File Format
+#
+# From <gustav@virtutech.com>
+0      string          \211\277\036\203        Virtutech CRAFF
+>4     belong          x               v%d
+>20    belong          0               uncompressed
+>20    belong          1               bzipp2ed
+>20    belong          2               gzipped
+>24    belong          0               not clean
+
+#------------------------------------------------------------------------------
+# uuencode:  file(1) magic for ASCII-encoded files
+#
+
+# GRR:  the first line of xxencoded files is identical to that in uuencoded
+# files, but the first character in most subsequent lines is 'h' instead of
+# 'M'.  (xxencoding uses lowercase letters in place of most of uuencode's
+# punctuation and survives BITNET gateways better.)  If regular expressions
+# were supported, this entry could possibly be split into two with
+# "begin\040\.\*\012M" or "begin\040\.\*\012h" (where \. and \* are REs).
+0      string          begin\040       uuencoded or xxencoded text
+
+# btoa(1) is an alternative to uuencode that requires less space.
+0      string          xbtoa\ Begin    btoa'd text
+
+# ship(1) is another, much cooler alternative to uuencode.
+# Greg Roelofs, newt@uchicago.edu
+0      string          $\012ship       ship'd binary text
+
+# bencode(8) is used to encode compressed news batches (Bnews/Cnews only?)
+# Greg Roelofs, newt@uchicago.edu
+0      string  Decode\ the\ following\ with\ bdeco     bencoded News text
+
+# BinHex is the Macintosh ASCII-encoded file format (see also "apple")
+# Daniel Quinlan, quinlan@yggdrasil.com
+11     string  must\ be\ converted\ with\ BinHex       BinHex binary text
+>41    string  x                                       \b, version %.3s
+
+# GRR:  is MIME BASE64 encoding handled somewhere?
+#------------------------------------------------------------------------------
+# amanda:  file(1) magic for amanda file format
+#
+0      string  AMANDA:\                AMANDA 
+>8     string  TAPESTART\ DATE         tape header file,
+>>23   string  X
+>>>25  string  >\                      Unused %s
+>>23   string  >\                      DATE %s
+>8     string  FILE\                   dump file,
+>>13   string  >\                      DATE %s
+
+#------------------------------------------------------------------------------
+# audio:  file(1) magic for sound formats (see also "iff")
+#
+# Jan Nicolai Langfeldt (janl@ifi.uio.no), Dan Quinlan (quinlan@yggdrasil.com),
+# and others
+#
+
+# Sun/NeXT audio data
+0      string          .snd            Sun/NeXT audio data:
+>12    belong          1               8-bit ISDN mu-law,
+>12    belong          2               8-bit linear PCM [REF-PCM],
+>12    belong          3               16-bit linear PCM,
+>12    belong          4               24-bit linear PCM,
+>12    belong          5               32-bit linear PCM,
+>12    belong          6               32-bit IEEE floating point,
+>12    belong          7               64-bit IEEE floating point,
+>12    belong          8               Fragmented sample data,
+>12    belong          10              DSP program,
+>12    belong          11              8-bit fixed point,
+>12    belong          12              16-bit fixed point,
+>12    belong          13              24-bit fixed point,
+>12    belong          14              32-bit fixed point,
+>12    belong          18              16-bit linear with emphasis,
+>12    belong          19              16-bit linear compressed,
+>12    belong          20              16-bit linear with emphasis and compression,
+>12    belong          21              Music kit DSP commands,
+>12    belong          23              8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice data encoding),
+>12    belong          24              compressed (8-bit CCITT G.722 ADPCM)
+>12    belong          25              compressed (3-bit CCITT G.723.3 ADPCM),
+>12    belong          26              compressed (5-bit CCITT G.723.5 ADPCM),
+>12    belong          27              8-bit A-law (CCITT G.711),
+>20    belong          1               mono,
+>20    belong          2               stereo,
+>20    belong          4               quad,
+>16    belong          >0              %d Hz
+
+# DEC systems (e.g. DECstation 5000) use a variant of the Sun/NeXT format
+# that uses little-endian encoding and has a different magic number
+0      lelong          0x0064732E      DEC audio data:
+>12    lelong          1               8-bit ISDN mu-law,
+>12    lelong          2               8-bit linear PCM [REF-PCM],
+>12    lelong          3               16-bit linear PCM,
+>12    lelong          4               24-bit linear PCM,
+>12    lelong          5               32-bit linear PCM,
+>12    lelong          6               32-bit IEEE floating point,
+>12    lelong          7               64-bit IEEE floating point,
+>12    belong          8               Fragmented sample data,
+>12    belong          10              DSP program,
+>12    belong          11              8-bit fixed point,
+>12    belong          12              16-bit fixed point,
+>12    belong          13              24-bit fixed point,
+>12    belong          14              32-bit fixed point,
+>12    belong          18              16-bit linear with emphasis,
+>12    belong          19              16-bit linear compressed,
+>12    belong          20              16-bit linear with emphasis and compression,
+>12    belong          21              Music kit DSP commands,
+>12    lelong          23              8-bit ISDN mu-law compressed (CCITT G.721 ADPCM voice data encoding),
+>12    belong          24              compressed (8-bit CCITT G.722 ADPCM)
+>12    belong          25              compressed (3-bit CCITT G.723.3 ADPCM),
+>12    belong          26              compressed (5-bit CCITT G.723.5 ADPCM),
+>12    belong          27              8-bit A-law (CCITT G.711),
+>20    lelong          1               mono,
+>20    lelong          2               stereo,
+>20    lelong          4               quad,
+>16    lelong          >0              %d Hz
+
+# Creative Labs AUDIO stuff
+0      string  MThd                    Standard MIDI data
+>8     beshort x                       (format %d)
+>10    beshort x                       using %d track
+>10    beshort         >1              \bs
+>12    beshort&0x7fff  x               at 1/%d
+>12    beshort&0x8000  >0              SMPTE
+
+0      string  CTMF                    Creative Music (CMF) data
+0      string  SBI                     SoundBlaster instrument data
+0      string  Creative\ Voice\ File   Creative Labs voice data
+# is this next line right?  it came this way...
+>19    byte    0x1A
+>23    byte    >0                      - version %d
+>22    byte    >0                      \b.%d
+
+# first entry is also the string "NTRK"
+0      belong          0x4e54524b      MultiTrack sound data
+>4     belong          x               - version %ld
+
+# Extended MOD format (*.emd) (Greg Roelofs, newt@uchicago.edu); NOT TESTED
+# [based on posting 940824 by "Dirk/Elastik", husberg@lehtori.cc.tut.fi]
+0      string          EMOD            Extended MOD sound data,
+>4     byte&0xf0       x               version %d
+>4     byte&0x0f       x               \b.%d,
+>45    byte            x               %d instruments
+>83    byte            0               (module)
+>83    byte            1               (song)
+
+# Real Audio (Magic .ra\0375)
+0      belong          0x2e7261fd      RealAudio sound file
+0      string          .RMF            RealMedia file
+
+# MTM/669/FAR/S3M/ULT/XM format checking [Aaron Eppert, aeppert@dialin.ind.net]
+# Oct 31, 1995
+# fixed by <doj@cubic.org> 2003-06-24
+# Too short...
+#0     string          MTM             MultiTracker Module sound file
+#0     string          if              Composer 669 Module sound data
+#0     string          JN              Composer 669 Module sound data (extended format)
+0      string          MAS_U           ULT(imate) Module sound data
+
+#0     string          FAR             Module sound data
+#>4    string          >\15            Title: "%s"
+
+0x2c   string          SCRM            ScreamTracker III Module sound data
+>0     string          >\0             Title: "%s"
+
+# Gravis UltraSound patches
+# From <ache@nagual.ru>
+
+0      string          GF1PATCH110\0ID#000002\0        GUS patch
+0      string          GF1PATCH100\0ID#000002\0        Old GUS patch
+
+#
+# Taken from loader code from mikmod version 2.14
+# by Steve McIntyre (stevem@chiark.greenend.org.uk)
+# <doj@cubic.org> added title printing on 2003-06-24
+0      string  MAS_UTrack_V00
+>14    string  >/0             ultratracker V1.%.1s module sound data
+
+0      string  UN05            MikMod UNI format module sound data
+
+0      string  Extended\ Module: Fasttracker II module sound data
+>17    string  >\0             Title: "%s"
+
+21     string/c        !SCREAM!        Screamtracker 2 module sound data
+21     string  BMOD2STM        Screamtracker 2 module sound data
+1080   string  M.K.            4-channel Protracker module sound data
+>0     string  >\0             Title: "%s"
+1080   string  M!K!            4-channel Protracker module sound data
+>0     string  >\0             Title: "%s"
+1080   string  FLT4            4-channel Startracker module sound data
+>0     string  >\0             Title: "%s"
+1080   string  FLT8            8-channel Startracker module sound data
+>0     string  >\0             Title: "%s"
+1080   string  4CHN            4-channel Fasttracker module sound data
+>0     string  >\0             Title: "%s"
+1080   string  6CHN            6-channel Fasttracker module sound data
+>0     string  >\0             Title: "%s"
+1080   string  8CHN            8-channel Fasttracker module sound data
+>0     string  >\0             Title: "%s"
+1080   string  CD81            8-channel Octalyser module sound data
+>0     string  >\0             Title: "%s"
+1080   string  OKTA            8-channel Oktalyzer module sound data
+>0     string  >\0             Title: "%s"
+# Not good enough.
+#1082  string  CH
+#>1080 string  >/0             %.2s-channel Fasttracker "oktalyzer" module sound data
+1080   string  16CN            16-channel Taketracker module sound data
+>0     string  >\0             Title: "%s"
+1080   string  32CN            32-channel Taketracker module sound data
+>0     string  >\0             Title: "%s"
+
+# TOC sound files -Trevor Johnson <trevor@jpj.net>
+#
+0       string          TOC             TOC sound file
+
+# sidfiles <pooka@iki.fi>
+# added name,author,(c) and new RSID type by <doj@cubic.org> 2003-06-24
+0      string          SIDPLAY\ INFOFILE       Sidplay info file
+
+0      string          PSID                    PlaySID v2.2+ (AMIGA) sidtune
+>4     beshort         >0                      w/ header v%d,
+>14    beshort         =1                      single song,
+>14    beshort         >1                      %d songs,
+>16    beshort         >0                      default song: %d
+>0x16  string          >\0                     name: "%s"
+>0x36  string          >\0                     author: "%s"
+>0x56  string          >\0                     copyright: "%s"
+
+0      string          RSID                    RSID sidtune PlaySID compatible
+>4     beshort         >0                      w/ header v%d,
+>14    beshort         =1                      single song,
+>14    beshort         >1                      %d songs,
+>16    beshort         >0                      default song: %d
+>0x16  string          >\0                     name: "%s"
+>0x36  string          >\0                     author: "%s"
+>0x56  string          >\0                     copyright: "%s"
+
+# IRCAM <mpruett@sgi.com>
+# VAX and MIPS files are little-endian; Sun and NeXT are big-endian
+0      belong          0x64a30100              IRCAM file (VAX)
+0      belong          0x64a30200              IRCAM file (Sun)
+0      belong          0x64a30300              IRCAM file (MIPS little-endian)
+0      belong          0x64a30400              IRCAM file (NeXT)
+
+# NIST SPHERE <mpruett@sgi.com>
+0      string          NIST_1A\n\ \ \ 1024\n   NIST SPHERE file
+
+# Sample Vision <mpruett@sgi.com>
+0      string          SOUND\ SAMPLE\ DATA\    Sample Vision file
+
+# Audio Visual Research <tonigonenstein@users.sourceforge.net>
+0      string          2BIT                    Audio Visual Research file,
+>12    beshort         =0                      mono,
+>12    beshort         =-1                     stereo,
+>14    beshort         x                       %d bits
+>16    beshort         =0                      unsigned,
+>16    beshort         =-1                     signed,
+>22    belong&0x00ffffff       x               %d Hz,
+>18    beshort         =0                      no loop,
+>18    beshort         =-1                     loop,
+>21    ubyte           <=127                   note %d,
+>22    byte            =0                      replay 5.485 KHz
+>22    byte            =1                      replay 8.084 KHz
+>22    byte            =2                      replay 10.971 Khz
+>22    byte            =3                      replay 16.168 Khz
+>22    byte            =4                      replay 21.942 KHz
+>22    byte            =5                      replay 32.336 KHz
+>22    byte            =6                      replay 43.885 KHz
+>22    byte            =7                      replay 47.261 KHz
+
+# SGI SoundTrack <mpruett@sgi.com>
+0      string          _SGI_SoundTrack         SGI SoundTrack project file
+# ID3 version 2 tags <waschk@informatik.uni-rostock.de>
+0      string          ID3     MP3 file with ID3 version 2.
+>3     ubyte   <0xff   \b%d.
+>4     ubyte   <0xff   \b%d tag
+
+# NSF (NES sound file) magic
+0      string          NESM\x1a        NES Sound File
+>14    string          >\0             ("%s" by
+>46    string          >\0             %s, copyright
+>78    string          >\0             %s),
+>5     byte            x               version %d,
+>6     byte            x               %d tracks,
+>122   byte&0x2        =1              dual PAL/NTSC
+>122   byte&0x1        =1              PAL
+>122   byte&0x1        =0              NTSC
+
+# Impuse tracker module (audio/x-it)
+0      string          IMPM            Impulse Tracker module sound data -
+>4     string          >\0             "%s"
+>40    leshort         !0              compatible w/ITv%x
+>42    leshort         !0              created w/ITv%x
+
+# Imago Orpheus module (audio/x-imf)
+60     string          IM10            Imago Orpheus module sound data -
+>0     string          >\0             "%s"
+
+# From <collver1@attbi.com>
+# These are the /etc/magic entries to decode modules, instruments, and
+# samples in Impulse Tracker's native format.
+
+0      string          IMPS            Impulse Tracker Sample
+>18    byte            &2              16 bit
+>18    byte            ^2              8 bit
+>18    byte            &4              stereo
+>18    byte            ^4              mono
+0      string          IMPI            Impulse Tracker Instrument
+>28    leshort         !0              ITv%x
+>30    byte            !0              %d samples
+
+# Yamaha TX Wave:  file(1) magic for Yamaha TX Wave audio files
+# From <collver1@attbi.com>
+0      string          LM8953          Yamaha TX Wave
+>22    byte            0x49            looped
+>22    byte            0xC9            non-looped
+>23    byte            1               33kHz
+>23    byte            2               50kHz
+>23    byte            3               16kHz
+
+# scream tracker:  file(1) magic for Scream Tracker sample files
+#
+# From <collver1@attbi.com>
+76     string          SCRS            Scream Tracker Sample
+>0     byte            1               sample
+>0     byte            2               adlib melody
+>0     byte            >2              adlib drum
+>31    byte            &2              stereo
+>31    byte            ^2              mono
+>31    byte            &4              16bit little endian
+>31    byte            ^4              8bit
+>30    byte            0               unpacked
+>30    byte            1               packed
+
+# audio
+# From: Cory Dikkers <cdikkers@swbell.net>
+0      string          MMD0            MED music file, version 0
+0      string          MMD1            OctaMED Pro music file, version 1
+0      string          MMD3            OctaMED Soundstudio music file, version 3
+0      string          OctaMEDCmpr     OctaMED Soundstudio compressed file
+0      string          MED             MED_Song
+0      string          SymM            Symphonie SymMOD music file
+#
+0      string          THX             AHX version
+>3     byte            =0              1 module data
+>3     byte            =1              2 module data
+#
+0      string          OKTASONG        Oktalyzer module data
+#
+0      string          DIGI\ Booster\ module\0 %s
+>20    byte            >0              %c
+>>21   byte            >0              \b%c
+>>>22  byte            >0              \b%c
+>>>>23 byte            >0              \b%c
+>610   string          >\0             \b, "%s"
+#
+0      string          DBM0            DIGI Booster Pro Module
+>4     byte            >0              V%X.
+>>5    byte            x               \b%02X
+>16    string          >\0             \b, "%s"
+#
+0      string          FTMN            FaceTheMusic module
+>16    string          >\0d            \b, "%s"
+
+# From: <doj@cubic.org> 2003-06-24
+0      string          AMShdr\32       Velvet Studio AMS Module v2.2
+0      string          Extreme         Extreme Tracker AMS Module v1.3
+0      string          DDMF            Xtracker DMF Module
+>4     byte            x               v%i
+>0xD   string          >\0             Title: "%s"
+>0x2B  string          >\0             Composer: "%s"
+0      string          DSM\32          Dynamic Studio Module DSM
+0      string          SONG            DigiTrekker DTM Module
+0      string          DMDL            DigiTrakker MDL Module
+0      string          PSM\32          Protracker Studio PSM Module
+44     string          PTMF            Poly Tracker PTM Module
+>0     string          >\32            Title: "%s"
+0      string          MT20            MadTracker 2.0 Module MT2
+0      string          RAD\40by\40REALiTY!! RAD Adlib Tracker Module RAD
+0      string          RTMM            RTM Module
+0x426  string          MaDoKaN96       XMS Adlib Module
+>0     string          >\0             Composer: "%s"
+0      string          AMF             AMF Module
+>4     string          >\0             Title: "%s"
+0      string          MODINFO1        Open Cubic Player Module Inforation MDZ
+0      string          Extended\40Instrument: Fast Tracker II Instrument
+
+# From: Takeshi Hamasaki <hma@syd.odn.ne.jp>
+# NOA Nancy Codec file
+0      string          \210NOA\015\012\032     NOA Nancy Codec Movie file
+# Yamaha SMAF format
+0      string          MMMD            Yamaha SMAF file
+# Sharp Jisaku Melody format for PDC
+0      string          \001Sharp\040JisakuMelody       SHARP Cell-Phone ringing Melody
+>20    string          Ver01.00        Ver. 1.00
+>>32   byte            x               , %d tracks
+
+# Free lossless audio codec <http://flac.sourceforge.net>
+# From: Przemyslaw Augustyniak <silvathraec@rpg.pl>
+0      string                  fLaC            FLAC audio bitstream data
+>4     byte&0x7f               >0              \b, unknown version
+>4     byte&0x7f               0               \b
+# some common bits/sample values
+>>20   beshort&0x1f0           0x030           \b, 4 bit
+>>20   beshort&0x1f0           0x050           \b, 6 bit
+>>20   beshort&0x1f0           0x070           \b, 8 bit
+>>20   beshort&0x1f0           0x0b0           \b, 12 bit
+>>20   beshort&0x1f0           0x0f0           \b, 16 bit
+>>20   beshort&0x1f0           0x170           \b, 24 bit
+>>20   byte&0xe                0x0             \b, mono
+>>20   byte&0xe                0x2             \b, stereo
+>>20   byte&0xe                0x4             \b, 3 channels
+>>20   byte&0xe                0x6             \b, 4 channels
+>>20   byte&0xe                0x8             \b, 5 channels
+>>20   byte&0xe                0xa             \b, 6 channels
+>>20   byte&0xe                0xc             \b, 7 channels
+>>20   byte&0xe                0xe             \b, 8 channels
+# some common sample rates
+>>17   belong&0xfffff0         0x0ac440        \b, 44.1 kHz
+>>17   belong&0xfffff0         0x0bb800        \b, 48 kHz
+>>17   belong&0xfffff0         0x07d000        \b, 32 kHz
+>>17   belong&0xfffff0         0x056220        \b, 22.05 kHz
+>>17   belong&0xfffff0         0x05dc00        \b, 24 kHz
+>>17   belong&0xfffff0         0x03e800        \b, 16 kHz
+>>17   belong&0xfffff0         0x02b110        \b, 11.025 kHz
+>>17   belong&0xfffff0         0x02ee00        \b, 12 kHz
+>>17   belong&0xfffff0         0x01f400        \b, 8 kHz
+>>17   belong&0xfffff0         0x177000        \b, 96 kHz
+>>17   belong&0xfffff0         0x0fa000        \b, 64 kHz
+>>21   byte&0xf                >0              \b, >4G samples
+>>21   byte&0xf                0               \b
+>>>22  belong                  >0              \b, %u samples
+>>>22  belong                  0               \b, length unknown
+
+# (ISDN) VBOX voice message file (Wolfram Kleff)
+0       string          VBOX            VBOX voice message data
+
+# ReBorn Song Files (.rbs)
+# David J. Singer <doc@deadvirgins.org.uk>
+8       string          RB40             RBS Song file
+>29     string          ReBorn           created by ReBorn
+>37     string          Propellerhead    created by ReBirth
+
+# Synthesizer Generator and Kimwitu share their file format
+0      string          A#S#C#S#S#L#V#3     Synthesizer Generator or Kimwitu data
+# Kimwitu++ uses a slightly different magic
+0      string          A#S#C#S#S#L#HUB     Kimwitu++ data
+
+# From "Simon Hosie
+0       string  TFMX-SONG       TFMX module sound data
+
+# From danny.milo@gmx.net (Danny Milosavljevic)
+# monkeysaudio for magic.mime
+0      string  MAC\    X/Monkey audio,
+>4     leshort >0      version %d,
+>6     leshort >0      compression level %d,
+>8     leshort >0      flags %x,
+>10    leshort >0      channels %d,
+>12    lelong  >0      samplerate %d,
+>24    lelong  >0      frames %d
+
+#------------------------------------------------------------------------------
+# bsdi:  file(1) magic for BSD/OS (from BSDI) objects
+#
+
+0      lelong          0314            386 compact demand paged pure executable
+>16    lelong          >0              not stripped
+>32    byte            0x6a            (uses shared libs)
+
+0      lelong          0407            386 executable
+>16    lelong          >0              not stripped
+>32    byte            0x6a            (uses shared libs)
+
+0      lelong          0410            386 pure executable
+>16    lelong          >0              not stripped
+>32    byte            0x6a            (uses shared libs)
+
+0      lelong          0413            386 demand paged pure executable
+>16    lelong          >0              not stripped
+>32    byte            0x6a            (uses shared libs)
+
+# same as in SunOS 4.x, except for static shared libraries
+0      belong&077777777        0600413         sparc demand paged
+>0     byte            &0x80
+>>20   belong          <4096           shared library
+>>20   belong          =4096           dynamically linked executable
+>>20   belong          >4096           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+>36    belong          0xb4100001      (uses shared libs)
+
+0      belong&077777777        0600410         sparc pure
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+>36    belong          0xb4100001      (uses shared libs)
+
+0      belong&077777777        0600407         sparc
+>0     byte            &0x80           dynamically linked executable
+>0     byte            ^0x80           executable
+>16    belong          >0              not stripped
+>36    belong          0xb4100001      (uses shared libs)
+
+#------------------------------------------------------------------------------
+# fcs: file(1) magic for FCS (Flow Cytometry Standard) data files
+# From Roger Leigh <roger@whinlatter.uklinux.net>
+0       string          FCS1.0          Flow Cytometry Standard (FCS) data, version 1.0
+0       string          FCS2.0          Flow Cytometry Standard (FCS) data, version 2.0
+0       string          FCS3.0          Flow Cytometry Standard (FCS) data, version 3.0
+
+
+#------------------------------------------------------------------------------
+# intel:  file(1) magic for x86 Unix
+#
+# Various flavors of x86 UNIX executable/object (other than Xenix, which
+# is in "microsoft").  DOS is in "msdos"; the ambitious soul can do
+# Windows as well.
+#
+# Windows NT belongs elsewhere, as you need x86 and MIPS and Alpha and
+# whatever comes next (HP-PA Hummingbird?).  OS/2 may also go elsewhere
+# as well, if, as, and when IBM makes it portable.
+#
+# The `versions' should be un-commented if they work for you.
+# (Was the problem just one of endianness?)
+#
+0      leshort         0502            basic-16 executable
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         0503            basic-16 executable (TV)
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         0510            x86 executable
+>12    lelong          >0              not stripped
+0      leshort         0511            x86 executable (TV)
+>12    lelong          >0              not stripped
+0      leshort         =0512           iAPX 286 executable small model (COFF)
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+0      leshort         =0522           iAPX 286 executable large model (COFF)
+>12    lelong          >0              not stripped
+#>22   leshort         >0              - version %ld
+# SGI labeled the next entry as "iAPX 386 executable" --Dan Quinlan
+0      leshort         =0514           80386 COFF executable
+>12    lelong          >0              not stripped
+>22    leshort         >0              - version %ld
+
+# rom: file(1) magic for BIOS ROM Extensions found in intel machines
+#      mapped into memory between 0xC0000 and 0xFFFFF
+# From Gürkan Sengün <gurkan@linuks.mine.nu>, www.linuks.mine.nu
+0        beshort         0x55AA       BIOS (ia32) ROM Ext.
+>5       string          USB          USB
+>7       string          LDR          UNDI image
+>30      string          IBM          IBM comp. Video
+>26      string          Adaptec      Adaptec
+>28      string          Adaptec      Adaptec
+>42      string          PROMISE      Promise
+>2       byte            x            (%d*512)
+
+#------------------------------------------------------------------------------
+# netbsd:  file(1) magic for NetBSD objects
+#
+# All new-style magic numbers are in network byte order.
+#
+
+0      lelong                  000000407       a.out NetBSD little-endian object file
+>16    lelong                  >0              not stripped
+0      belong                  000000407       a.out NetBSD big-endian object file
+>16    belong                  >0              not stripped
+
+0      belong&0377777777       041400413       a.out NetBSD/i386 demand paged
+>0     byte                    &0x80           
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       041400410       a.out NetBSD/i386 pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       041400407       a.out NetBSD/i386
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+0      belong&0377777777       041400507       a.out NetBSD/i386 core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+0      belong&0377777777       041600413       a.out NetBSD/m68k demand paged
+>0     byte                    &0x80           
+>>20   belong                  <8192           shared library
+>>20   belong                  =8192           dynamically linked executable
+>>20   belong                  >8192           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       041600410       a.out NetBSD/m68k pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       041600407       a.out NetBSD/m68k
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   belong                  !0              executable
+>>20   belong                  =0              object file
+>16    belong                  >0              not stripped
+0      belong&0377777777       041600507       a.out NetBSD/m68k core
+>12    string                  >\0             from '%s'
+>32    belong                  !0              (signal %d)
+
+0      belong&0377777777       042000413       a.out NetBSD/m68k4k demand paged
+>0     byte                    &0x80           
+>>20   belong                  <4096           shared library
+>>20   belong                  =4096           dynamically linked executable
+>>20   belong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       042000410       a.out NetBSD/m68k4k pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       042000407       a.out NetBSD/m68k4k
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   belong                  !0              executable
+>>20   belong                  =0              object file
+>16    belong                  >0              not stripped
+0      belong&0377777777       042000507       a.out NetBSD/m68k4k core
+>12    string                  >\0             from '%s'
+>32    belong                  !0              (signal %d)
+
+0      belong&0377777777       042200413       a.out NetBSD/ns32532 demand paged
+>0     byte                    &0x80           
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042200410       a.out NetBSD/ns32532 pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042200407       a.out NetBSD/ns32532
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042200507       a.out NetBSD/ns32532 core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+0      belong&0377777777       045200507       a.out NetBSD/powerpc core
+>12    string                  >\0             from '%s'
+
+0      belong&0377777777       042400413       a.out NetBSD/sparc demand paged
+>0     byte                    &0x80           
+>>20   belong                  <8192           shared library
+>>20   belong                  =8192           dynamically linked executable
+>>20   belong                  >8192           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       042400410       a.out NetBSD/sparc pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       042400407       a.out NetBSD/sparc
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   belong                  !0              executable
+>>20   belong                  =0              object file
+>16    belong                  >0              not stripped
+0      belong&0377777777       042400507       a.out NetBSD/sparc core
+>12    string                  >\0             from '%s'
+>32    belong                  !0              (signal %d)
+
+0      belong&0377777777       042600413       a.out NetBSD/pmax demand paged
+>0     byte                    &0x80           
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042600410       a.out NetBSD/pmax pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042600407       a.out NetBSD/pmax
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+0      belong&0377777777       042600507       a.out NetBSD/pmax core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+0      belong&0377777777       043000413       a.out NetBSD/vax 1k demand paged
+>0     byte                    &0x80           
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       043000410       a.out NetBSD/vax 1k pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       043000407       a.out NetBSD/vax 1k
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+0      belong&0377777777       043000507       a.out NetBSD/vax 1k core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+0      belong&0377777777       045400413       a.out NetBSD/vax 4k demand paged
+>0     byte                    &0x80           
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       045400410       a.out NetBSD/vax 4k pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       045400407       a.out NetBSD/vax 4k
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+0      belong&0377777777       045400507       a.out NetBSD/vax 4k core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+# NetBSD/alpha does not support (and has never supported) a.out objects,
+# so no rules are provided for them.  NetBSD/alpha ELF objects are 
+# dealt with in "elf".
+0      lelong          0x00070185              ECOFF NetBSD/alpha binary
+>10    leshort         0x0001                  not stripped
+>10    leshort         0x0000                  stripped
+0      belong&0377777777       043200507       a.out NetBSD/alpha core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+0      belong&0377777777       043400413       a.out NetBSD/mips demand paged
+>0     byte                    &0x80           
+>>20   belong                  <8192           shared library
+>>20   belong                  =8192           dynamically linked executable
+>>20   belong                  >8192           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       043400410       a.out NetBSD/mips pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    belong                  >0              not stripped
+0      belong&0377777777       043400407       a.out NetBSD/mips
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   belong                  !0              executable
+>>20   belong                  =0              object file
+>16    belong                  >0              not stripped
+0      belong&0377777777       043400507       a.out NetBSD/mips core
+>12    string                  >\0             from '%s'
+>32    belong                  !0              (signal %d)
+
+0      belong&0377777777       043600413       a.out NetBSD/arm32 demand paged
+>0     byte                    &0x80
+>>20   lelong                  <4096           shared library
+>>20   lelong                  =4096           dynamically linked executable
+>>20   lelong                  >4096           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       043600410       a.out NetBSD/arm32 pure
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80           executable
+>16    lelong                  >0              not stripped
+0      belong&0377777777       043600407       a.out NetBSD/arm32
+>0     byte                    &0x80           dynamically linked executable
+>0     byte                    ^0x80
+>>0    byte                    &0x40           position independent
+>>20   lelong                  !0              executable
+>>20   lelong                  =0              object file
+>16    lelong                  >0              not stripped
+# NetBSD/arm26 has always used ELF objects, but it shares a core file
+# format with NetBSD/arm32.
+0      belong&0377777777       043600507       a.out NetBSD/arm core
+>12    string                  >\0             from '%s'
+>32    lelong                  !0              (signal %d)
+
+#------------------------------------------------------------------------------
+# riff:  file(1) magic for RIFF format
+# See
+#
+#      http://www.seanet.com/users/matts/riffmci/riffmci.htm
+#
+# AVI section extended by Patrik Rådman <patrik+file-magic@iki.fi>
+#
+0      string          RIFF            RIFF (little-endian) data
+# RIFF Palette format
+>8     string          PAL             \b, palette
+>>16   leshort         x               \b, version %d
+>>18   leshort         x               \b, %d entries
+# RIFF Device Independent Bitmap format
+>8     string          RDIB            \b, device-independent bitmap
+>>16   string          BM              
+>>>30  leshort         12              \b, OS/2 1.x format
+>>>>34 leshort         x               \b, %d x
+>>>>36 leshort         x               %d
+>>>30  leshort         64              \b, OS/2 2.x format
+>>>>34 leshort         x               \b, %d x
+>>>>36 leshort         x               %d
+>>>30  leshort         40              \b, Windows 3.x format
+>>>>34 lelong          x               \b, %d x
+>>>>38 lelong          x               %d x
+>>>>44 leshort         x               %d
+# RIFF MIDI format
+>8     string          RMID            \b, MIDI
+# RIFF Multimedia Movie File format
+>8     string          RMMP            \b, multimedia movie
+# Microsoft WAVE format (*.wav)
+>8     string          WAVE            \b, WAVE audio
+>>20   leshort         1               \b, Microsoft PCM
+>>>34  leshort         >0              \b, %d bit
+>>20   leshort         2               \b, Microsoft ADPCM
+>>20   leshort         6               \b, ITU G.711 A-law
+>>20   leshort         7               \b, ITU G.711 mu-law
+>>20   leshort         17              \b, IMA ADPCM
+>>20   leshort         20              \b, ITU G.723 ADPCM (Yamaha)
+>>20   leshort         49              \b, GSM 6.10
+>>20   leshort         64              \b, ITU G.721 ADPCM
+>>20   leshort         80              \b, MPEG
+>>20   leshort         85              \b, MPEG Layer 3
+>>22   leshort         =1              \b, mono
+>>22   leshort         =2              \b, stereo
+>>22   leshort         >2              \b, %d channels
+>>24   lelong          >0              %d Hz
+# Corel Draw Picture
+>8     string          CDRA            \b, Corel Draw Picture
+# AVI == Audio Video Interleave
+>8     string          AVI\040         \b, AVI
+>>12    string          LIST
+>>>20   string          hdrlavih
+>>>>&36 lelong          x               \b, %lu x
+>>>>&40 lelong          x               %lu,
+>>>>&4  lelong          >1000000        <1 fps,
+>>>>&4  lelong          1000000         1.00 fps,
+>>>>&4  lelong          500000          2.00 fps,
+>>>>&4  lelong          333333          3.00 fps,
+>>>>&4  lelong          250000          4.00 fps,
+>>>>&4  lelong          200000          5.00 fps,
+>>>>&4  lelong          166667          6.00 fps,
+>>>>&4  lelong          142857          7.00 fps,
+>>>>&4  lelong          125000          8.00 fps,
+>>>>&4  lelong          111111          9.00 fps,
+>>>>&4  lelong          100000          10.00 fps,
+# ]9.9,10.1[
+>>>>&4  lelong          <101010
+>>>>>&-4        lelong  >99010
+>>>>>>&-4       lelong  !100000         ~10 fps,
+>>>>&4  lelong          83333           12.00 fps,
+# ]11.9,12.1[
+>>>>&4  lelong          <84034
+>>>>>&-4        lelong  >82645
+>>>>>>&-4       lelong  !83333          ~12 fps,
+>>>>&4  lelong          66667           15.00 fps,
+# ]14.9,15.1[
+>>>>&4  lelong          <67114
+>>>>>&-4        lelong  >66225
+>>>>>>&-4       lelong  !66667          ~15 fps,
+>>>>&4  lelong          50000           20.00 fps,
+>>>>&4  lelong          41708           23.98 fps,
+>>>>&4  lelong          41667           24.00 fps,
+# ]23.9,24.1[
+>>>>&4  lelong          <41841
+>>>>>&-4        lelong  >41494
+>>>>>>&-4       lelong  !41708
+>>>>>>>&-4      lelong  !41667          ~24 fps,
+>>>>&4  lelong          40000           25.00 fps,
+# ]24.9,25.1[
+>>>>&4  lelong          <40161
+>>>>>&-4        lelong  >39841
+>>>>>>&-4       lelong  !40000          ~25 fps,
+>>>>&4  lelong          33367           29.97 fps,
+>>>>&4  lelong          33333           30.00 fps,
+# ]29.9,30.1[
+>>>>&4  lelong          <33445
+>>>>>&-4        lelong  >33223
+>>>>>>&-4       lelong  !33367
+>>>>>>>&-4      lelong  !33333          ~30 fps,
+>>>>&4  lelong          <32224          >30 fps,
+##>>>>&4  lelong          x               (%lu)
+##>>>>&20 lelong          x               %lu frames,
+# Note: The tests below assume that the AVI has 1 or 2 streams,
+#       "vids" optionally followed by "auds".
+#       (Should cover 99.9% of all AVIs.)
+# assuming avih length = 56
+>>>88   string  LIST
+>>>>96  string  strlstrh
+>>>>>108        string  vids    video:
+>>>>>>&0        lelong  0               uncompressed
+# skip past vids strh
+>>>>>>(104.l+108)       string  strf
+>>>>>>>(104.l+132)      lelong          1       RLE 8bpp
+>>>>>>>(104.l+132)      string/c        cvid    Cinepak
+>>>>>>>(104.l+132)      string/c        i263    Intel I.263
+>>>>>>>(104.l+132)      string/c        iv32    Indeo 3.2
+>>>>>>>(104.l+132)      string/c        iv41    Indeo 4.1
+>>>>>>>(104.l+132)      string/c        iv50    Indeo 5.0
+>>>>>>>(104.l+132)      string/c        mp42    Microsoft MPEG-4 v2
+>>>>>>>(104.l+132)      string/c        mp43    Microsoft MPEG-4 v3
+>>>>>>>(104.l+132)      string/c        mjpg    Motion JPEG
+>>>>>>>(104.l+132)      string/c        div3    DivX 3
+>>>>>>>>112             string/c        div3    Low-Motion
+>>>>>>>>112             string/c        div4    Fast-Motion
+>>>>>>>(104.l+132)      string/c        divx    DivX 4
+>>>>>>>(104.l+132)      string/c        dx50    DivX 5
+>>>>>>>(104.l+132)      string/c        xvid    XviD
+>>>>>>>(104.l+132)      lelong  0
+##>>>>>>>(104.l+132)      string  x       (%.4s)
+# skip past first (video) LIST
+>>>>(92.l+96)   string  LIST
+>>>>>(92.l+104) string  strlstrh
+>>>>>>(92.l+116)        string          auds    \b, audio:
+# auds strh length = 56:
+>>>>>>>(92.l+172)       string          strf
+>>>>>>>>(92.l+180)      leshort 0x0001  uncompressed PCM
+>>>>>>>>(92.l+180)      leshort 0x0002  ADPCM
+>>>>>>>>(92.l+180)      leshort 0x0055  MPEG-1 Layer 3
+>>>>>>>>(92.l+180)      leshort 0x2000  Dolby AC3
+>>>>>>>>(92.l+180)      leshort 0x0161  DivX
+##>>>>>>>>(92.l+180)      leshort x       (0x%.4x)
+>>>>>>>>(92.l+182)      leshort 1       (mono,
+>>>>>>>>(92.l+182)      leshort 2       (stereo,
+>>>>>>>>(92.l+182)      leshort >2      (%d channels,
+>>>>>>>>(92.l+184)      lelong  x       %d Hz)
+# auds strh length = 64:
+>>>>>>>(92.l+180)       string          strf
+>>>>>>>>(92.l+188)      leshort 0x0001  uncompressed PCM
+>>>>>>>>(92.l+188)      leshort 0x0002  ADPCM
+>>>>>>>>(92.l+188)      leshort 0x0055  MPEG-1 Layer 3
+>>>>>>>>(92.l+188)      leshort 0x2000  Dolby AC3
+>>>>>>>>(92.l+188)      leshort 0x0161  DivX
+##>>>>>>>>(92.l+188)      leshort x       (0x%.4x)
+>>>>>>>>(92.l+190)      leshort 1       (mono,
+>>>>>>>>(92.l+190)      leshort 2       (stereo,
+>>>>>>>>(92.l+190)      leshort >2      (%d channels,
+>>>>>>>>(92.l+192)      lelong  x       %d Hz)
+# Animated Cursor format
+>8     string          ACON            \b, animated cursor
+# SoundFont 2 <mpruett@sgi.com>
+>8     string          sfbk            SoundFont/Bank
+# MPEG-1 wrapped in a RIFF, apparently
+>8      string          CDXA            \b, wrapped MPEG-1 (CDXA)
+>8     string          4XMV            \b, 4X Movie file 
+
+#
+# XXX - some of the below may only appear in little-endian form.
+#
+# Also "MV93" appears to be for one form of Macromedia Director
+# files, and "GDMF" appears to be another multimedia format.
+#
+0      string          RIFX            RIFF (big-endian) data
+# RIFF Palette format
+>8     string          PAL             \b, palette
+>>16   beshort         x               \b, version %d
+>>18   beshort         x               \b, %d entries
+# RIFF Device Independent Bitmap format
+>8     string          RDIB            \b, device-independent bitmap
+>>16   string          BM              
+>>>30  beshort         12              \b, OS/2 1.x format
+>>>>34 beshort         x               \b, %d x
+>>>>36 beshort         x               %d
+>>>30  beshort         64              \b, OS/2 2.x format
+>>>>34 beshort         x               \b, %d x
+>>>>36 beshort         x               %d
+>>>30  beshort         40              \b, Windows 3.x format
+>>>>34 belong          x               \b, %d x
+>>>>38 belong          x               %d x
+>>>>44 beshort         x               %d
+# RIFF MIDI format
+>8     string          RMID            \b, MIDI
+# RIFF Multimedia Movie File format
+>8     string          RMMP            \b, multimedia movie
+# Microsoft WAVE format (*.wav)
+>8     string          WAVE            \b, WAVE audio
+>>20   leshort         1               \b, Microsoft PCM
+>>>34  leshort         >0              \b, %d bit
+>>22   beshort         =1              \b, mono
+>>22   beshort         =2              \b, stereo
+>>22   beshort         >2              \b, %d channels
+>>24   belong          >0              %d Hz
+# Corel Draw Picture
+>8     string          CDRA            \b, Corel Draw Picture
+# AVI == Audio Video Interleave
+>8     string          AVI\040         \b, AVI
+# Animated Cursor format
+>8     string          ACON            \b, animated cursor
+# Notation Interchange File Format (big-endian only)
+>8     string          NIFF            \b, Notation Interchange File Format
+# SoundFont 2 <mpruett@sgi.com>
+>8     string          sfbk            SoundFont/Bank
+#------------------------------------------------------------------------------
+# Console game magic
+# Toby Deshane <hac@shoelace.digivill.net>
+#    ines:  file(1) magic for Marat's iNES Nintendo Entertainment System
+#           ROM dump format
+
+0 string NES\032 iNES ROM dump,
+>4 byte  x     %dx16k PRG
+>5 byte  x     \b, %dx8k CHR
+>6 byte&0x01  =0x1  \b, [Vert.]
+>6 byte&0x01  =0x0  \b, [Horiz.]
+>6 byte&0x02  =0x2  \b, [SRAM]
+>6 byte&0x04  =0x4  \b, [Trainer]
+>6 byte&0x04  =0x8  \b, [4-Scr]
+
+#------------------------------------------------------------------------------
+# gameboy:  file(1) magic for the Nintendo (Color) Gameboy raw ROM format
+#
+0x104 belong 0xCEED6666 Gameboy ROM:
+>0x134 string >\0 "%.16s"
+>0x146 byte 0x03  \b,[SGB]
+>0x147 byte 0x00  \b, [ROM ONLY]
+>0x147 byte 0x01  \b, [ROM+MBC1]
+>0x147 byte 0x02  \b, [ROM+MBC1+RAM]
+>0x147 byte 0x03  \b, [ROM+MBC1+RAM+BATT]
+>0x147 byte 0x05  \b, [ROM+MBC2]
+>0x147 byte 0x06  \b, [ROM+MBC2+BATTERY]
+>0x147 byte 0x08  \b, [ROM+RAM]
+>0x147 byte 0x09  \b, [ROM+RAM+BATTERY]
+>0x147 byte 0x0B  \b, [ROM+MMM01]
+>0x147 byte 0x0C  \b, [ROM+MMM01+SRAM]
+>0x147 byte 0x0D  \b, [ROM+MMM01+SRAM+BATT]
+>0x147 byte 0x0F  \b, [ROM+MBC3+TIMER+BATT]
+>0x147 byte 0x10  \b, [ROM+MBC3+TIMER+RAM+BATT]
+>0x147 byte 0x11  \b, [ROM+MBC3]
+>0x147 byte 0x12  \b, [ROM+MBC3+RAM]
+>0x147 byte 0x13  \b, [ROM+MBC3+RAM+BATT]
+>0x147 byte 0x19  \b, [ROM+MBC5]
+>0x147 byte 0x1A  \b, [ROM+MBC5+RAM]
+>0x147 byte 0x1B  \b, [ROM+MBC5+RAM+BATT]
+>0x147 byte 0x1C  \b, [ROM+MBC5+RUMBLE]
+>0x147 byte 0x1D  \b, [ROM+MBC5+RUMBLE+SRAM]
+>0x147 byte 0x1E  \b, [ROM+MBC5+RUMBLE+SRAM+BATT]
+>0x147 byte 0x1F  \b, [Pocket Camera]
+>0x147 byte 0xFD  \b, [Bandai TAMA5]
+>0x147 byte 0xFE  \b, [Hudson HuC-3]
+>0x147 byte 0xFF  \b, [Hudson HuC-1]
+
+>0x148 byte 0     \b, ROM: 256Kbit
+>0x148 byte 1     \b, ROM: 512Kbit
+>0x148 byte 2     \b, ROM: 1Mbit
+>0x148 byte 3     \b, ROM: 2Mbit
+>0x148 byte 4     \b, ROM: 4Mbit
+>0x148 byte 5     \b, ROM: 8Mbit
+>0x148 byte 6     \b, ROM: 16Mbit
+>0x148 byte 0x52  \b, ROM: 9Mbit
+>0x148 byte 0x53  \b, ROM: 10Mbit
+>0x148 byte 0x54  \b, ROM: 12Mbit
+
+>0x149 byte 1     \b, RAM: 16Kbit
+>0x149 byte 2     \b, RAM: 64Kbit
+>0x149 byte 3     \b, RAM: 128Kbit
+>0x149 byte 4     \b, RAM: 1Mbit
+
+#>0x14e long  x     \b, CRC: %x
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) magic for the Sega MegaDrive/Genesis raw ROM format
+#
+0x100 string SEGA  Sega MegaDrive/Genesis raw ROM dump
+>0x120 string >\0 Name: "%.16s"
+>0x110 string >\0 %.16s
+>0x1B0 string RA with SRAM
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) magic for the Super MegaDrive ROM dump format
+#
+0x280 string EAGN  Super MagicDrive ROM dump
+>0 byte x %dx16k blocks
+>2 byte 0 \b, last in series or standalone
+>2 byte >0 \b, split ROM
+>8 byte 0xAA
+>9 byte 0xBB
+
+#------------------------------------------------------------------------------
+# genesis:  file(1) alternate magic for the Super MegaDrive ROM dump format
+#
+0x280 string EAMG  Super MagicDrive ROM dump
+>0 byte x %dx16k blocks
+>2 byte x \b, last in series or standalone
+>8 byte 0xAA
+>9 byte 0xBB
+
+#------------------------------------------------------------------------------
+# smsgg:  file(1) magic for Sega Master System and Game Gear ROM dumps
+#
+# Does not detect all images.  Very preliminary guesswork.  Need more data
+# on format.
+#
+# FIXME: need a little more info...;P
+#
+#0 byte 0xF3
+#>1 byte 0xED  Sega Master System/Game Gear ROM dump
+#>1 byte 0x31  Sega Master System/Game Gear ROM dump
+#>1 byte 0xDB  Sega Master System/Game Gear ROM dump
+#>1 byte 0xAF  Sega Master System/Game Gear ROM dump
+#>1 byte 0xC3  Sega Master System/Game Gear ROM dump
+
+#------------------------------------------------------------------------------
+# dreamcast:  file(1) uncertain magic for the Sega Dreamcast VMU image format
+#
+0 belong 0x21068028   Sega Dreamcast VMU game image
+0 string LCDi         Dream Animator file
+
+#------------------------------------------------------------------------------
+# v64: file(1) uncertain magic for the V64 format N64 ROM dumps
+#
+0 belong 0x37804012    V64 Nintendo 64 ROM dump
+
+#------------------------------------------------------------------------------
+# msx: file(1) magic for MSX game cartridge dumps
+# Too simple - MPi
+#0 beshort 0x4142 MSX game cartridge dump 
+
+#------------------------------------------------------------------------------
+# Sony Playstation executables (Adam Sjoegren <asjo@diku.dk>) :
+0      string  PS-X\ EXE       Sony Playstation executable
+#  Area:
+>113   string  x               (%s)
+
+#------------------------------------------------------------------------------
+# Microsoft Xbox executables .xbe (Esa Hyytiä <ehyytia@cc.hut.fi>)
+0       string          XBEH            XBE, Microsoft Xbox executable
+# probabilistic checks whether signed or not
+>0x0004 ulelong =0x0
+>>&2    ulelong =0x0
+>>>&2   ulelong =0x0  \b, not signed
+>0x0004 ulelong >0
+>>&2    ulelong >0
+>>>&2   ulelong >0    \b, signed
+# expect base address of 0x10000
+>0x0104               ulelong =0x10000
+>>(0x0118-0x0FF60)    ulelong&0x80000007  0x80000007 \b, all regions
+>>(0x0118-0x0FF60)    ulelong&0x80000007  !0x80000007
+>>>(0x0118-0x0FF60)   ulelong >0           (regions:
+>>>>(0x0118-0x0FF60)  ulelong &0x00000001  NA
+>>>>(0x0118-0x0FF60)  ulelong &0x00000002  Japan
+>>>>(0x0118-0x0FF60)  ulelong &0x00000004  Rest_of_World
+>>>>(0x0118-0x0FF60)  ulelong &0x80000000  Manufacturer
+>>>(0x0118-0x0FF60)   ulelong >0           \b)
+
+# --------------------------------
+# Microsoft Xbox data file formats
+0       string          XIP0            XIP, Microsoft Xbox data
+0       string          XTF0            XTF, Microsoft Xbox data
+
+# Atari Lynx cartridge dump (EXE/BLL header)
+# From: "Stefan A. Haubenthal" <polluks@web.de>
+
+0      beshort         0x8008          Lynx cartridge,
+>2     beshort         x               RAM start $%04x
+>6     string          BS93
+
+#------------------------------------------------------------------------------
+# Z-machine:  file(1) magic for Z-machine binaries.
+#
+# This will match ${TEX_BASE}/texmf/omega/ocp/char2uni/inbig5.ocp which
+# appears to be a version-0 Z-machine binary.
+#
+# The (false match) message is to correct that behavior.  Perhaps it is
+# not needed.
+#
+>16    belong&0xfe00f0f0       0x3030  Infocom game data
+>0     ubyte                   0       (false match)
+>0     ubyte                   >0      (Z-machine %d,
+>>2    ubeshort                x       Release %d /
+>>18   string                  >\0     Serial %.6s)
+
+#------------------------------------------------------------------------------
+# Glulx:  file(1) magic for Glulx binaries.
+#
+# I haven't checked for false matches yet.
+#
+0      string                  Glul    Glulx game data
+
+
+
+# These go at the end of the iff rules
+#
+# I don't see why these might collide with anything else.
+#
+# Interactive Fiction related formats
+#
+>8     string          IFRS            \b, Blorb Interactive Fiction
+>>24   string          Exec            with executable chunk
+>8     string          IFZS            \b, Z-machine or Glulx saved game file (Quetzal)
+
+#------------------------------------------------------------------------------
+# DEC SRC Virtual Paper: Lectern files
+# Karl M. Hegbloom <karlheg@inetarena.com>
+0      string  lect    DEC SRC Virtual Paper Lectern file
+
+#------------------------------------------------------------------------------
+# visx:  file(1) magic for Visx format files
+#
+0      short           0x5555          VISX image file
+>2     byte            0               (zero)
+>2     byte            1               (unsigned char)
+>2     byte            2               (short integer)
+>2     byte            3               (float 32)
+>2     byte            4               (float 64)
+>2     byte            5               (signed char)
+>2     byte            6               (bit-plane)
+>2     byte            7               (classes)
+>2     byte            8               (statistics)
+>2     byte            10              (ascii text)
+>2     byte            15              (image segments)
+>2     byte            100             (image set)
+>2     byte            101             (unsigned char vector)
+>2     byte            102             (short integer vector)
+>2     byte            103             (float 32 vector)
+>2     byte            104             (float 64 vector)
+>2     byte            105             (signed char vector)
+>2     byte            106             (bit plane vector)
+>2     byte            121             (feature vector)
+>2     byte            122             (feature vector library)
+>2     byte            124             (chain code)
+>2     byte            126             (bit vector)
+>2     byte            130             (graph)
+>2     byte            131             (adjacency graph)
+>2     byte            132             (adjacency graph library)
+>2     string          .VISIX          (ascii text)
+#------------------------------------------------------------------------------
+# varied.script:  file(1) magic for various interpreter scripts
+
+0      string          #!\ /                   a
+>3     string          >\0                     %s script text executable
+0      string          #!\     /               a
+>3     string          >\0                     %s script text executable
+0      string          #!/                     a
+>2     string          >\0                     %s script text executable
+0      string          #!\                     script text executable
+>3     string          >\0                     for %s
+
+# ------------------------------------------------------------------------
+# ti-8x: file(1) magic for the TI-8x and TI-9x Graphing Calculators.
+#
+# From: Ryan McGuire (rmcguire@freenet.columbus.oh.us).
+#
+# Update: Romain Lievin (roms@lpg.ticalc.org).
+#
+# NOTE: This list is not complete.
+# Files for the TI-80 and TI-81 are pretty rare. I'm not going to put the
+# program/group magic numbers in here because I cannot find any.
+0              string          **TI80**        TI-80 Graphing Calculator File.
+0              string          **TI81**        TI-81 Graphing Calculator File.
+#
+# Magic Numbers for the TI-73
+#
+0              string          **TI73**        TI-73 Graphing Calculator
+>0x00003B      byte            0x00            (real number)
+>0x00003B      byte            0x01            (list)
+>0x00003B      byte            0x02            (matrix)
+>0x00003B      byte            0x03            (equation)
+>0x00003B      byte            0x04            (string)
+>0x00003B      byte            0x05            (program)
+>0x00003B      byte            0x06            (assembly program)
+>0x00003B      byte            0x07            (picture)
+>0x00003B      byte            0x08            (gdb)
+>0x00003B      byte            0x0C            (complex number)
+>0x00003B      byte            0x0F            (window settings)
+>0x00003B      byte            0x10            (zoom)
+>0x00003B      byte            0x11            (table setup)
+>0x00003B      byte            0x13            (backup)
+
+# Magic Numbers for the TI-82
+#
+0              string          **TI82**        TI-82 Graphing Calculator
+>0x00003B      byte            0x00            (real)
+>0x00003B      byte            0x01            (list)
+>0x00003B      byte            0x02            (matrix)
+>0x00003B      byte            0x03            (Y-variable)
+>0x00003B      byte            0x05            (program)
+>0x00003B      byte            0x06            (protected prgm)
+>0x00003B      byte            0x07            (picture)
+>0x00003B      byte            0x08            (gdb)
+>0x00003B      byte            0x0B            (window settings)
+>0x00003B      byte            0x0C            (window settings)
+>0x00003B      byte            0x0D            (table setup)
+>0x00003B      byte            0x0E            (screenshot)
+>0x00003B      byte            0x0F            (backup)
+#
+# Magic Numbers for the TI-83
+#
+0              string          **TI83**        TI-83 Graphing Calculator
+>0x00003B      byte            0x00            (real)
+>0x00003B      byte            0x01            (list)
+>0x00003B      byte            0x02            (matrix)
+>0x00003B      byte            0x03            (Y-variable)
+>0x00003B      byte            0x04            (string)
+>0x00003B      byte            0x05            (program)
+>0x00003B      byte            0x06            (protected prgm)
+>0x00003B      byte            0x07            (picture)
+>0x00003B      byte            0x08            (gdb)
+>0x00003B      byte            0x0B            (window settings)
+>0x00003B      byte            0x0C            (window settings)
+>0x00003B      byte            0x0D            (table setup)
+>0x00003B      byte            0x0E            (screenshot)
+>0x00003B      byte            0x13            (backup)
+#
+# Magic Numbers for the TI-83+
+#
+0              string          **TI83F*        TI-83+ Graphing Calculator
+>0x00003B      byte            0x00            (real number)
+>0x00003B      byte            0x01            (list)
+>0x00003B      byte            0x02            (matrix)
+>0x00003B      byte            0x03            (equation)
+>0x00003B      byte            0x04            (string)
+>0x00003B      byte            0x05            (program)
+>0x00003B      byte            0x06            (assembly program)
+>0x00003B      byte            0x07            (picture)
+>0x00003B      byte            0x08            (gdb)
+>0x00003B      byte            0x0C            (complex number)
+>0x00003B      byte            0x0F            (window settings)
+>0x00003B      byte            0x10            (zoom)
+>0x00003B      byte            0x11            (table setup)
+>0x00003B      byte            0x13            (backup)
+>0x00003B      byte            0x15            (application variable)
+>0x00003B      byte            0x17            (group of variable)
+
+#
+# Magic Numbers for the TI-85
+#
+0              string          **TI85**        TI-85 Graphing Calculator
+>0x00003B      byte            0x00            (real number)
+>0x00003B      byte            0x01            (complex number)
+>0x00003B      byte            0x02            (real vector)
+>0x00003B      byte            0x03            (complex vector)
+>0x00003B      byte            0x04            (real list)
+>0x00003B      byte            0x05            (complex list)
+>0x00003B      byte            0x06            (real matrix)
+>0x00003B      byte            0x07            (complex matrix)
+>0x00003B      byte            0x08            (real constant)
+>0x00003B      byte            0x09            (complex constant)
+>0x00003B      byte            0x0A            (equation)
+>0x00003B      byte            0x0C            (string)
+>0x00003B      byte            0x0D            (function GDB)
+>0x00003B      byte            0x0E            (polar GDB)
+>0x00003B      byte            0x0F            (parametric GDB)
+>0x00003B      byte            0x10            (diffeq GDB)
+>0x00003B      byte            0x11            (picture)
+>0x00003B      byte            0x12            (program)
+>0x00003B      byte            0x13            (range)
+>0x00003B      byte            0x17            (window settings)
+>0x00003B      byte            0x18            (window settings)
+>0x00003B      byte            0x19            (window settings)
+>0x00003B      byte            0x1A            (window settings)
+>0x00003B      byte            0x1B            (zoom)
+>0x00003B      byte            0x1D            (backup)
+>0x00003B      byte            0x1E            (unknown)
+>0x00003B      byte            0x2A            (equation)
+>0x000032      string          ZS4             - ZShell Version 4 File.
+>0x000032      string          ZS3             - ZShell Version 3 File.
+#
+# Magic Numbers for the TI-86
+#
+0              string          **TI86**        TI-86 Graphing Calculator
+>0x00003B      byte            0x00            (real number)
+>0x00003B      byte            0x01            (complex number)
+>0x00003B      byte            0x02            (real vector)
+>0x00003B      byte            0x03            (complex vector)
+>0x00003B      byte            0x04            (real list)
+>0x00003B      byte            0x05            (complex list)
+>0x00003B      byte            0x06            (real matrix)
+>0x00003B      byte            0x07            (complex matrix)
+>0x00003B      byte            0x08            (real constant)
+>0x00003B      byte            0x09            (complex constant)
+>0x00003B      byte            0x0A            (equation)
+>0x00003B      byte            0x0C            (string)
+>0x00003B      byte            0x0D            (function GDB)
+>0x00003B      byte            0x0E            (polar GDB)
+>0x00003B      byte            0x0F            (parametric GDB)
+>0x00003B      byte            0x10            (diffeq GDB)
+>0x00003B      byte            0x11            (picture)
+>0x00003B      byte            0x12            (program)
+>0x00003B      byte            0x13            (range)
+>0x00003B      byte            0x17            (window settings)
+>0x00003B      byte            0x18            (window settings)
+>0x00003B      byte            0x19            (window settings)
+>0x00003B      byte            0x1A            (window settings)
+>0x00003B      byte            0x1B            (zoom)
+>0x00003B      byte            0x1D            (backup)
+>0x00003B      byte            0x1E            (unknown)
+>0x00003B      byte            0x2A            (equation)
+#
+# Magic Numbers for the TI-89
+#
+0              string          **TI89**        TI-89 Graphing Calculator
+>0x000048      byte            0x00            (expression)
+>0x000048      byte            0x04            (list)
+>0x000048      byte            0x06            (matrix)
+>0x000048      byte            0x0A            (data)
+>0x000048      byte            0x0B            (text)
+>0x000048      byte            0x0C            (string)
+>0x000048      byte            0x0D            (graphic data base)
+>0x000048      byte            0x0E            (figure)
+>0x000048      byte            0x10            (picture)
+>0x000048      byte            0x12            (program)
+>0x000048      byte            0x13            (function)
+>0x000048      byte            0x14            (macro)
+>0x000048      byte            0x1C            (zipped)
+>0x000048      byte            0x21            (assembler)
+#
+# Magic Numbers for the TI-92
+#
+0              string          **TI92**        TI-92 Graphing Calculator
+>0x000048      byte            0x00            (expression)
+>0x000048      byte            0x04            (list)
+>0x000048      byte            0x06            (matrix)
+>0x000048      byte            0x0A            (data)
+>0x000048      byte            0x0B            (text)
+>0x000048      byte            0x0C            (string)
+>0x000048      byte            0x0D            (graphic data base)
+>0x000048      byte            0x0E            (figure)
+>0x000048      byte            0x10            (picture)
+>0x000048      byte            0x12            (program)
+>0x000048      byte            0x13            (function)
+>0x000048      byte            0x14            (macro)
+>0x000048      byte            0x1D            (backup)
+#
+# Magic Numbers for the TI-92+/V200
+#
+0              string          **TI92P*        TI-92+/V200 Graphing Calculator
+>0x000048      byte            0x00            (expression)
+>0x000048      byte            0x04            (list)
+>0x000048      byte            0x06            (matrix)
+>0x000048      byte            0x0A            (data)
+>0x000048      byte            0x0B            (text)
+>0x000048      byte            0x0C            (string)
+>0x000048      byte            0x0D            (graphic data base)
+>0x000048      byte            0x0E            (figure)
+>0x000048      byte            0x10            (picture)
+>0x000048      byte            0x12            (program)
+>0x000048      byte            0x13            (function)
+>0x000048      byte            0x14            (macro)
+>0x000048      byte            0x1C            (zipped)
+>0x000048      byte            0x21            (assembler)
+#
+# Magic Numbers for the TI-73/83+/89/92+/V200 FLASH upgrades
+#
+0x0000016      string          Advanced        TI-XX Graphing Calculator (FLASH)
+0              string          **TIFL**        TI-XX Graphing Calculator (FLASH)
+>8             byte            >0              - Revision %d
+>>9            byte            x               \b.%d,
+>12            byte            >0              Revision date %02x
+>>13           byte            x               \b/%02x
+>>14           beshort         x               \b/%04x,
+>17            string          >/0             name: '%s',
+>48            byte            0x74            device: TI-73,
+>48            byte            0x73            device: TI-83+,
+>48            byte            0x98            device: TI-89,
+>48            byte            0x88            device: TI-92+,
+>49            byte            0x23            type: OS upgrade,
+>49            byte            0x24            type: application,
+>49            byte            0x25            type: certificate,
+>49            byte            0x3e            type: license,
+>74            lelong          >0              size: %ld bytes
+
+# VTi & TiEmu skins (TI Graphing Calculators).
+# From: Romain Lievin (roms@lpg.ticalc.org).
+# Magic Numbers for the VTi skins
+0               string          VTI            Virtual TI skin
+>3             string          v               - Version
+>>4            byte            >0              \b %c
+>>6            byte            x               \b.%c
+# Magic Numbers for the TiEmu skins
+0              string          TiEmu           TiEmu skin
+>6              string          v               - Version
+>>7             byte            >0              \b %c
+>>9             byte            x               \b.%c
+>>10           byte            x               \b%c
+
+#------------------------------------------------------------------------------
+# c-lang:  file(1) magic for C programs (or REXX)
+#
+
+# XPM icons (Greg Roelofs, newt@uchicago.edu)
+# if you uncomment "/*" for C/REXX below, also uncomment this entry
+#0     string          /*\ XPM\ */     X pixmap image data
+
+# this first will upset you if you're a PL/1 shop...
+# in which case rm it; ascmagic will catch real C programs
+#0     string          /*              C or REXX program text
+#0     string          //              C++ program text
+
+# From: Mikhail Teterin <mi@aldan.algebra.com> 
+0      string          cscope          cscope reference data
+>7     string          x               version %.2s
+# We skip the path here, because it is often long (so file will
+# truncate it) and mostly redundant.
+# The inverted index functionality was added some time betwen
+# versions 11 and 15, so look for -q if version is above 14:
+>7     string          >14
+>>10   regex           .+\ -q\         with inverted index
+>10    regex           .+\ -c\         text (non-compressed)
+#  Digital UNIX - Info
+#
+0      string  !<arch>\n________64E    Alpha archive
+>22    string  X                       -- out of date
+#
+# Alpha COFF Based Executables
+# The stripped stuff really needs to be an 8 byte (64 bit) compare,
+# but this works
+0      leshort         0x183           COFF format alpha
+>22    leshort&020000  &010000         sharable library,
+>22    leshort&020000  ^010000         dynamically linked,
+>24    leshort         0410            pure
+>24    leshort         0413            demand paged
+>8     lelong          >0              executable or object module, not stripped
+>8     lelong          0
+>>12   lelong          0               executable or object module, stripped
+>>12   lelong          >0              executable or object module, not stripped
+>27     byte            >0              - version %d.
+>26     byte            >0              %d-
+>28     leshort         >0              %d
+#
+# The next is incomplete, we could tell more about this format,
+# but its not worth it.
+0      leshort         0x188   Alpha compressed COFF
+0      leshort         0x18f   Alpha u-code object
+#
+#
+# Some other interesting Digital formats,
+0      string  \377\377\177            ddis/ddif
+0      string  \377\377\174            ddis/dots archive
+0      string  \377\377\176            ddis/dtif table data
+0      string  \033c\033               LN03 output
+0      long    04553207                X image
+#
+0      string  !<PDF>!\n               profiling data file
+#
+# Locale data tables (MIPS and Alpha).
+#
+0      short           0x0501          locale data table
+>6     short           0x24            for MIPS
+>6     short           0x40            for Alpha
+# ATSC A/53 aka AC-3 aka Dolby Digital <ashitaka@gmx.at>
+# from http://www.atsc.org/standards/a_52a.pdf
+# corrections, additions, etc. are always welcome!
+#
+# syncword
+0       beshort         0x0b77  ATSC A/52 aka AC-3 aka Dolby Digital stream,
+# fscod
+>4      byte&0xc0       0x00    48 kHz,
+>4      byte&0xc0       0x40    44.1 kHz,
+>4      byte&0xc0       0x80    32 kHz,
+# is this one used for 96 kHz?
+>4      byte&0xc0       0xc0    reserved frequency,
+#
+>5     byte&7 = 0              \b, complete main (CM)
+>5     byte&7 = 1              \b, music and effects (ME)
+>5     byte&7 = 2              \b, visually impaired (VI)
+>5     byte&7 = 3              \b, hearing impaired (HI)
+>5     byte&7 = 4              \b, dialogue (D)
+>5     byte&7 = 5              \b, commentary (C)
+>5     byte&7 = 6              \b, emergency (E)
+# acmod
+>6      byte&0xe0       0x00    1+1 front,
+>6      byte&0xe0       0x20    1 front/0 rear,
+>6      byte&0xe0       0x40    2 front/0 rear,
+>6      byte&0xe0       0x60    3 front/0 rear,
+>6      byte&0xe0       0x80    2 front/1 rear,
+>6      byte&0xe0       0xa0    3 front/1 rear,
+>6      byte&0xe0       0xc0    2 front/2 rear,
+>6      byte&0xe0       0xe0    3 front/2 rear,
+# lfeon (these may be incorrect)
+>7      byte&0x40       0x00    LFE off,
+>7      byte&0x40       0x40    LFE on,
+#
+>4     byte&0x3e = 0x00        \b, 32 kbit/s
+>4     byte&0x3e = 0x02        \b, 40 kbit/s
+>4     byte&0x3e = 0x04        \b, 48 kbit/s
+>4     byte&0x3e = 0x06        \b, 56 kbit/s
+>4     byte&0x3e = 0x08        \b, 64 kbit/s
+>4     byte&0x3e = 0x0a        \b, 80 kbit/s
+>4     byte&0x3e = 0x0c        \b, 96 kbit/s
+>4     byte&0x3e = 0x0e        \b, 112 kbit/s
+>4     byte&0x3e = 0x10        \b, 128 kbit/s
+>4     byte&0x3e = 0x12        \b, 160 kbit/s
+>4     byte&0x3e = 0x14        \b, 192 kbit/s
+>4     byte&0x3e = 0x16        \b, 224 kbit/s
+>4     byte&0x3e = 0x18        \b, 256 kbit/s
+>4     byte&0x3e = 0x1a        \b, 320 kbit/s
+>4     byte&0x3e = 0x1c        \b, 384 kbit/s
+>4     byte&0x3e = 0x1e        \b, 448 kbit/s
+>4     byte&0x3e = 0x20        \b, 512 kbit/s
+>4     byte&0x3e = 0x22        \b, 576 kbit/s
+>4     byte&0x3e = 0x24        \b, 640 kbit/s
+# dsurmod (these may be incorrect)
+>6      beshort&0x0180  0x0000  Dolby Surround not indicated
+>6      beshort&0x0180  0x0080  not Dolby Surround encoded
+>6      beshort&0x0180  0x0100  Dolby Surround encoded
+>6      beshort&0x0180  0x0180  reserved Dolby Surround mode
+
+#------------------------------------------------------------------------------
+# ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
+#
+# ACE/gr binary
+0      string  \000\000\0001\000\000\0000\000\000\0000\000\000\0002\000\000\0000\000\000\0000\000\000\0003             old ACE/gr binary file
+>39    byte    >0                      - version %c
+# ACE/gr ascii
+0      string  #\ xvgr\ parameter\ file        ACE/gr ascii file
+0      string  #\ xmgr\ parameter\ file        ACE/gr ascii file
+0      string  #\ ACE/gr\ parameter\ file      ACE/gr ascii file
+# Grace projects
+0      string  #\ Grace\ project\ file         Grace project file
+>23    string  @version\                       (version
+>>32   byte    >0                              %c
+>>33   string  >\0                             \b.%.2s
+>>35   string  >\0                             \b.%.2s)
+# ACE/gr fit description files
+0      string  #\ ACE/gr\ fit\ description\    ACE/gr fit description file
+# end of ACE/gr and Grace type files - PLEASE DO NOT REMOVE THIS LINE
+
+#------------------------------------------------------------------------------
+# ibm370:  file(1) magic for IBM 370 and compatibles.
+#
+# "ibm370" said that 0x15d == 0535 was "ibm 370 pure executable".
+# What the heck *is* "USS/370"?
+# AIX 4.1's "/etc/magic" has
+#
+#      0       short           0535            370 sysV executable 
+#      >12     long            >0              not stripped
+#      >22     short           >0              - version %d
+#      >30     long            >0              - 5.2 format
+#      0       short           0530            370 sysV pure executable 
+#      >12     long            >0              not stripped
+#      >22     short           >0              - version %d
+#      >30     long            >0              - 5.2 format
+#
+# instead of the "USS/370" versions of the same magic numbers.
+#
+0      beshort         0537            370 XA sysV executable 
+>12    belong          >0              not stripped
+>22    beshort         >0              - version %d
+>30    belong          >0              - 5.2 format
+0      beshort         0532            370 XA sysV pure executable 
+>12    belong          >0              not stripped
+>22    beshort         >0              - version %d
+>30    belong          >0              - 5.2 format
+0      beshort         054001          370 sysV pure executable
+>12    belong          >0              not stripped
+0      beshort         055001          370 XA sysV pure executable
+>12    belong          >0              not stripped
+0      beshort         056401          370 sysV executable
+>12    belong          >0              not stripped
+0      beshort         057401          370 XA sysV executable
+>12    belong          >0              not stripped
+0       beshort                0531            SVR2 executable (Amdahl-UTS)
+>12    belong          >0              not stripped
+>24     belong         >0              - version %ld
+0      beshort         0534            SVR2 pure executable (Amdahl-UTS)
+>12    belong          >0              not stripped
+>24    belong          >0              - version %ld
+0      beshort         0530            SVR2 pure executable (USS/370)
+>12    belong          >0              not stripped
+>24    belong          >0              - version %ld
+0      beshort         0535            SVR2 executable (USS/370)
+>12    belong          >0              not stripped
+>24    belong          >0              - version %ld
+
+#------------------------------------------------------------------------------
+# images:  file(1) magic for image formats (see also "iff")
+#
+# originally from jef@helios.ee.lbl.gov (Jef Poskanzer),
+# additions by janl@ifi.uio.no as well as others. Jan also suggested
+# merging several one- and two-line files into here.
+#
+# little magic: PCX (first byte is 0x0a)
+
+# Targa - matches `povray', `ppmtotga' and `xv' outputs
+# by Philippe De Muyter <phdm@macqel.be>
+# at 2, byte ImgType must be 1, 2, 3, 9, 10 or 11
+# at 1, byte CoMapType must be 1 if ImgType is 1 or 9, 0 otherwise
+# at 3, leshort Index is 0 for povray, ppmtotga and xv outputs
+# `xv' recognizes only a subset of the following (RGB with pixelsize = 24)
+# `tgatoppm' recognizes a superset (Index may be anything)
+1      belong&0xfff7ffff       0x01010000      Targa image data - Map
+>2     byte&8                  8               - RLE
+>12    leshort                 >0              %hd x
+>14    leshort                 >0              %hd
+1      belong&0xfff7ffff       0x00020000      Targa image data - RGB
+>2     byte&8                  8               - RLE
+>12    leshort                 >0              %hd x
+>14    leshort                 >0              %hd
+1      belong&0xfff7ffff       0x00030000      Targa image data - Mono
+>2     byte&8                  8               - RLE
+>12    leshort                 >0              %hd x
+>14    leshort                 >0              %hd
+
+# PBMPLUS images
+# The next byte following the magic is always whitespace.
+0      string          P1              Netpbm PBM image text
+0      string          P2              Netpbm PGM image text
+0      string          P3              Netpbm PPM image text
+0      string          P4              Netpbm PBM "rawbits" image data
+0      string          P5              Netpbm PGM "rawbits" image data
+0      string          P6              Netpbm PPM "rawbits" image data
+0      string          P7              Netpbm PAM image file
+
+# From: bryanh@giraffe-data.com (Bryan Henderson)
+0      string          \117\072        Solitaire Image Recorder format
+>4     string          \013            MGI Type 11
+>4     string          \021            MGI Type 17
+0      string          .MDA            MicroDesign data
+>21    byte            48              version 2
+>21    byte            51              version 3
+0      string          .MDP            MicroDesign page data
+>21    byte            48              version 2
+>21    byte            51              version 3
+
+# NIFF (Navy Interchange File Format, a modification of TIFF) images
+0      string          IIN1            NIFF image data
+
+# Tag Image File Format, from Daniel Quinlan (quinlan@yggdrasil.com)
+# The second word of TIFF files is the TIFF version number, 42, which has
+# never changed.  The TIFF specification recommends testing for it.
+0      string          MM\x00\x2a      TIFF image data, big-endian
+0      string          II\x2a\x00      TIFF image data, little-endian
+
+# PNG [Portable Network Graphics, or "PNG's Not GIF"] images
+# (Greg Roelofs, newt@uchicago.edu)
+# (Albert Cahalan, acahalan@cs.uml.edu)
+#
+# 137 P N G \r \n ^Z \n [4-byte length] H E A D [HEAD data] [HEAD crc] ...
+#
+0      string          \x89PNG         PNG image data,
+>4     belong          !0x0d0a1a0a     CORRUPTED,
+>4     belong          0x0d0a1a0a
+>>16   belong          x               %ld x
+>>20   belong          x               %ld,
+>>24   byte            x               %d-bit
+>>25   byte            0               grayscale,
+>>25   byte            2               \b/color RGB,
+>>25   byte            3               colormap,
+>>25   byte            4               gray+alpha,
+>>25   byte            6               \b/color RGBA,
+#>>26  byte            0               deflate/32K,
+>>28   byte            0               non-interlaced
+>>28   byte            1               interlaced
+1      string          PNG             PNG image data, CORRUPTED
+
+# GIF
+0      string          GIF8            GIF image data
+>4     string          7a              \b, version 8%s,
+>4     string          9a              \b, version 8%s,
+>6     leshort         >0              %hd x
+>8     leshort         >0              %hd
+#>10   byte            &0x80           color mapped,
+#>10   byte&0x07       =0x00           2 colors
+#>10   byte&0x07       =0x01           4 colors
+#>10   byte&0x07       =0x02           8 colors
+#>10   byte&0x07       =0x03           16 colors
+#>10   byte&0x07       =0x04           32 colors
+#>10   byte&0x07       =0x05           64 colors
+#>10   byte&0x07       =0x06           128 colors
+#>10   byte&0x07       =0x07           256 colors
+
+# ITC (CMU WM) raster files.  It is essentially a byte-reversed Sun raster,
+# 1 plane, no encoding.
+0      string          \361\0\100\273  CMU window manager raster image data
+>4     lelong          >0              %d x
+>8     lelong          >0              %d,
+>12    lelong          >0              %d-bit
+
+# Magick Image File Format
+0      string          id=ImageMagick  MIFF image data
+
+# Artisan
+0      long            1123028772      Artisan image data
+>4     long            1               \b, rectangular 24-bit
+>4     long            2               \b, rectangular 8-bit with colormap
+>4     long            3               \b, rectangular 32-bit (24-bit with matte)
+
+# FIG (Facility for Interactive Generation of figures), an object-based format
+0      string          #FIG            FIG image text
+>5     string          x               \b, version %.3s
+
+# PHIGS
+0      string          ARF_BEGARF              PHIGS clear text archive
+0      string          @(#)SunPHIGS            SunPHIGS
+# version number follows, in the form m.n
+>40    string          SunBin                  binary
+>32    string          archive                 archive
+
+# GKS (Graphics Kernel System)
+0      string          GKSM            GKS Metafile
+>24    string          SunGKS          \b, SunGKS
+
+# CGM image files
+0      string          BEGMF           clear text Computer Graphics Metafile
+# XXX - questionable magic
+0      beshort&0xffe0  0x0020          binary Computer Graphics Metafile
+0      beshort         0x3020          character Computer Graphics Metafile
+
+# MGR bitmaps  (Michael Haardt, u31b3hs@pool.informatik.rwth-aachen.de)
+0      string  yz      MGR bitmap, modern format, 8-bit aligned
+0      string  zz      MGR bitmap, old format, 1-bit deep, 16-bit aligned
+0      string  xz      MGR bitmap, old format, 1-bit deep, 32-bit aligned
+0      string  yx      MGR bitmap, modern format, squeezed
+
+# Fuzzy Bitmap (FBM) images
+0      string          %bitmap\0       FBM image data
+>30    long            0x31            \b, mono
+>30    long            0x33            \b, color
+
+# facsimile data
+1      string          PC\ Research,\ Inc      group 3 fax data
+>29    byte            0               \b, normal resolution (204x98 DPI)
+>29    byte            1               \b, fine resolution (204x196 DPI)
+# From: Herbert Rosmanith <herp@wildsau.idv.uni.linz.at>
+0      string          Sfff            structured fax file
+
+
+# PC bitmaps (OS/2, Windoze BMP files)  (Greg Roelofs, newt@uchicago.edu)
+0      string          BM              PC bitmap data
+>14    leshort         12              \b, OS/2 1.x format
+>>18   leshort         x               \b, %d x
+>>20   leshort         x               %d
+>14    leshort         64              \b, OS/2 2.x format
+>>18   leshort         x               \b, %d x
+>>20   leshort         x               %d
+>14    leshort         40              \b, Windows 3.x format
+>>18   lelong          x               \b, %d x
+>>22   lelong          x               %d x
+>>28   leshort         x               %d
+# Too simple - MPi
+#0     string          IC              PC icon data
+#0     string          PI              PC pointer image data
+#0     string          CI              PC color icon data
+#0     string          CP              PC color pointer image data
+# Conflicts with other entries [BABYL]
+#0     string          BA              PC bitmap array data
+
+# XPM icons (Greg Roelofs, newt@uchicago.edu)
+# note possible collision with C/REXX entry in c-lang; currently commented out
+0      string          /*\ XPM\ */     X pixmap image text
+
+# Utah Raster Toolkit RLE images (janl@ifi.uio.no)
+0      leshort         0xcc52          RLE image data,
+>6     leshort         x               %d x
+>8     leshort         x               %d
+>2     leshort         >0              \b, lower left corner: %d
+>4     leshort         >0              \b, lower right corner: %d
+>10    byte&0x1        =0x1            \b, clear first
+>10    byte&0x2        =0x2            \b, no background
+>10    byte&0x4        =0x4            \b, alpha channel
+>10    byte&0x8        =0x8            \b, comment
+>11    byte            >0              \b, %d color channels
+>12    byte            >0              \b, %d bits per pixel
+>13    byte            >0              \b, %d color map channels
+
+# image file format (Robert Potter, potter@cs.rochester.edu)
+0      string          Imagefile\ version-     iff image data
+# this adds the whole header (inc. version number), informative but longish
+>10    string          >\0             %s
+
+# Sun raster images, from Daniel Quinlan (quinlan@yggdrasil.com)
+0      belong          0x59a66a95      Sun raster image data
+>4     belong          >0              \b, %d x
+>8     belong          >0              %d,
+>12    belong          >0              %d-bit,
+#>16   belong          >0              %d bytes long,
+>20    belong          0               old format,
+#>20   belong          1               standard,
+>20    belong          2               compressed,
+>20    belong          3               RGB,
+>20    belong          4               TIFF,
+>20    belong          5               IFF,
+>20    belong          0xffff          reserved for testing,
+>24    belong          0               no colormap
+>24    belong          1               RGB colormap
+>24    belong          2               raw colormap
+#>28   belong          >0              colormap is %d bytes long
+
+# SGI image file format, from Daniel Quinlan (quinlan@yggdrasil.com)
+#
+# See
+#      http://reality.sgi.com/grafica/sgiimage.html
+#
+0      beshort         474             SGI image data
+#>2    byte            0               \b, verbatim
+>2     byte            1               \b, RLE
+#>3    byte            1               \b, normal precision
+>3     byte            2               \b, high precision
+>4     beshort         x               \b, %d-D
+>6     beshort         x               \b, %d x
+>8     beshort         x               %d
+>10    beshort         x               \b, %d channel
+>10    beshort         !1              \bs
+>80    string          >0              \b, "%s"
+
+0      string          IT01            FIT image data
+>4     belong          x               \b, %d x
+>8     belong          x               %d x
+>12    belong          x               %d
+#
+0      string          IT02            FIT image data
+>4     belong          x               \b, %d x
+>8     belong          x               %d x
+>12    belong          x               %d
+#
+2048   string          PCD_IPI         Kodak Photo CD image pack file
+>0xe02 byte&0x03       0x00            , landscape mode
+>0xe02 byte&0x03       0x01            , portrait mode
+>0xe02 byte&0x03       0x02            , landscape mode
+>0xe02 byte&0x03       0x03            , portrait mode
+0      string          PCD_OPA         Kodak Photo CD overview pack file
+
+# FITS format.  Jeff Uphoff <juphoff@tarsier.cv.nrao.edu>
+# FITS is the Flexible Image Transport System, the de facto standard for
+# data and image transfer, storage, etc., for the astronomical community.
+# (FITS floating point formats are big-endian.)
+0      string  SIMPLE\ \ =     FITS image data
+>109   string  8               \b, 8-bit, character or unsigned binary integer
+>108   string  16              \b, 16-bit, two's complement binary integer
+>107   string  \ 32            \b, 32-bit, two's complement binary integer
+>107   string  -32             \b, 32-bit, floating point, single precision
+>107   string  -64             \b, 64-bit, floating point, double precision
+
+# other images
+0      string  This\ is\ a\ BitMap\ file       Lisp Machine bit-array-file
+0      string          !!              Bennet Yee's "face" format
+
+# From SunOS 5.5.1 "/etc/magic" - appeared right before Sun raster image
+# stuff.
+#
+0      beshort         0x1010          PEX Binary Archive
+
+# Visio drawings
+03000  string  Visio\ (TM)\ Drawing    %s
+
+# Tgif files
+0      string  \%TGIF\ x               Tgif file version %s
+
+# DICOM medical imaging data
+128    string  DICM                    DICOM medical imaging data
+
+# XWD - X Window Dump file.
+#   As described in /usr/X11R6/include/X11/XWDFile.h
+#   used by the xwd program.
+#   Bradford Castalia, idaeim, 1/01
+4      belong  7                       XWD X Window Dump image data
+>100   string  >\0                     \b, "%s"
+>16    belong  x                       \b, %dx
+>20    belong  x                       \b%dx
+>12    belong  x                       \b%d
+
+# PDS - Planetary Data System
+#   These files use Parameter Value Language in the header section.
+#   Unfortunately, there is no certain magic, but the following
+#   strings have been found to be most likely.
+0      string  NJPL1I00                PDS (JPL) image data
+2      string  NJPL1I                  PDS (JPL) image data
+0      string  CCSD3ZF                 PDS (CCSD) image data
+2      string  CCSD3Z                  PDS (CCSD) image data
+0      string  PDS_                    PDS image data
+0      string  LBLSIZE=                PDS (VICAR) image data
+
+# pM8x: ATARI STAD compressed bitmap format
+#
+# from Oskar Schirmer <schirmer@scara.com> Feb 2, 2001
+# p M 8 5/6 xx yy zz data...
+# Atari ST STAD bitmap is always 640x400, bytewise runlength compressed.
+# bytes either run horizontally (pM85) or vertically (pM86). yy is the
+# most frequent byte, xx and zz are runlength escape codes, where xx is
+# used for runs of yy.
+#
+0      string  pM85            Atari ST STAD bitmap image data (hor)
+>5     byte    0x00            (white background)
+>5     byte    0xFF            (black background)
+0      string  pM86            Atari ST STAD bitmap image data (vert)
+>5     byte    0x00            (white background)
+>5     byte    0xFF            (black background)
+
+# XXX:
+# This is bad magic 0x5249 == 'RI' conflicts with RIFF and other
+# magic.
+# SGI RICE image file <mpruett@sgi.com>
+#0     beshort 0x5249          RICE image
+#>2    beshort x               v%d
+#>4    beshort x               (%d x
+#>6    beshort x               %d)
+#>8    beshort 0               8 bit
+#>8    beshort 1               10 bit
+#>8    beshort 2               12 bit
+#>8    beshort 3               13 bit
+#>10   beshort 0               4:2:2
+#>10   beshort 1               4:2:2:4
+#>10   beshort 2               4:4:4
+#>10   beshort 3               4:4:4:4
+#>12   beshort 1               RGB
+#>12   beshort 2               CCIR601
+#>12   beshort 3               RP175
+#>12   beshort 4               YUV
+
+#------------------------------------------------------------------------------
+#
+# Marco Schmidt (marcoschmidt@users.sourceforge.net) -- an image  file format
+# for the EPOC operating system, which is used with PDAs like those from Psion
+#
+# see http://huizen.dds.nl/~frodol/psiconv/html/Index.html for a description
+# of various EPOC file formats
+
+0      string \x37\x00\x00\x10\x42\x00\x00\x10\x00\x00\x00\x00\x39\x64\x39\x47 EPOC MBM image file
+
+# PCX image files
+# From: Dan Fandrich <dan@coneharvesters.com>
+0      beshort         0x0a00  PCX ver. 2.5 image data
+0      beshort         0x0a02  PCX ver. 2.8 image data, with palette
+0      beshort         0x0a03  PCX ver. 2.8 image data, without palette
+0      beshort         0x0a04  PCX for Windows image data
+0      beshort         0x0a05  PCX ver. 3.0 image data
+>4     leshort         x      bounding box [%hd,
+>6     leshort         x      %hd] -
+>8     leshort         x      [%hd,
+>10    leshort         x      %hd],
+>65    byte            >1      %d planes each of
+>3     byte            x       %hhd-bit
+>68    byte            0       image,
+>68    byte            1       colour,
+>68    byte            2       grayscale,
+>68    byte            >2      image,
+>68    byte            <0      image,
+>12    leshort         >0      %hd x
+>>14   leshort         x      %hd dpi,
+>2     byte            0       uncompressed
+>2     byte            1       RLE compressed
+
+# Adobe Photoshop
+0      string          8BPS Adobe Photoshop Image
+
+# XV thumbnail indicator (ThMO)
+0      string          P7\ 332         XV thumbnail image data
+
+# NITF is defined by United States MIL-STD-2500A
+0      string  NITF    National Imagery Transmission Format
+>25    string  >\0     dated %.14s
+
+# GEM Image: Version 1, Headerlen 8 (Wolfram Kleff)
+0      belong          0x00010008      GEM Image data
+>12    beshort         x               %d x
+>14    beshort         x               %d,
+>4     beshort         x               %d planes,
+>8     beshort         x               %d x
+>10    beshort         x               %d pixelsize
+
+# GEM Metafile (Wolfram Kleff)
+0      lelong          0x0018FFFF      GEM Metafile data
+>4     leshort         x               version %d
+
+#
+# SMJPEG. A custom Motion JPEG format used by Loki Entertainment
+# Software Torbjorn Andersson <d91tan@Update.UU.SE>.
+#
+0      string  \0\nSMJPEG      SMJPEG
+>8     belong  x               %d.x data
+# According to the specification you could find any number of _TXT
+# headers here, but I can't think of any way of handling that. None of
+# the SMJPEG files I tried it on used this feature. Even if such a
+# file is encountered the output should still be reasonable.
+>16    string  _SND            \b,
+>>24   beshort >0              %d Hz
+>>26   byte    8               8-bit
+>>26   byte    16              16-bit
+>>28   string  NONE            uncompressed
+# >>28 string  APCM            ADPCM compressed
+>>27   byte    1               mono
+>>28   byte    2               stereo
+# Help! Isn't there any way to avoid writing this part twice?
+>>32   string  _VID            \b,
+# >>>48        string  JFIF            JPEG
+>>>40  belong  >0              %d frames
+>>>44  beshort >0              (%d x
+>>>46  beshort >0              %d)
+>16    string  _VID            \b,
+# >>32 string  JFIF            JPEG
+>>24   belong  >0              %d frames
+>>28   beshort >0              (%d x
+>>30   beshort >0              %d)
+
+0      string  Paint\ Shop\ Pro\ Image\ File   Paint Shop Pro Image File
+
+# "thumbnail file" (icon)
+# descended from "xv", but in use by other applications as well (Wolfram Kleff)
+0       string          P7\ 332         XV "thumbnail file" (icon) data
+
+# taken from fkiss: (<yav@mte.biglobe.ne.jp> ?)
+0       string          KiSS            KISS/GS
+>4      byte            16              color
+>>5     byte            x               %d bit
+>>8     leshort         x               %d colors
+>>10    leshort         x               %d groups
+>4      byte            32              cell
+>>5     byte            x               %d bit
+>>8     leshort         x               %d x
+>>10    leshort         x               %d
+>>12    leshort         x               +%d
+>>14    leshort         x               +%d
+
+# Webshots (www.webshots.com), by John Harrison
+0       string          C\253\221g\230\0\0\0 Webshots Desktop .wbz file
+
+# Hercules DASD image files
+# From Jan Jaeger <jj@septa.nl>
+0       string  CKD_P370        Hercules CKD DASD image file
+>8      long    x               \b, %d heads per cylinder
+>12     long    x               \b, track size %d bytes
+>16     byte    x               \b, device type 33%2.2X
+
+0       string  CKD_C370        Hercules compressed CKD DASD image file
+>8      long    x               \b, %d heads per cylinder
+>12     long    x               \b, track size %d bytes
+>16     byte    x               \b, device type 33%2.2X
+
+0       string  CKD_S370        Hercules CKD DASD shadow file
+>8      long    x               \b, %d heads per cylinder
+>12     long    x               \b, track size %d bytes
+>16     byte    x               \b, device type 33%2.2X
+
+# Squeak images and - etoffi@softhome.net
+0 string \146\031\0\0  Squeak image data
+0 string 'From\040Squeak  Squeak program text
+
+# partimage: file(1) magic for PartImage files (experimental, incomplete)
+# Author: Hans-Joachim Baader <hjb@pro-linux.de>
+0              string  PaRtImAgE-VoLuMe        PartImage
+>0x0020                string  0.6.1           file version %s
+>>0x0060       lelong  >-1             volume %ld
+#>>0x0064 8 byte identifier
+#>>0x007c reserved
+>>0x0200       string  >\0             type %s
+>>0x1400       string  >\0             device %s,
+>>0x1600       string  >\0             original filename %s,
+# Some fields omitted
+>>0x2744       lelong  0               not compressed
+>>0x2744       lelong  1               gzip compressed
+>>0x2744       lelong  2               bzip2 compressed
+>>0x2744       lelong  >2              compressed with unknown algorithm
+>0x0020                string  >0.6.1          file version %s
+>0x0020                string  <0.6.1          file version %s
+
+# DCX is multi-page PCX, using a simple header of up to 1024
+# offsets for the respective PCX components.
+# From: Joerg Wunsch <joerg_wunsch@uriah.heep.sax.de>
+0      lelong  987654321       DCX multi-page PCX image data
+
+# Simon Walton <simonw@matteworld.com>
+# Kodak Cineon format for scanned negatives
+# http://www.kodak.com/US/en/motion/support/dlad/
+0      lelong  0xd75f2a80      Cineon image data
+>200   belong  >0              \b, %ld x
+>204   belong  >0              %ld
+
+
+# Bio-Rad .PIC is an image format used by microscope control systems
+# and related image processing software used by biologists.
+# From: Vebjorn Ljosa <vebjorn@ljosa.com>
+54     leshort 12345           Bio-Rad .PIC Image File
+>0     leshort >0              %hd x
+>2     leshort >0              %hd,
+>4     leshort =1              1 image in file
+>4     leshort >1              %hd images in file
+
+# From Jan "Yenya" Kasprzak <kas@fi.muni.cz>
+# The description of *.mrw format can be found at
+# http://www.dalibor.cz/minolta/raw_file_format.htm
+0      string  \000MRM                 Minolta Dimage camera raw image data
+
+# From: stephane.loeuillet@tiscali.f
+# http://www.djvuzone.org/
+0      string  AT&TFORM                DjVu Image file
+
+# From: Jason Bacon <bacon@smithers.neuro.mcw.edu>
+0      beshort 0x3020                  character Computer Graphics Metafile
+
+
+
+# From: Tom Hilinski <tom.hilinski@comcast.net>
+# http://www.unidata.ucar.edu/packages/netcdf/
+0      string  CDF\001                 netcdf file
+#
+#------------------------------------------------------------------------------
+# tuxedo:      file(1) magic for BEA TUXEDO data files
+#
+# from Ian Springer <ispringer@hotmail.com>
+#
+0      string          \0\0\1\236\0\0\0\0\0\0\0\0\0\0\0\0      BEA TUXEDO DES mask data
+
+#------------------------------------------------------------------------------
+# timezone:  file(1) magic for timezone data
+#
+# from Daniel Quinlan (quinlan@yggdrasil.com)
+# this should work on Linux, SunOS, and maybe others
+# Added new official magic number for recent versions of the Olson code
+0      string  TZif    timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0      old timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0      old timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0      old timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0      old timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0      old timezone data
+0      string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0      old timezone data
+
+#------------------------------------------------------------------------------
+# project:  file(1) magic for Project management
+# 
+# Magic strings for ftnchek project files. Alexander Mai
+0      string  FTNCHEK_\ P     project file for ftnchek
+>10    string  1               version 2.7
+>10    string  2               version 2.8 to 2.10
+>10    string  3               version 2.11 or later
+#------------------------------------------------------------------------------
+# cisco:  file(1) magic for cisco Systems routers
+#
+# Most cisco file-formats are covered by the generic elf code
+#
+# Microcode files are non-ELF, 0x8501 conflicts with NetBSD/alpha.
+0      belong&0xffffff00       0x85011400  cisco IOS microcode
+>7     string          >\0                 for '%s'
+0      belong&0xffffff00       0x8501cb00  cisco IOS experimental microcode
+>7     string          >\0                 for '%s'
+#------------------------------------------------------------------------------
+# mach file description
+#
+0      belong          0xcafebabe      Mach-O fat file
+>4     belong          1               with 1 architecture
+>4     belong          >1
+>>4    belong          x               with %ld architectures          
+#
+0      belong          0xfeedface      Mach-O
+>12    belong          1               object
+>12    belong          2               executable
+>12    belong          3               shared library
+>12    belong          4               core
+>12    belong          5               preload executable
+>12    belong          6               dynamically linked shared library
+>12    belong          7               dynamic linker
+>12    belong          8               bundle
+>12    belong          >8
+>>12   belong          x               filetype=%ld
+>4     belong          <0
+>>4    belong          x               architecture=%ld
+>4     belong          1               vax
+>4     belong          2               romp
+>4     belong          3               architecture=3
+>4     belong          4               ns32032
+>4     belong          5               ns32332
+>4     belong          6               for m68k architecture
+# from NeXTstep 3.0 <mach/machine.h>
+# i.e. mc680x0_all, ignore
+# >>8  belong          1               (mc68030)
+>>8    belong          2               (mc68040)
+>>8    belong          3               (mc68030 only)
+>4     belong          7               i386
+>4     belong          8               mips
+>4     belong          9               ns32532
+>4     belong          10              architecture=10
+>4     belong          11              hp pa-risc
+>4     belong          12              acorn
+>4     belong          13              m88k
+>4     belong          14              sparc
+>4     belong          15              i860-big
+>4     belong          16              i860
+>4     belong          17              rs6000
+>4     belong          18              ppc
+>4     belong          >18
+>>4    belong          x               architecture=%ld
+
+#------------------------------------------------------------------------------
+# mkid:  file(1) magic for mkid(1) databases
+#
+# ID is the binary tags database produced by mkid(1).
+#
+# XXX - byte order?
+#
+0      string          \311\304        ID tags data
+>2     short           >0              version %d
+
+#------------------------------------------------------------------------------
+# pgp:  file(1) magic for Pretty Good Privacy
+#
+0       beshort         0x9900                  PGP key public ring
+0       beshort         0x9501                  PGP key security ring
+0       beshort         0x9500                  PGP key security ring
+0      beshort         0xa600                  PGP encrypted data
+0       string          -----BEGIN\040PGP       PGP armored data
+>15     string          PUBLIC\040KEY\040BLOCK- public key block
+>15     string          MESSAGE-                message
+>15     string          SIGNED\040MESSAGE-      signed message
+>15     string          PGP\040SIGNATURE-       signature
+
+#------------------------------------------------------------------------------
+# terminfo:  file(1) magic for terminfo
+#
+# XXX - byte order for screen images?
+#
+0      string          \032\001        Compiled terminfo entry
+0      short           0433            Curses screen image
+0      short           0434            Curses screen image
+
+#------------------------------------------------------------------------------
+# printer:  file(1) magic for printer-formatted files
+#
+
+# PostScript, updated by Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          %!              PostScript document text
+>2     string          PS-Adobe-       conforming
+>>11   string          >\0             at level %.3s
+>>>15  string          EPS             - type %s
+>>>15  string          Query           - type %s
+>>>15  string          ExitServer      - type %s
+# Some PCs have the annoying habit of adding a ^D as a document separator
+0      string          \004%!          PostScript document text
+>3     string          PS-Adobe-       conforming
+>>12   string          >\0             at level %.3s
+>>>16  string          EPS             - type %s
+>>>16  string          Query           - type %s
+>>>16  string          ExitServer      - type %s
+0      string          \033%-12345X%!PS        PostScript document
+
+
+# DOS EPS Binary File Header
+# From: Ed Sznyter <ews@Black.Market.NET>
+0       belong          0xC5D0D3C6      DOS EPS Binary File
+>4      long            >0              Postscript starts at byte %d
+>>8     long            >0              length %d
+>>>12   long            >0              Metafile starts at byte %d
+>>>>16  long            >0              length %d
+>>>20   long            >0              TIFF starts at byte %d
+>>>>24  long            >0              length %d
+
+# Adobe's PostScript Printer Description (PPD) files
+#       Yves Arrouye <arrouye@marin.fdn.fr>
+#
+0      string          *PPD-Adobe:    PPD file
+>13    string          x              \b, ve
+
+# HP Printer Job Language
+0      string          \033%-12345X@PJL        HP Printer Job Language data
+# HP Printer Job Language
+# The header found on Win95 HP plot files is the "Silliest Thing possible" 
+# (TM)
+# Every driver puts the language at some random position, with random case
+# (LANGUAGE and Language)
+# For example the LaserJet 5L driver puts the "PJL ENTER LANGUAGE" in line 10
+# From: Uwe Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>
+# 
+0      string          \033%-12345X@PJL        HP Printer Job Language data
+>&0    string          >\0                     %s                      
+>>&0   string          >\0                     %s                      
+>>>&0  string          >\0                     %s              
+>>>>&0 string          >\0                     %s              
+#>15   string          \ ENTER\ LANGUAGE\ =
+#>31   string          PostScript              PostScript
+
+# HP Printer Control Language, Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          \033E\033       HP PCL printer data
+>3     string          \&l0A           - default page size
+>3     string          \&l1A           - US executive page size
+>3     string          \&l2A           - US letter page size
+>3     string          \&l3A           - US legal page size
+>3     string          \&l26A          - A4 page size
+>3     string          \&l80A          - Monarch envelope size
+>3     string          \&l81A          - No. 10 envelope size
+>3     string          \&l90A          - Intl. DL envelope size
+>3     string          \&l91A          - Intl. C5 envelope size
+>3     string          \&l100A         - Intl. B5 envelope size
+>3     string          \&l-81A         - No. 10 envelope size (landscape)
+>3     string          \&l-90A         - Intl. DL envelope size (landscape)
+
+# IMAGEN printer-ready files:
+0      string  @document(              Imagen printer
+# this only works if "language xxx" is first item in Imagen header.
+>10    string  language\ impress       (imPRESS data)
+>10    string  language\ daisy         (daisywheel text)
+>10    string  language\ diablo        (daisywheel text)
+>10    string  language\ printer       (line printer emulation)
+>10    string  language\ tektronix     (Tektronix 4014 emulation)
+# Add any other languages that your Imagen uses - remember
+# to keep the word `text' if the file is human-readable.
+# [GRR 950115:  missing "postscript" or "ultrascript" (whatever it was called)]
+#
+# Now magic for IMAGEN font files...
+0      string          Rast            RST-format raster font data
+>45    string          >0              face %s
+# From Jukka Ukkonen
+0      string          \033[K\002\0\0\017\033(a\001\0\001\033(g        Canon Bubble Jet BJC formatted data
+
+# From <mike@flyn.org>
+# These are the /etc/magic entries to decode data sent to an Epson printer.
+0       string          \x1B\x40\x1B\x28\x52\x08\x00\x00REMOTE1P        Epson Stylus Color 460 data
+
+
+#------------------------------------------------------------------------------
+# zenographics:  file(1) magic for Zenographics ZjStream printer data
+# Rick Richardson  rickr@mn.rr.com
+0      string          JZJZ
+>0x12  string          ZZ              Zenographics ZjStream printer data (big-endian)
+0      string          ZJZJ
+>0x12  string          ZZ              Zenographics ZjStream printer data (little-endian)
+
+
+#------------------------------------------------------------------------------
+# Oak Technologies printer stream
+# Rick Richardson <rickr@mn.rr.com>
+0       string          OAK
+>0x07  byte            0
+>0x0b  byte            0       Oak Technologies printer stream
+
+# This would otherwise be recognized as PostScript - nick@debian.org
+0      string          %!VMF           SunClock's Vector Map Format data
+
+#------------------------------------------------------------------------------
+# HP LaserJet 1000 series downloadable firmware file
+0      string  \xbe\xefABCDEFGH        HP LaserJet 1000 series downloadable firmware   
+
+#------------------------------------------------------------------------------
+# apple:  file(1) magic for Apple file formats
+#
+0      string          FiLeStArTfIlEsTaRt      binscii (apple ][) text
+0      string          \x0aGL                  Binary II (apple ][) data
+0      string          \x76\xff                Squeezed (apple ][) data
+0      string          NuFile                  NuFile archive (apple ][) data
+0      string          N\xf5F\xe9l\xe5         NuFile archive (apple ][) data
+0      belong          0x00051600              AppleSingle encoded Macintosh file
+0      belong          0x00051607              AppleDouble encoded Macintosh file
+
+# magic for Newton PDA package formats
+# from Ruda Moura <ruda@helllabs.org>
+0      string  package0        Newton package, NOS 1.x,
+>12    belong  &0x80000000     AutoRemove,
+>12    belong  &0x40000000     CopyProtect,
+>12    belong  &0x10000000     NoCompression,
+>12    belong  &0x04000000     Relocation,
+>12    belong  &0x02000000     UseFasterCompression,
+>16    belong  x               version %d
+
+0      string  package1        Newton package, NOS 2.x,
+>12    belong  &0x80000000     AutoRemove,
+>12    belong  &0x40000000     CopyProtect,
+>12    belong  &0x10000000     NoCompression,
+>12    belong  &0x04000000     Relocation,
+>12    belong  &0x02000000     UseFasterCompression,
+>16    belong  x               version %d
+
+0      string  package4        Newton package,
+>8     byte    8               NOS 1.x,
+>8     byte    9               NOS 2.x,
+>12    belong  &0x80000000     AutoRemove,
+>12    belong  &0x40000000     CopyProtect,
+>12    belong  &0x10000000     NoCompression,
+
+# The following entries for the Apple II are for files that have
+# been transferred as raw binary data from an Apple, without having
+# been encapsulated by any of the above archivers.
+#
+# In general, Apple II formats are hard to identify because Apple DOS
+# and especially Apple ProDOS have strong typing in the file system and
+# therefore programmers never felt much need to include type information
+# in the files themselves.
+#
+# Eric Fischer <enf@pobox.com>
+
+# AppleWorks word processor:
+#
+# This matches the standard tab stops for an AppleWorks file, but if
+# a file has a tab stop set in the first four columns this will fail.
+#
+# The "O" is really the magic number, but that's so common that it's
+# necessary to check the tab stops that follow it to avoid false positives.
+
+4       string          O====   AppleWorks word processor data
+>85     byte&0x01       >0      \b, zoomed
+>90     byte&0x01       >0      \b, paginated
+>92     byte&0x01       >0      \b, with mail merge
+#>91    byte            x       \b, left margin %d
+
+# AppleWorks database:
+#
+# This isn't really a magic number, but it's the closest thing to one
+# that I could find.  The 1 and 2 really mean "order in which you defined
+# categories" and "left to right, top to bottom," respectively; the D and R
+# mean that the cursor should move either down or right when you press Return.
+
+#30    string          \x01D   AppleWorks database data
+#30    string          \x02D   AppleWorks database data
+#30    string          \x01R   AppleWorks database data
+#30    string          \x02R   AppleWorks database data
+
+# AppleWorks spreadsheet:
+#
+# Likewise, this isn't really meant as a magic number.  The R or C means
+# row- or column-order recalculation; the A or M means automatic or manual
+# recalculation.
+
+#131   string          RA      AppleWorks spreadsheet data
+#131   string          RM      AppleWorks spreadsheet data
+#131   string          CA      AppleWorks spreadsheet data
+#131   string          CM      AppleWorks spreadsheet data
+
+# Applesoft BASIC:
+#
+# This is incredibly sloppy, but will be true if the program was
+# written at its usual memory location of 2048 and its first line
+# number is less than 256.  Yuck.
+
+0       belong&0xff00ff 0x80000 Applesoft BASIC program data
+#>2     leshort         x       \b, first line number %d
+
+# ORCA/EZ assembler:
+# 
+# This will not identify ORCA/M source files, since those have
+# some sort of date code instead of the two zero bytes at 6 and 7
+# XXX Conflicts with ELF
+#4       belong&0xff00ffff       0x01000000      ORCA/EZ assembler source data
+#>5      byte                    x               \b, build number %d
+
+# Broderbund Fantavision
+#
+# I don't know what these values really mean, but they seem to recur.
+# Will they cause too many conflicts?
+
+# Probably :-)
+#2     belong&0xFF00FF         0x040008        Fantavision movie data
+
+# Some attempts at images.
+#
+# These are actually just bit-for-bit dumps of the frame buffer, so
+# there's really no reasonably way to distinguish them except for their
+# address (if preserved) -- 8192 or 16384 -- and their length -- 8192
+# or, occasionally, 8184.
+#
+# Nevertheless this will manage to catch a lot of images that happen
+# to have a solid-colored line at the bottom of the screen.
+
+8144   string  \x7F\x7F\x7F\x7F\x7F\x7F\x7F\x7F        Apple II image with white background
+8144   string  \x55\x2A\x55\x2A\x55\x2A\x55\x2A        Apple II image with purple background
+8144   string  \x2A\x55\x2A\x55\x2A\x55\x2A\x55        Apple II image with green background
+8144   string  \xD5\xAA\xD5\xAA\xD5\xAA\xD5\xAA        Apple II image with blue background
+8144   string  \xAA\xD5\xAA\xD5\xAA\xD5\xAA\xD5        Apple II image with orange background
+
+# Beagle Bros. Apple Mechanic fonts
+
+0      belong&0xFF00FFFF       0x6400D000      Apple Mechanic font
+
+# Apple Universal Disk Image Format (UDIF) - dmg files.
+# From Johan Gade.
+# These entries are disabled for now until we fix the following issues.
+#
+# Note there might be some problems with the "VAX COFF executable" 
+# entry. Note this entry should be placed before the mac filesystem section, 
+# particularly the "Apple Partition data" entry.
+#
+# The intended meaning of these tests is, that the file is only of the 
+# specified type if both of the lines are correct - i.e. if the first
+# line matches and the second doesn't then it is not of that type.
+#
+#0     long    0x7801730d
+#>4    long    0x62626060      UDIF read-only zlib-compressed image (UDZO)
+#
+# Note that this entry is recognized correctly by the "Apple Partition 
+# data" entry - however since this entry is more specific - this
+# information seems to be more useful.
+#0     long    0x45520200
+#>0x410        string  disk\ image     UDIF read/write image (UDRW)
+
+#------------------------------------------------------------------------------
+# applix:  file(1) magic for Applixware
+# From: Peter Soos <sp@osb.hu>
+#
+0      string          *BEGIN          Applixware
+>7     string          WORDS                   Words Document
+>7     string          GRAPHICS                Graphic
+>7     string          RASTER                  Bitmap
+>7     string          SPREADSHEETS            Spreadsheet
+>7     string          MACRO                   Macro
+>7     string          BUILDER                 Builder Object
+
+#------------------------------------------------------------------------------
+# interleaf:  file(1) magic for InterLeaf TPS:
+#
+0      string          =\210OPS        Interleaf saved data
+0      string          =<!OPS          Interleaf document text
+>5     string          ,\ Version\ =   \b, version
+>>17   string          >\0             %.3s
+
+#------------------------------------------------------------------------------
+# lisp:  file(1) magic for lisp programs
+#
+# various lisp types, from Daniel Quinlan (quinlan@yggdrasil.com)
+
+# This is a guess, but a good one.
+0      string  ;;                      Lisp/Scheme program text
+
+# Emacs 18 - this is always correct, but not very magical.
+0      string  \012(                   Emacs v18 byte-compiled Lisp data
+# Emacs 19+ - ver. recognition added by Ian Springer
+# Also applies to XEmacs 19+ .elc files; could tell them apart if we had regexp
+# support or similar - Chris Chittleborough <cchittleborough@yahoo.com.au>
+0      string  ;ELC                    
+>4     byte    >19                     
+>4     byte    <32                     Emacs/XEmacs v%d byte-compiled Lisp data
+
+# Files produced by CLISP Common Lisp From: Bruno Haible <haible@ilog.fr>
+0      string  (SYSTEM::VERSION\040'   CLISP byte-compiled Lisp program text
+0      long    0x70768BD2              CLISP memory image data
+0      long    0xD28B7670              CLISP memory image data, other endian
+
+# Files produced by GNU gettext
+0      long    0xDE120495              GNU-format message catalog data
+0      long    0x950412DE              GNU-format message catalog data
+
+#.com and .bin for MIT scheme 
+0      string  \372\372\372\372        MIT scheme (library?)
+
+# From: David Allouche <david@allouche.net>
+0      string  \<TeXmacs|      TeXmacs document text
+
+#------------------------------------------------------------------------------
+# spec:  file(1) magic for SPEC raw results (*.raw, *.rsf)
+#
+# Cloyce D. Spradling <cloyce@headgear.org>
+
+0      string  spec                    SPEC
+>4     string  .cpu                    CPU
+>>8    string  <:                      \b%.4s
+>>12   string  .                       raw result text
+
+17     string  version=SPECjbb         SPECjbb
+>32    string  <:                      \b%.4s
+>>37   string  <:                      v%.4s raw result text
+
+0      string  BEGIN\040SPECWEB        SPECweb
+>13    string  <:                      \b%.2s
+>>15   string  _SSL                    \b_SSL
+>>>20  string  <:                      v%.4s raw result text
+>>16   string  <:                      v%.4s raw result text
+
+#------------------------------------------------------------------------------
+# sniffer:  file(1) magic for packet capture files
+#
+# From: guy@alum.mit.edu (Guy Harris)
+#
+
+#
+# Microsoft Network Monitor 1.x capture files.
+#
+0      string          RTSS            NetMon capture file
+>5     byte            x               - version %d
+>4     byte            x               \b.%d
+>6     leshort         0               (Unknown)
+>6     leshort         1               (Ethernet)
+>6     leshort         2               (Token Ring)
+>6     leshort         3               (FDDI)
+>6     leshort         4               (ATM)
+
+#
+# Microsoft Network Monitor 2.x capture files.
+#
+0      string          GMBU            NetMon capture file
+>5     byte            x               - version %d
+>4     byte            x               \b.%d
+>6     leshort         0               (Unknown)
+>6     leshort         1               (Ethernet)
+>6     leshort         2               (Token Ring)
+>6     leshort         3               (FDDI)
+>6     leshort         4               (ATM)
+
+#
+# Network General Sniffer capture files.
+# Sorry, make that "Network Associates Sniffer capture files."
+# Sorry, make that "Network General old DOS Sniffer capture files."
+#
+0      string          TRSNIFF\ data\ \ \ \ \032       Sniffer capture file
+>33    byte            2               (compressed)
+>23    leshort         x               - version %d
+>25    leshort         x               \b.%d
+>32    byte            0               (Token Ring)
+>32    byte            1               (Ethernet)
+>32    byte            2               (ARCNET)
+>32    byte            3               (StarLAN)
+>32    byte            4               (PC Network broadband)
+>32    byte            5               (LocalTalk)
+>32    byte            6               (Znet)
+>32    byte            7               (Internetwork Analyzer)
+>32    byte            9               (FDDI)
+>32    byte            10              (ATM)
+
+#
+# Cinco Networks NetXRay capture files.
+# Sorry, make that "Network General Sniffer Basic capture files."
+# Sorry, make that "Network Associates Sniffer Basic capture files."
+# Sorry, make that "Network Associates Sniffer Basic, and Windows
+# Sniffer Pro", capture files."
+# Sorry, make that "Network General Sniffer capture files."
+#
+0      string          XCP\0           NetXRay capture file
+>4     string          >\0             - version %s
+>44    leshort         0               (Ethernet)
+>44    leshort         1               (Token Ring)
+>44    leshort         2               (FDDI)
+>44    leshort         3               (WAN)
+>44    leshort         8               (ATM)
+>44    leshort         9               (802.11)
+
+#
+# "libpcap" capture files.
+# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
+# the main program that uses that format, but there are other programs
+# that use "libpcap", or that use the same capture file format.)
+#
+0      ubelong         0xa1b2c3d4      tcpdump capture file (big-endian)
+>4     beshort         x               - version %d
+>6     beshort         x               \b.%d
+>20    belong          0               (No link-layer encapsulation
+>20    belong          1               (Ethernet
+>20    belong          2               (3Mb Ethernet
+>20    belong          3               (AX.25
+>20    belong          4               (ProNET
+>20    belong          5               (CHAOS
+>20    belong          6               (Token Ring
+>20    belong          7               (BSD ARCNET
+>20    belong          8               (SLIP
+>20    belong          9               (PPP
+>20    belong          10              (FDDI
+>20    belong          11              (RFC 1483 ATM
+>20    belong          12              (raw IP
+>20    belong          13              (BSD/OS SLIP
+>20    belong          14              (BSD/OS PPP
+>20    belong          19              (Linux ATM Classical IP
+>20    belong          50              (PPP or Cisco HDLC
+>20    belong          51              (PPP-over-Ethernet
+>20    belong          99              (Symantec Enterprise Firewall
+>20    belong          100             (RFC 1483 ATM
+>20    belong          101             (raw IP
+>20    belong          102             (BSD/OS SLIP
+>20    belong          103             (BSD/OS PPP
+>20    belong          104             (BSD/OS Cisco HDLC
+>20    belong          105             (802.11
+>20    belong          106             (Linux Classical IP over ATM
+>20    belong          107             (Frame Relay
+>20    belong          108             (OpenBSD loopback
+>20    belong          109             (OpenBSD IPsec encrypted
+>20    belong          112             (Cisco HDLC
+>20    belong          113             (Linux "cooked"
+>20    belong          114             (LocalTalk
+>20    belong          117             (OpenBSD PFLOG
+>20    belong          119             (802.11 with Prism header
+>20    belong          122             (RFC 2625 IP over Fibre Channel
+>20    belong          123             (SunATM
+>20    belong          127             (802.11 with radiotap header
+>20    belong          129             (Linux ARCNET
+>20    belong          138             (Apple IP over IEEE 1394
+>20    belong          140             (MTP2
+>20    belong          141             (MTP3
+>20    belong          143             (DOCSIS
+>20    belong          144             (IrDA
+>20    belong          147             (Private use 0
+>20    belong          148             (Private use 1
+>20    belong          149             (Private use 2
+>20    belong          150             (Private use 3
+>20    belong          151             (Private use 4
+>20    belong          152             (Private use 5
+>20    belong          153             (Private use 6
+>20    belong          154             (Private use 7
+>20    belong          155             (Private use 8
+>20    belong          156             (Private use 9
+>20    belong          157             (Private use 10
+>20    belong          158             (Private use 11
+>20    belong          159             (Private use 12
+>20    belong          160             (Private use 13
+>20    belong          161             (Private use 14
+>20    belong          162             (Private use 15
+>20    belong          163             (802.11 with AVS header
+>16    belong          x               \b, capture length %d)
+0      ulelong         0xa1b2c3d4      tcpdump capture file (little-endian)
+>4     leshort         x               - version %d
+>6     leshort         x               \b.%d
+>20    lelong          0               (No link-layer encapsulation
+>20    lelong          1               (Ethernet
+>20    lelong          2               (3Mb Ethernet
+>20    lelong          3               (AX.25
+>20    lelong          4               (ProNET
+>20    lelong          5               (CHAOS
+>20    lelong          6               (Token Ring
+>20    lelong          7               (ARCNET
+>20    lelong          8               (SLIP
+>20    lelong          9               (PPP
+>20    lelong          10              (FDDI
+>20    lelong          11              (RFC 1483 ATM
+>20    lelong          12              (raw IP
+>20    lelong          13              (BSD/OS SLIP
+>20    lelong          14              (BSD/OS PPP
+>20    lelong          19              (Linux ATM Classical IP
+>20    lelong          50              (PPP or Cisco HDLC
+>20    lelong          51              (PPP-over-Ethernet
+>20    lelong          99              (Symantec Enterprise Firewall
+>20    lelong          100             (RFC 1483 ATM
+>20    lelong          101             (raw IP
+>20    lelong          102             (BSD/OS SLIP
+>20    lelong          103             (BSD/OS PPP
+>20    lelong          104             (BSD/OS Cisco HDLC
+>20    lelong          105             (802.11
+>20    lelong          106             (Linux Classical IP over ATM
+>20    lelong          107             (Frame Relay
+>20    lelong          108             (OpenBSD loopback
+>20    lelong          109             (OpenBSD IPsec encrypted
+>20    lelong          112             (Cisco HDLC
+>20    lelong          113             (Linux "cooked"
+>20    lelong          114             (LocalTalk
+>20    lelong          117             (OpenBSD PFLOG
+>20    lelong          119             (802.11 with Prism header
+>20    lelong          122             (RFC 2625 IP over Fibre Channel
+>20    lelong          123             (SunATM
+>20    lelong          127             (802.11 with radiotap header
+>20    lelong          129             (Linux ARCNET
+>20    lelong          138             (Apple IP over IEEE 1394
+>20    lelong          140             (MTP2
+>20    lelong          141             (MTP3
+>20    lelong          143             (DOCSIS
+>20    lelong          144             (IrDA
+>20    lelong          147             (Private use 0
+>20    lelong          148             (Private use 1
+>20    lelong          149             (Private use 2
+>20    lelong          150             (Private use 3
+>20    lelong          151             (Private use 4
+>20    lelong          152             (Private use 5
+>20    lelong          153             (Private use 6
+>20    lelong          154             (Private use 7
+>20    lelong          155             (Private use 8
+>20    lelong          156             (Private use 9
+>20    lelong          157             (Private use 10
+>20    lelong          158             (Private use 11
+>20    lelong          159             (Private use 12
+>20    lelong          160             (Private use 13
+>20    lelong          161             (Private use 14
+>20    lelong          162             (Private use 15
+>20    lelong          163             (802.11 with AVS header
+>16    lelong          x               \b, capture length %d)
+
+#
+# "libpcap"-with-Alexey-Kuznetsov's-patches capture files.
+# (We call them "tcpdump capture file(s)" for now, as "tcpdump" is
+# the main program that uses that format, but there are other programs
+# that use "libpcap", or that use the same capture file format.)
+#
+0      ubelong         0xa1b2cd34      extended tcpdump capture file (big-endian)
+>4     beshort         x               - version %d
+>6     beshort         x               \b.%d
+>20    belong          0               (No link-layer encapsulation
+>20    belong          1               (Ethernet
+>20    belong          2               (3Mb Ethernet
+>20    belong          3               (AX.25
+>20    belong          4               (ProNET
+>20    belong          5               (CHAOS
+>20    belong          6               (Token Ring
+>20    belong          7               (ARCNET
+>20    belong          8               (SLIP
+>20    belong          9               (PPP
+>20    belong          10              (FDDI
+>20    belong          11              (RFC 1483 ATM
+>20    belong          12              (raw IP
+>20    belong          13              (BSD/OS SLIP
+>20    belong          14              (BSD/OS PPP
+>16    belong          x               \b, capture length %d)
+0      ulelong         0xa1b2cd34      extended tcpdump capture file (little-endian)
+>4     leshort         x               - version %d
+>6     leshort         x               \b.%d
+>20    lelong          0               (No link-layer encapsulation
+>20    lelong          1               (Ethernet
+>20    lelong          2               (3Mb Ethernet
+>20    lelong          3               (AX.25
+>20    lelong          4               (ProNET
+>20    lelong          5               (CHAOS
+>20    lelong          6               (Token Ring
+>20    lelong          7               (ARCNET
+>20    lelong          8               (SLIP
+>20    lelong          9               (PPP
+>20    lelong          10              (FDDI
+>20    lelong          11              (RFC 1483 ATM
+>20    lelong          12              (raw IP
+>20    lelong          13              (BSD/OS SLIP
+>20    lelong          14              (BSD/OS PPP
+>16    lelong          x               \b, capture length %d)
+
+#
+# AIX "iptrace" capture files.
+#
+0      string          iptrace\ 1.0    "iptrace" capture file
+0      string          iptrace\ 2.0    "iptrace" capture file
+
+#
+# Novell LANalyzer capture files.
+#
+0      leshort         0x1001          LANalyzer capture file
+0      leshort         0x1007          LANalyzer capture file
+
+#
+# HP-UX "nettl" capture files.
+#
+0      string          \x54\x52\x00\x64\x00    "nettl" capture file
+
+#
+# RADCOM WAN/LAN Analyzer capture files.
+#
+0      string          \x42\xd2\x00\x34\x12\x66\x22\x88        RADCOM WAN/LAN Analyzer capture file
+
+#
+# NetStumbler log files.  Not really packets, per se, but about as
+# close as you can get.  These are log files from NetStumbler, a
+# Windows program, that scans for 802.11b networks.
+#
+0      string          NetS            NetStumbler log file
+>8     lelong          x               \b, %d stations found
+
+#
+# EtherPeek/AiroPeek "version 9" capture files.
+#
+0      string          \177ver         EtherPeek/AiroPeek capture file
+
+#
+# Visual Networks traffic capture files.
+#
+0      string          \x05VNF         Visual Networks traffic capture file
+
+#
+# Network Instruments Observer capture files.
+#
+0      string          ObserverPktBuffe        Network Instruments Observer capture file
+
+#
+# Files from Accellent Group's 5View products.
+#
+0      string          \xaa\xaa\xaa\xaa        5View capture file
+
+#------------------------------------------------------------------------------
+# file(1) magic for revision control files
+# From Hendrik Scholz <hendrik@scholz.net>
+0   string /1\ :pserver:    cvs password text file
+#------------------------------------------------------------------------------
+# amigaos:  file(1) magic for AmigaOS binary formats:
+
+#
+# From ignatios@cs.uni-bonn.de (Ignatios Souvatzis)
+#
+0      belong          0x000003fa      AmigaOS shared library
+0      belong          0x000003f3      AmigaOS loadseg()ble executable/binary
+0      belong          0x000003e7      AmigaOS object/library data
+#
+0      beshort         0xe310          Amiga Workbench
+>2     beshort         1               
+>>48   byte            1               disk icon
+>>48   byte            2               drawer icon
+>>48   byte            3               tool icon
+>>48   byte            4               project icon
+>>48   byte            5               garbage icon
+>>48   byte            6               device icon
+>>48   byte            7               kickstart icon
+>>48   byte            8               workbench application icon
+>2     beshort         >1              icon, vers. %d
+#
+# various sound formats from the Amiga
+# G=F6tz Waschk <waschk@informatik.uni-rostock.de>
+#
+0      string          FC14            Future Composer 1.4 Module sound file
+0      string          SMOD            Future Composer 1.3 Module sound file
+0      string          AON4artofnoise  Art Of Noise Module sound file
+1      string          MUGICIAN/SOFTEYES Mugician Module sound file
+58     string          SIDMON\ II\ -\ THE      Sidmon 2.0 Module sound file
+0      string          Synth4.0        Synthesis Module sound file
+0      string          ARP.            The Holy Noise Module sound file
+0      string          BeEp\0          JamCracker Module sound file
+0      string          COSO\0          Hippel-COSO Module sound file
+# Too simple (short, pure ASCII, deep), MPi
+#26    string          V.3             Brian Postma's Soundmon Module sound file v3
+#26    string          BPSM            Brian Postma's Soundmon Module sound file v3
+#26    string          V.2             Brian Postma's Soundmon Module sound file v2
+
+# The following are from: "Stefan A. Haubenthal" <polluks@web.de>
+0      beshort         0x0f00          AmigaOS bitmap font
+0      beshort         0x0f03          AmigaOS outline font
+0      belong          0x80001001      AmigaOS outline tag
+0      string          ##\ version     catalog translation
+
+# Amiga disk types
+# 
+0      string          RDSK            Rigid Disk Block
+>160   string          x               on %.24s
+0      string          DOS\0           Amiga DOS disk
+0      string          DOS\1           Amiga FFS disk
+0      string          DOS\2           Amiga Inter DOS disk
+0      string          DOS\3           Amiga Inter FFS disk
+0      string          DOS\4           Amiga Fastdir DOS disk
+0      string          DOS\5           Amiga Fastdir FFS disk
+0      string          KICK            Kickstart disk
+
+#------------------------------------------------------------------------------
+# database:  file(1) magic for various databases
+#
+# extracted from header/code files by Graeme Wilford (eep2gw@ee.surrey.ac.uk)
+#
+#
+# GDBM magic numbers
+#  Will be maintained as part of the GDBM distribution in the future.
+#  <downsj@teeny.org>
+0      belong  0x13579ace      GNU dbm 1.x or ndbm database, big endian
+0      lelong  0x13579ace      GNU dbm 1.x or ndbm database, little endian
+0      string  GDBM            GNU dbm 2.x database
+#
+# Berkeley DB
+#
+# Ian Darwin's file /etc/magic files: big/little-endian version.
+#
+# Hash 1.85/1.86 databases store metadata in network byte order.
+# Btree 1.85/1.86 databases store the metadata in host byte order.
+# Hash and Btree 2.X and later databases store the metadata in host byte order.
+
+0      long    0x00061561      Berkeley DB
+>8     belong  4321
+>>4    belong  >2              1.86
+>>4    belong  <3              1.85
+>>4    belong  >0              (Hash, version %d, native byte-order)
+>8     belong  1234
+>>4    belong  >2              1.86
+>>4    belong  <3              1.85
+>>4    belong  >0              (Hash, version %d, little-endian)
+
+0      belong  0x00061561      Berkeley DB
+>8     belong  4321
+>>4    belong  >2              1.86
+>>4    belong  <3              1.85
+>>4    belong  >0              (Hash, version %d, big-endian)
+>8     belong  1234
+>>4    belong  >2              1.86
+>>4    belong  <3              1.85
+>>4    belong  >0              (Hash, version %d, native byte-order)
+
+0      long    0x00053162      Berkeley DB 1.85/1.86
+>4     long    >0              (Btree, version %d, native byte-order)
+0      belong  0x00053162      Berkeley DB 1.85/1.86
+>4     belong  >0              (Btree, version %d, big-endian)
+0      lelong  0x00053162      Berkeley DB 1.85/1.86
+>4     lelong  >0              (Btree, version %d, little-endian)
+
+12     long    0x00061561      Berkeley DB
+>16    long    >0              (Hash, version %d, native byte-order)
+12     belong  0x00061561      Berkeley DB
+>16    belong  >0              (Hash, version %d, big-endian)
+12     lelong  0x00061561      Berkeley DB
+>16    lelong  >0              (Hash, version %d, little-endian)
+
+12     long    0x00053162      Berkeley DB
+>16    long    >0              (Btree, version %d, native byte-order)
+12     belong  0x00053162      Berkeley DB
+>16    belong  >0              (Btree, version %d, big-endian)
+12     lelong  0x00053162      Berkeley DB
+>16    lelong  >0              (Btree, version %d, little-endian)
+
+12     long    0x00042253      Berkeley DB
+>16    long    >0              (Queue, version %d, native byte-order)
+12     belong  0x00042253      Berkeley DB
+>16    belong  >0              (Queue, version %d, big-endian)
+12     lelong  0x00042253      Berkeley DB
+>16    lelong  >0              (Queue, version %d, little-endian)
+#
+#
+# Round Robin Database Tool by Tobias Oetiker <oetiker@ee.ethz.ch>
+0      string  RRD             RRDTool DB
+>4     string  x               version %s
+#----------------------------------------------------------------------
+# ROOT: file(1) magic for ROOT databases
+#
+0       string  root\0  ROOT file
+>4      belong  x       Version %d
+>33     belong  x       (Compression: %d)
+
+# XXX: Weak magic.
+# Alex Ott <ott@jet.msk.su>
+## Paradox file formats
+#2       leshort       0x0800  Paradox 
+#>0x39   byte          3       v. 3.0 
+#>0x39   byte          4       v. 3.5 
+#>0x39   byte          9       v. 4.x 
+#>0x39   byte          10      v. 5.x 
+#>0x39   byte          11      v. 5.x 
+#>0x39   byte          12      v. 7.x 
+#>>0x04          byte          0       indexed .DB data file 
+#>>0x04          byte          1       primary index .PX file 
+#>>0x04          byte          2       non-indexed .DB data file 
+#>>0x04          byte          3       non-incrementing secondary index .Xnn file 
+#>>0x04          byte          4       secondary index .Ynn file 
+#>>0x04          byte          5       incrementing secondary index .Xnn file 
+#>>0x04          byte          6       non-incrementing secondary index .XGn file 
+#>>0x04          byte          7       secondary index .YGn file 
+#>>>0x04         byte          8       incrementing secondary index .XGn file 
+## XBase database files
+#0      byte       0x02        
+#>8     leshort          >0
+#>>12   leshort    0   FoxBase 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0x03        
+#>8     leshort          >0
+#>>12   leshort    0   FoxBase+, FoxPro, dBaseIII+, dBaseIV, no memo 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0x04        
+#>8     leshort          >0
+#>>12   leshort    0   dBASE IV no memo file 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0x05        
+#>8     leshort          >0
+#>>12   leshort    0   dBASE V no memo file 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0x30
+#>8     leshort          >0
+#>>12   leshort    0   Visual FoxPro 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0x43
+#>8     leshort          >0
+#>>12   leshort    0   FlagShip with memo var size 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0x7b
+#>8     leshort          >0
+#>>12   leshort    0   dBASEIV with memo 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0x83        
+#>8     leshort          >0
+#>>12   leshort    0   FoxBase+, dBaseIII+ with memo 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0x8b
+#>8     leshort          >0
+#>>12   leshort    0   dBaseIV with memo 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0x8e        
+#>8     leshort          >0
+#>>12   leshort    0   dBaseIV with SQL Table 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0xb3
+#>8     leshort          >0
+#>>12   leshort    0   FlagShip with .dbt memo 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0      byte       0xf5
+#>8     leshort          >0
+#>>12   leshort    0   FoxPro with memo 
+#>>>0x04       lelong          0               (no records)
+#>>>0x04       lelong          >0              (%ld records)
+#
+#0     leshort         0x0006          DBase 3 index file
+
+# MS Access database
+4        string        Standard\ Jet\ DB       Microsoft Access Database
+
+# TDB database from Samba et al - Martin Pool <mbp@samba.org>
+0      string  TDB\ file               TDB database
+>32    lelong  0x2601196D              version 6, little-endian
+>>36   lelong  x                       hash size %d bytes
+
+# SE Linux policy database
+0       lelong  0xf97cff8c      SE Linux policy
+>16     lelong  x               v%d
+>20     lelong  1      MLS
+>24     lelong  x       %d symbols
+>28     lelong  x       %d ocons
+
+# ICE authority file data (Wolfram Kleff)
+2      string          ICE             ICE authority data
+
+# X11 Xauthority file (Wolfram Kleff)
+10     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
+11     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
+12     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
+13     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
+14     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
+15     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
+16     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
+17     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
+18     string          MIT-MAGIC-COOKIE-1      X11 Xauthority data
+
+#------------------------------------------------------------------------------
+# gringotts:  file(1) magic for Gringotts
+# http://devel.pluto.linux.it/projects/Gringotts/
+# author: Germano Rizzo <mano@pluto.linux.it>
+#GRG3????Y
+0      string  GRG             Gringotts data file
+#file format 1
+>3     string          1               v.1, MCRYPT S2K, SERPENT crypt, SHA-256 hash, ZLib lvl.9
+#file format 2
+>3     string          2               v.2, MCRYPT S2K, 
+>>8    byte&0x70       0x00            RIJNDAEL-128 crypt,
+>>8    byte&0x70       0x10            SERPENT crypt,
+>>8    byte&0x70       0x20            TWOFISH crypt, 
+>>8    byte&0x70       0x30            CAST-256 crypt,
+>>8    byte&0x70       0x40            SAFER+ crypt,
+>>8    byte&0x70       0x50            LOKI97 crypt,
+>>8    byte&0x70       0x60            3DES crypt,
+>>8    byte&0x70       0x70            RIJNDAEL-256 crypt,
+>>8    byte&0x08       0x00            SHA1 hash,
+>>8    byte&0x08       0x08            RIPEMD-160 hash,
+>>8    byte&0x04       0x00            ZLib
+>>8    byte&0x04       0x04            BZip2
+>>8    byte&0x03       0x00            lvl.0
+>>8    byte&0x03       0x01            lvl.3
+>>8    byte&0x03       0x02            lvl.6
+>>8    byte&0x03       0x03            lvl.9
+#file format 3
+>3     string          3               v.3, OpenPGP S2K, 
+>>8    byte&0x70       0x00            RIJNDAEL-128 crypt,
+>>8    byte&0x70       0x10            SERPENT crypt,
+>>8    byte&0x70       0x20            TWOFISH crypt, 
+>>8    byte&0x70       0x30            CAST-256 crypt,
+>>8    byte&0x70       0x40            SAFER+ crypt,
+>>8    byte&0x70       0x50            LOKI97 crypt,
+>>8    byte&0x70       0x60            3DES crypt,
+>>8    byte&0x70       0x70            RIJNDAEL-256 crypt,
+>>8    byte&0x08       0x00            SHA1 hash,
+>>8    byte&0x08       0x08            RIPEMD-160 hash,
+>>8    byte&0x04       0x00            ZLib
+>>8    byte&0x04       0x04            BZip2
+>>8    byte&0x03       0x00            lvl.0
+>>8    byte&0x03       0x01            lvl.3
+>>8    byte&0x03       0x02            lvl.6
+>>8    byte&0x03       0x03            lvl.9
+#file format >3
+>3     string          >3              v.%.1s (unknown details)
+
+#------------------------------------------------------------------------------
+# pbm:  file(1) magic for Portable Bitmap files
+#
+# XXX - byte order?
+#
+0      short   0x2a17  "compact bitmap" format (Poskanzer)
+
+#------------------------------------------------------------------------------
+# plus5:  file(1) magic for Plus Five's UNIX MUMPS
+#
+# XXX - byte order?  Paging Hokey....
+#
+0      short           0x259           mumps avl global
+>2     byte            >0              (V%d)
+>6     byte            >0              with %d byte name
+>7     byte            >0              and %d byte data cells
+0      short           0x25a           mumps blt global
+>2     byte            >0              (V%d)
+>8     short           >0              - %d byte blocks
+>15    byte            0x00            - P/D format
+>15    byte            0x01            - P/K/D format
+>15    byte            0x02            - K/D format
+>15    byte            >0x02           - Bad Flags
+
+#------------------------------------------------------------------------------
+# vms:  file(1) magic for VMS executables (experimental)
+#
+# VMS .exe formats, both VAX and AXP (Greg Roelofs, newt@uchicago.edu)
+
+# GRR 950122:  I'm just guessing on these, based on inspection of the headers
+# of three executables each for Alpha and VAX architectures.  The VAX files
+# all had headers similar to this:
+#
+#   00000  b0 00 30 00 44 00 60 00  00 00 00 00 30 32 30 35  ..0.D.`.....0205
+#   00010  01 01 00 00 ff ff ff ff  ff ff ff ff 00 00 00 00  ................
+#
+0      string  \xb0\0\x30\0    VMS VAX executable
+>44032 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
+#
+# The AXP files all looked like this, except that the byte at offset 0x22
+# was 06 in some of them and 07 in others:
+#
+#   00000  03 00 00 00 00 00 00 00  ec 02 00 00 10 01 00 00  ................
+#   00010  68 00 00 00 98 00 00 00  b8 00 00 00 00 00 00 00  h...............
+#   00020  00 00 07 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
+#   00030  00 00 00 00 01 00 00 00  00 00 00 00 00 00 00 00  ................
+#   00040  00 00 00 00 ff ff ff ff  ff ff ff ff 02 00 00 00  ................
+#
+0      belong  0x03000000      VMS Alpha executable
+>75264 string  PK\003\004      \b, Info-ZIP SFX archive v5.12 w/decryption
+
+#------------------------------------------------------------------------------
+# python:  file(1) magic for python
+#
+# From: David Necas <yeti@physics.muni.cz>
+# often the module starts with a multiline string
+0      string          """     a python script text executable
+# MAGIC as specified in Python/import.c (1.5 to 2.3.0a)
+# 20121  ( YEAR - 1995 ) + MONTH  + DAY (little endian followed by "\r\n"
+0      belong          0x994e0d0a      python 1.5/1.6 byte-compiled
+0      belong          0x87c60d0a      python 2.0 byte-compiled
+0      belong          0x2aeb0d0a      python 2.1 byte-compiled
+0      belong          0x2ded0d0a      python 2.2 byte-compiled
+0      belong          0x3bf20d0a      python 2.3 byte-compiled
+
+#------------------------------------------------------------------------------
+# chord: file(1) magic for Chord music sheet typesetting utility input files
+#
+# From Philippe De Muyter <phdm@macqel.be>
+# File format is actually free, but many distributed files begin with `{title'
+#
+0      string          {title          Chord text file
+
+
+# ----------------------------------------------------------------------------
+# ctags:  file (1) magic for Exuberant Ctags files
+# From: Alexander Mai <mai@migdal.ikp.physik.tu-darmstadt.de>
+0       string  !_TAG   Exuberant Ctags tag file text
+
+#------------------------------------------------------------------------------
+# human68k:  file(1) magic for Human68k (X680x0 DOS) binary formats
+# Magic too short!
+#0             string  HU              Human68k
+#>68           string  LZX             LZX compressed
+#>>72          string  >\0             (version %s)
+#>(8.L+74)     string  LZX             LZX compressed
+#>>(8.L+78)    string  >\0             (version %s)
+#>60           belong  >0              binded
+#>(8.L+66)     string  #HUPAIR         hupair
+#>0            string  HU              X executable
+#>(8.L+74)     string  #LIBCV1         - linked PD LIBC ver 1
+#>4            belong  >0              - base address 0x%x
+#>28           belong  >0              not stripped
+#>32           belong  >0              with debug information
+#0             beshort 0x601a          Human68k Z executable
+#0             beshort 0x6000          Human68k object file
+#0             belong  0xd1000000      Human68k ar binary archive
+#0             belong  0xd1010000      Human68k ar ascii archive
+#0             beshort 0x0068          Human68k lib archive
+#4             string  LZX             Human68k LZX compressed
+#>8            string  >\0             (version %s)
+#>4            string  LZX             R executable
+#2             string  #HUPAIR         Human68k hupair R executable
+
+#------------------------------------------------------------------------------
+# pdp:  file(1) magic for PDP-11 executable/object and APL workspace
+#
+0      lelong          0101555         PDP-11 single precision APL workspace
+0      lelong          0101554         PDP-11 double precision APL workspace
+#
+# PDP-11 a.out
+#
+0      leshort         0407            PDP-11 executable
+>8     leshort         >0              not stripped
+>15    byte            >0              - version %ld
+
+0      leshort         0401            PDP-11 UNIX/RT ldp
+0      leshort         0405            PDP-11 old overlay
+
+0      leshort         0410            PDP-11 pure executable
+>8     leshort         >0              not stripped
+>15    byte            >0              - version %ld
+
+0      leshort         0411            PDP-11 separate I&D executable
+>8     leshort         >0              not stripped
+>15    byte            >0              - version %ld
+
+0      leshort         0437            PDP-11 kernel overlay
+
+# These last three are derived from 2.11BSD file(1)
+0      leshort         0413            PDP-11 demand-paged pure executable
+>8     leshort         >0              not stripped
+
+0      leshort         0430            PDP-11 overlaid pure executable
+>8     leshort         >0              not stripped
+
+0      leshort         0431            PDP-11 overlaid separate executable
+>8     leshort         >0              not stripped
+
+#------------------------------------------------------------------------
+# file(1) magic for sharc files
+#
+# SHARC DSP, MIDI SysEx and RiscOS filetype definitions added by 
+# FutureGroove Music (dsp@futuregroove.de)
+
+#------------------------------------------------------------------------
+0      string                  Draw            RiscOS Drawfile
+0      string                  PACK            RiscOS PackdDir archive
+
+#------------------------------------------------------------------------
+# SHARC DSP stuff (based on the FGM SHARC DSP SDK)
+
+0      string                  !               Assembler source
+0      string                  Analog          ADi asm listing file
+0      string                  .SYSTEM         SHARC architecture file
+0      string                  .system         SHARC architecture file
+
+0      leshort                 0x521C          SHARC COFF binary
+>2     leshort                 >1              , %hd sections
+>>12   lelong                  >0              , not stripped
+
+#------------------------------------------------------------------------------
+# pulsar:  file(1) magic for Pulsar POP3 daemon binary files
+#
+# http://pulsar.sourceforge.net
+# mailto:rok.papez@lugos.si
+#
+
+0      belong  0x1ee7f11e      Pulsar POP3 daemon mailbox cache file.
+>4     ubelong x               Version: %d.
+>8     ubelong x               \b%d
+
+
+#------------------------------------------------------------------------------
+# apl:  file(1) magic for APL (see also "pdp" and "vax" for other APL
+#       workspaces)
+#
+0      long            0100554         APL workspace (Ken's original?)
+
+#----------------------------------------------------------------------------
+# communication
+
+# TTCN is the Tree and Tabular Combined Notation described in ISO 9646-3.
+# It is used for conformance testing of communication protocols.
+# Added by W. Borgert <debacle@debian.org>.
+0      string          $Suite                  TTCN Abstract Test Suite
+>&1    string          $SuiteId
+>>&1   string          >\n                     %s
+>&2    string          $SuiteId
+>>&1   string          >\n                     %s
+>&3    string          $SuiteId
+>>&1   string          >\n                     %s
+
+# MSC (message sequence charts) are a formal description technique,
+# described in ITU-T Z.120, mainly used for communication protocols.
+# Added by W. Borgert <debacle@debian.org>.
+0      string          mscdocument     Message Sequence Chart (document)
+0      string          msc             Message Sequence Chart (chart)
+0      string          submsc          Message Sequence Chart (subchart)
+
+#------------------------------------------------------------------------------
+# ncr:  file(1) magic for NCR Tower objects
+#
+# contributed by
+# Michael R. Wayne  ***  TMC & Associates  ***  INTERNET: wayne@ford-vax.arpa
+# uucp: {philabs | pyramid} !fmsrl7!wayne   OR   wayne@fmsrl7.UUCP
+#
+0      beshort         000610  Tower/XP rel 2 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000615  Tower/XP rel 2 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000620  Tower/XP rel 3 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000625  Tower/XP rel 3 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000630  Tower32/600/400 68020 object
+>12       belong               >0      not stripped
+>20       beshort              0407    executable
+>20       beshort              0410    pure executable
+>22       beshort              >0      - version %ld
+0      beshort         000640  Tower32/800 68020
+>18       beshort              &020000 w/68881 object
+>18       beshort              &040000 compatible object
+>18       beshort              &~060000        object
+>20       beshort              0407    executable
+>20       beshort              0413    pure executable
+>12       belong               >0      not stripped
+>22       beshort              >0      - version %ld
+0      beshort         000645  Tower32/800 68010
+>18       beshort              &040000 compatible object
+>18       beshort              &~060000 object
+>20       beshort              0407    executable
+>20       beshort              0413    pure executable
+>12       belong               >0      not stripped
+>22       beshort              >0      - version %ld
+#------------------------------------------------------------------------------
+# alpha architecture description
+#
+
+0      leshort         0603            COFF format alpha
+>22    leshort&030000  !020000         executable
+>24    leshort         0410            pure
+>24    leshort         0413            paged
+>22    leshort&020000  !0              dynamically linked
+>16    lelong          !0              not stripped
+>16    lelong          0               stripped
+>22    leshort&030000  020000          shared library
+>24    leshort         0407            object
+>27    byte            x               - version %d
+>26    byte            x               \b.%d
+>28    byte            x               \b-%d
+
+# Basic recognition of Digital UNIX core dumps - Mike Bremford <mike@opac.bl.uk>
+#
+# The actual magic number is just "Core", followed by a 2-byte version
+# number; however, treating any file that begins with "Core" as a Digital
+# UNIX core dump file may produce too many false hits, so we include one
+# byte of the version number as well; DU 5.0 appears only to be up to
+# version 2.
+#
+0      string          Core\001        Alpha COFF format core dump (Digital UNIX)
+>24    string          >\0             \b, from '%s'
+0      string          Core\002        Alpha COFF format core dump (Digital UNIX)
+>24    string          >\0             \b, from '%s'
+
+
+#------------------------------------------------------------------------------
+# asterix:  file(1) magic for Aster*x; SunOS 5.5.1 gave the 4-character
+# strings as "long" - we assume they're just strings:
+# From: guy@netapp.com (Guy Harris)
+#
+0      string          *STA            Aster*x
+>7     string          WORD                    Words Document
+>7     string          GRAP                    Graphic
+>7     string          SPRE                    Spreadsheet
+>7     string          MACR                    Macro
+0      string          2278            Aster*x Version 2
+>29    byte            0x36                    Words Document
+>29    byte            0x35                    Graphic
+>29    byte            0x32                    Spreadsheet
+>29    byte            0x38                    Macro
+
+#------------------------------------------------------------------------------
+# blender: file(1) magic for Blender 3D data files
+#
+# Coded by Guillermo S. Romero <gsromero@alumnos.euitt.upm.es> using the
+# data from Ton Roosendaal <ton@blender.nl>. Ton or his company do not
+# support the rule, so mail GSR if problems with it. Rule version: 1.1.
+# You can get latest version with comments and details about the format
+# at http://acd.asoc.euitt.upm.es/~gsromero/3d/blender/magic.blender
+
+0      string  =BLENDER        Blender3D,
+>7     string  =_              saved as 32-bits
+>7      string =-              saved as 64-bits
+>8     string  =v              little endian
+>8     string  =V              big endian
+>9     byte    x               with version %c.
+>10    byte    x               \b%c
+>11    byte    x               \b%c
+
+#------------------------------------------------------------------------------
+# sendmail:  file(1) magic for sendmail config files
+#
+# XXX - byte order?
+#
+0      byte    046       Sendmail frozen configuration 
+>16    string  >\0       - version %s
+0      short   0x271c    Sendmail frozen configuration
+>16    string  >\0       - version %s
+
+#------------------------------------------------------------------------------
+# sendmail:  file(1) magic for sendmail m4(1) files
+#
+# From Hendrik Scholz <hendrik@scholz.net>
+# i.e. files in /usr/share/sendmail/cf/
+#
+0   string  divert(-1)\n    sendmail m4 text file
+
+
+#------------------------------------------------------------------------------
+# alliant:  file(1) magic for Alliant FX series a.out files
+#
+# If the FX series is the one that had a processor with a 68K-derived
+# instruction set, the "short" should probably become "beshort" and the
+# "long" should probably become "belong".
+# If it's the i860-based one, they should probably become either the
+# big-endian or little-endian versions, depending on the mode they ran
+# the 860 in....
+#
+0      short           0420            0420 Alliant virtual executable
+>2     short           &0x0020         common library
+>16    long            >0              not stripped
+0      short           0421            0421 Alliant compact executable
+>2     short           &0x0020         common library
+>16    long            >0              not stripped
+
+#------------------------------------------------------------------------------
+# CDDB: file(1) magic for CDDB(tm) format CD text data files
+#
+# From <steve@gracenote.com>
+#
+# This is the /etc/magic entry to decode datafiles as used by
+# CDDB-enabled CD player applications.
+#
+
+0       string/b        #\040xmcd               CDDB(tm) format CD text data
+
+#------------------------------------------------------------------------------
+# elf:  file(1) magic for ELF executables
+#
+# We have to check the byte order flag to see what byte order all the
+# other stuff in the header is in.
+#
+# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
+#
+# updated by Daniel Quinlan (quinlan@yggdrasil.com)
+0      string          \177ELF         ELF
+>4     byte            0               invalid class
+>4     byte            1               32-bit
+# only for MIPS - in the future, the ABI field of e_flags should be used.
+>>18   leshort         8
+>>>36  lelong          &0x20           N32
+>>18   leshort         10
+>>>36  lelong          &0x20           N32
+>>18   beshort         8
+>>>36  belong          &0x20           N32
+>>18   beshort         10
+>>>36  belong          &0x20           N32
+>4     byte            2               64-bit
+>5     byte            0               invalid byte order
+>5     byte            1               LSB
+# The official e_machine number for MIPS is now #8, regardless of endianness.
+# The second number (#10) will be deprecated later. For now, we still
+# say something if #10 is encountered, but only gory details for #8.
+>>18    leshort                8
+# only for 32-bit
+>>>4   byte            1
+>>>>36  lelong&0xf0000000      0x00000000      MIPS-I
+>>>>36  lelong&0xf0000000      0x10000000      MIPS-II
+>>>>36  lelong&0xf0000000      0x20000000      MIPS-III
+>>>>36  lelong&0xf0000000      0x30000000      MIPS-IV
+>>>>36  lelong&0xf0000000      0x40000000      MIPS-V
+>>>>36  lelong&0xf0000000      0x60000000      MIPS32
+>>>>36  lelong&0xf0000000      0x70000000      MIPS64
+>>>>36  lelong&0xf0000000      0x80000000      MIPS32 rel2
+>>>>36  lelong&0xf0000000      0x90000000      MIPS64 rel2
+# only for 64-bit
+>>>4   byte            2
+>>>>48  lelong&0xf0000000      0x00000000      MIPS-I
+>>>>48  lelong&0xf0000000      0x10000000      MIPS-II
+>>>>48  lelong&0xf0000000      0x20000000      MIPS-III
+>>>>48  lelong&0xf0000000      0x30000000      MIPS-IV
+>>>>48  lelong&0xf0000000      0x40000000      MIPS-V
+>>>>48  lelong&0xf0000000      0x60000000      MIPS32
+>>>>48  lelong&0xf0000000      0x70000000      MIPS64 
+>>>>48  lelong&0xf0000000      0x80000000      MIPS32 rel2
+>>>>48  lelong&0xf0000000      0x90000000      MIPS64 rel2
+>>16   leshort         0               no file type,
+>>16   leshort         1               relocatable,
+>>16   leshort         2               executable,
+>>16   leshort         3               shared object,
+# Core handling from Peter Tobias <tobias@server.et-inf.fho-emden.de>
+# corrections by Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
+>>16   leshort         4               core file
+# Core file detection is not reliable.
+#>>>(0x38+0xcc) string >\0             of '%s'
+#>>>(0x38+0x10) lelong >0              (signal %d),
+>>16   leshort         &0xff00         processor-specific,
+>>18   leshort         0               no machine,
+>>18   leshort         1               AT&T WE32100 - invalid byte order,
+>>18   leshort         2               SPARC - invalid byte order,
+>>18   leshort         3               Intel 80386,
+>>18   leshort         4               Motorola
+>>>36  lelong          &0x01000000     68000 - invalid byte order,
+>>>36  lelong          &0x00810000     CPU32 - invalid byte order,
+>>>36  lelong          0               68020 - invalid byte order,
+>>18   leshort         5               Motorola 88000 - invalid byte order,
+>>18   leshort         6               Intel 80486,
+>>18   leshort         7               Intel 80860,
+>>18   leshort         8               MIPS,
+>>18   leshort         9               Amdahl - invalid byte order,
+>>18   leshort         10              MIPS (deprecated),
+>>18   leshort         11              RS6000 - invalid byte order,
+>>18   leshort         15              PA-RISC - invalid byte order,
+>>>50  leshort         0x0214          2.0
+>>>48  leshort         &0x0008         (LP64),
+>>18   leshort         16              nCUBE,
+>>18   leshort         17              Fujitsu VPP500,
+>>18   leshort         18              SPARC32PLUS,
+>>18   leshort         20              PowerPC,
+>>18   leshort         22              IBM S/390,
+>>18   leshort         36              NEC V800,
+>>18   leshort         37              Fujitsu FR20,
+>>18   leshort         38              TRW RH-32,
+>>18   leshort         39              Motorola RCE,
+>>18   leshort         40              ARM,
+>>18   leshort         41              Alpha,
+>>18   leshort         0xa390          IBM S/390 (obsolete),
+>>18   leshort         42              Hitachi SH,
+>>18   leshort         43              SPARC V9 - invalid byte order,
+>>18   leshort         44              Siemens Tricore Embedded Processor,
+>>18   leshort         45              Argonaut RISC Core, Argonaut Technologies Inc.,
+>>18   leshort         46              Hitachi H8/300,
+>>18   leshort         47              Hitachi H8/300H,
+>>18   leshort         48              Hitachi H8S,
+>>18   leshort         49              Hitachi H8/500,
+>>18   leshort         50              IA-64 (Intel 64 bit architecture)
+>>18   leshort         51              Stanford MIPS-X,
+>>18   leshort         52              Motorola Coldfire,
+>>18   leshort         53              Motorola M68HC12,
+>>18   leshort         62              AMD x86-64,
+>>18   leshort         75              Digital VAX,
+>>18   leshort         88              Renesas M32R,
+>>18   leshort         97              NatSemi 32k,
+>>18   leshort         0x9026          Alpha (unofficial),
+>>20   lelong          0               invalid version
+>>20   lelong          1               version 1
+>>36   lelong          1               MathCoPro/FPU/MAU Required
+>5     byte            2               MSB
+# only for MIPS - see comment in little-endian section above.
+>>18    beshort                8
+# only for 32-bit
+>>>4   byte            1
+>>>>36  belong&0xf0000000      0x00000000      MIPS-I
+>>>>36  belong&0xf0000000      0x10000000      MIPS-II
+>>>>36  belong&0xf0000000      0x20000000      MIPS-III
+>>>>36  belong&0xf0000000      0x30000000      MIPS-IV
+>>>>36  belong&0xf0000000      0x40000000      MIPS-V
+>>>>36  belong&0xf0000000      0x60000000      MIPS32
+>>>>36  belong&0xf0000000      0x70000000      MIPS64
+>>>>36  belong&0xf0000000      0x80000000      MIPS32 rel2
+>>>>36  belong&0xf0000000      0x90000000      MIPS64 rel2
+# only for 64-bit
+>>>4   byte            2
+>>>>48 belong&0xf0000000       0x00000000      MIPS-I
+>>>>48 belong&0xf0000000       0x10000000      MIPS-II
+>>>>48 belong&0xf0000000       0x20000000      MIPS-III
+>>>>48 belong&0xf0000000       0x30000000      MIPS-IV
+>>>>48 belong&0xf0000000       0x40000000      MIPS-V
+>>>>48 belong&0xf0000000       0x60000000      MIPS32
+>>>>48 belong&0xf0000000       0x70000000      MIPS64 
+>>>>48 belong&0xf0000000       0x80000000      MIPS32 rel2
+>>>>48 belong&0xf0000000       0x90000000      MIPS64 rel2
+>>16   beshort         0               no file type,
+>>16   beshort         1               relocatable,
+>>16   beshort         2               executable,
+>>16   beshort         3               shared object,
+>>16   beshort         4               core file,
+#>>>(0x38+0xcc) string >\0             of '%s'
+#>>>(0x38+0x10) belong >0              (signal %d),
+>>16   beshort         &0xff00         processor-specific,
+>>18   beshort         0               no machine,
+>>18   beshort         1               AT&T WE32100,
+>>18   beshort         2               SPARC,
+>>18   beshort         3               Intel 80386 - invalid byte order,
+>>18   beshort         4               Motorola
+>>>36  belong          &0x01000000     68000,
+>>>36  belong          &0x00810000     CPU32,
+>>>36  belong          0               68020,
+>>18   beshort         5               Motorola 88000,
+>>18   beshort         6               Intel 80486 - invalid byte order,
+>>18   beshort         7               Intel 80860,
+>>18   beshort         8               MIPS,
+>>18   beshort         9               Amdahl,
+>>18   beshort         10              MIPS (deprecated),
+>>18   beshort         11              RS6000,
+>>18   beshort         15              PA-RISC
+>>>50  beshort         0x0214          2.0
+>>>48  beshort         &0x0008         (LP64)
+>>18   beshort         16              nCUBE,
+>>18   beshort         17              Fujitsu VPP500,
+>>18   beshort         18              SPARC32PLUS,
+>>>36  belong&0xffff00 &0x000100       V8+ Required,
+>>>36  belong&0xffff00 &0x000200       Sun UltraSPARC1 Extensions Required,
+>>>36  belong&0xffff00 &0x000400       HaL R1 Extensions Required,
+>>>36  belong&0xffff00 &0x000800       Sun UltraSPARC3 Extensions Required,
+>>18   beshort         20              PowerPC or cisco 4500,
+>>18   beshort         21              cisco 7500,
+>>18   beshort         22              IBM S/390,
+>>18   beshort         24              cisco SVIP,
+>>18   beshort         25              cisco 7200,
+>>18   beshort         36              NEC V800 or cisco 12000,
+>>18   beshort         37              Fujitsu FR20,
+>>18   beshort         38              TRW RH-32,
+>>18   beshort         39              Motorola RCE,
+>>18   beshort         40              ARM,
+>>18   beshort         41              Alpha,
+>>18   beshort         42              Hitachi SH,
+>>18   beshort         43              SPARC V9,
+>>18   beshort         44              Siemens Tricore Embedded Processor,
+>>18   beshort         45              Argonaut RISC Core, Argonaut Technologies Inc.,
+>>18   beshort         46              Hitachi H8/300,
+>>18   beshort         47              Hitachi H8/300H,
+>>18   beshort         48              Hitachi H8S,
+>>18   beshort         49              Hitachi H8/500,
+>>18   beshort         50              Intel Merced Processor,
+>>18   beshort         51              Stanford MIPS-X,
+>>18   beshort         52              Motorola Coldfire,
+>>18   beshort         53              Motorola M68HC12,
+>>18   beshort         73              Cray NV1,
+>>18   beshort         75              Digital VAX,
+>>18   beshort         88              Renesas M32R,
+>>18   beshort         97              NatSemi 32k,
+>>18   beshort         0x9026          Alpha (unofficial),
+>>18   beshort         0xa390          IBM S/390 (obsolete),
+>>20   belong          0               invalid version
+>>20   belong          1               version 1
+>>36   belong          1               MathCoPro/FPU/MAU Required
+# Up to now only 0, 1 and 2 are defined; I've seen a file with 0x83, it seemed
+# like proper ELF, but extracting the string had bad results.
+>4      byte            <0x80
+>>8    string          >\0             (%s)
+>8     string          \0
+>>7    byte            0               (SYSV)
+>>7    byte            1               (HP-UX)
+>>7    byte            2               (NetBSD)
+>>7    byte            3               (GNU/Linux)
+>>7    byte            4               (GNU/Hurd)
+>>7    byte            5               (86Open)
+>>7    byte            6               (Solaris)
+>>7    byte            7               (Monterey)
+>>7    byte            8               (IRIX)
+>>7    byte            9               (FreeBSD)
+>>7    byte            10              (Tru64)
+>>7    byte            11              (Novell Modesto)
+>>7    byte            12              (OpenBSD)
+>>7    byte            97              (ARM)
+>>7    byte            255             (embedded)
+
+#------------------------------------------------------------------------------
+# Epoc 32 : file(1) magic for Epoc Documents [psion/osaris
+# Stefan Praszalowicz (hpicollo@worldnet.fr)
+#0     lelong          0x10000037      Epoc32
+>4     lelong          0x1000006D
+>>8    lelong          0x1000007F      Word
+>>8    lelong          0x10000088      Sheet
+>>8    lelong          0x1000007D      Sketch
+>>8    lelong          0x10000085      TextEd
+
+#------------------------------------------------------------------------------
+# ispell:  file(1) magic for ispell
+#
+# Ispell 3.0 has a magic of 0x9601 and ispell 3.1 has 0x9602.  This magic
+# will match 0x9600 through 0x9603 in *both* little endian and big endian.
+# (No other current magic entries collide.)
+#
+# Updated by Daniel Quinlan (quinlan@yggdrasil.com)
+#
+0      leshort&0xFFFC  0x9600          little endian ispell
+>0     byte            0               hash file (?),
+>0     byte            1               3.0 hash file,
+>0     byte            2               3.1 hash file,
+>0     byte            3               hash file (?),
+>2     leshort         0x00            8-bit, no capitalization, 26 flags
+>2     leshort         0x01            7-bit, no capitalization, 26 flags
+>2     leshort         0x02            8-bit, capitalization, 26 flags
+>2     leshort         0x03            7-bit, capitalization, 26 flags
+>2     leshort         0x04            8-bit, no capitalization, 52 flags
+>2     leshort         0x05            7-bit, no capitalization, 52 flags
+>2     leshort         0x06            8-bit, capitalization, 52 flags
+>2     leshort         0x07            7-bit, capitalization, 52 flags
+>2     leshort         0x08            8-bit, no capitalization, 128 flags
+>2     leshort         0x09            7-bit, no capitalization, 128 flags
+>2     leshort         0x0A            8-bit, capitalization, 128 flags
+>2     leshort         0x0B            7-bit, capitalization, 128 flags
+>2     leshort         0x0C            8-bit, no capitalization, 256 flags
+>2     leshort         0x0D            7-bit, no capitalization, 256 flags
+>2     leshort         0x0E            8-bit, capitalization, 256 flags
+>2     leshort         0x0F            7-bit, capitalization, 256 flags
+>4     leshort         >0              and %d string characters
+0      beshort&0xFFFC  0x9600          big endian ispell
+>1     byte            0               hash file (?),
+>1     byte            1               3.0 hash file,
+>1     byte            2               3.1 hash file,
+>1     byte            3               hash file (?),
+>2     beshort         0x00            8-bit, no capitalization, 26 flags
+>2     beshort         0x01            7-bit, no capitalization, 26 flags
+>2     beshort         0x02            8-bit, capitalization, 26 flags
+>2     beshort         0x03            7-bit, capitalization, 26 flags
+>2     beshort         0x04            8-bit, no capitalization, 52 flags
+>2     beshort         0x05            7-bit, no capitalization, 52 flags
+>2     beshort         0x06            8-bit, capitalization, 52 flags
+>2     beshort         0x07            7-bit, capitalization, 52 flags
+>2     beshort         0x08            8-bit, no capitalization, 128 flags
+>2     beshort         0x09            7-bit, no capitalization, 128 flags
+>2     beshort         0x0A            8-bit, capitalization, 128 flags
+>2     beshort         0x0B            7-bit, capitalization, 128 flags
+>2     beshort         0x0C            8-bit, no capitalization, 256 flags
+>2     beshort         0x0D            7-bit, no capitalization, 256 flags
+>2     beshort         0x0E            8-bit, capitalization, 256 flags
+>2     beshort         0x0F            7-bit, capitalization, 256 flags
+>4     beshort         >0              and %d string characters
+# ispell 4.0 hash files  kromJx <kromJx@crosswinds.net>
+# Ispell 4.0
+0       string          ISPL            ispell
+>4      long            x               hash file version %d,
+>8      long            x               lexletters %d,
+>12     long            x               lexsize %d,
+>16     long            x               hashsize %d,
+>20     long            x               stblsize %d
+
+#------------------------------------------------------------------------------
+# lex:  file(1) magic for lex
+#
+#      derived empirically, your offsets may vary!
+53     string          yyprevious      C program text (from lex)
+>3     string          >\0              for %s
+# C program text from GNU flex, from Daniel Quinlan <quinlan@yggdrasil.com>
+21     string          generated\ by\ flex     C program text (from flex)
+# lex description file, from Daniel Quinlan <quinlan@yggdrasil.com>
+0      string          %{              lex description text
+
+#------------------------------------------------------------------------------
+# mips:  file(1) magic for Silicon Graphics (MIPS, IRIS, IRIX, etc.)
+#                         Dec Ultrix (MIPS)
+# all of SGI's *current* machines and OSes run in big-endian mode on the
+# MIPS machines, as far as I know.
+#
+# XXX - what is the blank "-" line?
+#
+# kbd file definitions
+0      string  kbd!map         kbd map file
+>8     byte    >0              Ver %d:
+>10    short   >0              with %d table(s)
+0      belong  0407            old SGI 68020 executable
+0      belong  0410            old SGI 68020 pure executable
+0      beshort 0x8765          disk quotas file
+0      beshort 0x0506          IRIS Showcase file
+>2     byte    0x49            -
+>3     byte    x               - version %ld
+0      beshort 0x0226          IRIS Showcase template
+>2     byte    0x63            -
+>3     byte    x               - version %ld
+0      belong  0x5343464d      IRIS Showcase file
+>4     byte    x               - version %ld
+0      belong  0x5443464d      IRIS Showcase template
+>4     byte    x               - version %ld
+0      belong  0xdeadbabe      IRIX Parallel Arena
+>8     belong  >0              - version %ld
+#
+0      beshort 0x0160          MIPSEB ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>22    byte    x               - version %ld
+>23    byte    x               \b.%ld
+#
+0      beshort 0x0162          MIPSEL-BE ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %d
+>22    byte    x               \b.%ld
+#
+0      beshort 0x6001          MIPSEB-LE ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %d
+>22    byte    x               \b.%ld
+#
+0      beshort 0x6201          MIPSEL ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %ld
+>22    byte    x               \b.%ld
+#
+# MIPS 2 additions
+#
+0      beshort 0x0163          MIPSEB MIPS-II ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>22    byte    x               - version %ld
+>23    byte    x               \b.%ld
+#
+0      beshort 0x0166          MIPSEL-BE MIPS-II ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>22    byte    x               - version %ld
+>23    byte    x               \b.%ld
+#
+0      beshort 0x6301          MIPSEB-LE MIPS-II ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %ld
+>22    byte    x               \b.%ld
+#
+0      beshort 0x6601          MIPSEL MIPS-II ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %ld
+>22    byte    x               \b.%ld
+#
+# MIPS 3 additions
+#
+0      beshort 0x0140          MIPSEB MIPS-III ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>22    byte    x               - version %ld
+>23    byte    x               \b.%ld
+#
+0      beshort 0x0142          MIPSEL-BE MIPS-III ECOFF executable
+>20    beshort 0407            (impure)
+>20    beshort 0410            (swapped)
+>20    beshort 0413            (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>22    byte    x               - version %ld
+>23    byte    x               \b.%ld
+#
+0      beshort 0x4001          MIPSEB-LE MIPS-III ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %ld
+>22    byte    x               \b.%ld
+#
+0      beshort 0x4201          MIPSEL MIPS-III ECOFF executable
+>20    beshort 03401           (impure)
+>20    beshort 04001           (swapped)
+>20    beshort 05401           (paged)
+>8     belong  >0              not stripped
+>8     belong  0               stripped
+>23    byte    x               - version %ld
+>22    byte    x               \b.%ld
+#
+0      beshort 0x180           MIPSEB Ucode
+0      beshort 0x182           MIPSEL-BE Ucode
+# 32bit core file
+0      belong  0xdeadadb0      IRIX core dump
+>4     belong  1               of
+>16    string  >\0             '%s'
+# 64bit core file
+0      belong  0xdeadad40      IRIX 64-bit core dump
+>4     belong  1               of
+>16    string  >\0             '%s'
+# N32bit core file
+0       belong 0xbabec0bb      IRIX N32 core dump
+>4      belong 1               of
+>16     string >\0             '%s'
+# New style crash dump file
+0      string  \x43\x72\x73\x68\x44\x75\x6d\x70        IRIX vmcore dump of
+>36    string  >\0                                     '%s'
+# Trusted IRIX info
+0      string  SGIAUDIT        SGI Audit file
+>8     byte    x               - version %d
+>9     byte    x               \b.%ld
+#
+0      string  WNGZWZSC        Wingz compiled script
+0      string  WNGZWZSS        Wingz spreadsheet
+0      string  WNGZWZHP        Wingz help file
+#
+0      string  \#Inventor V    IRIS Inventor 1.0 file
+0      string  \#Inventor V2   Open Inventor 2.0 file
+# GLF is OpenGL stream encoding
+0      string  glfHeadMagic();         GLF_TEXT
+4      belong  0x7d000000              GLF_BINARY_LSB_FIRST
+4      belong  0x0000007d              GLF_BINARY_MSB_FIRST
+# GLS is OpenGL stream encoding; GLS is the successor of GLF
+0      string  glsBeginGLS(            GLS_TEXT
+4      belong  0x10000000              GLS_BINARY_LSB_FIRST
+4      belong  0x00000010              GLS_BINARY_MSB_FIRST
index 12d80bbfbc6e40a2f0caa1f7ee8a163bb2235e5b..ca4d0bf93932e611ee482a801e9b787e6d63c8c7 100644 (file)
@@ -25,6 +25,14 @@ require_once('Mail/mime.php');
 
 class rc_mail_mime extends Mail_mime
 {
+  /**
+   * Set build parameters
+   */
+  function setParam($param)
+  {
+    if (is_array($param))
+      $this->_build_params = array_merge($this->_build_params, $param);
+  }
   
   /**
    * Adds an image to the list of embedded images.
@@ -63,7 +71,7 @@ class rc_mail_mime extends Mail_mime
 
     return true;
   }
-
+  
   
   /**
   * returns the HTML body portion of the message
@@ -76,6 +84,22 @@ class rc_mail_mime extends Mail_mime
   }
   
   
+  /**
+   * Creates a new mimePart object, using multipart/mixed as
+   * the initial content-type and returns it during the
+   * build process.
+   *
+   * @return object  The multipart/mixed mimePart object
+   * @access private
+   */
+  function &_addMixedPart()
+  {
+    $params['content_type'] = $this->_headers['Content-Type'] ? $this->_headers['Content-Type'] : 'multipart/mixed';
+    $ret = new Mail_mimePart('', $params);
+    return $ret;
+  }
+  
+  
   /**
    * Encodes a header as per RFC2047
    *
@@ -138,7 +162,7 @@ class rc_mail_mime extends Mail_mime
 
         // add chunk to output string by regarding the header maxlen
         $len = strlen($value);
-        if ($line_len + $len < $maxlen)
+        if ($i == 0 || $line_len + $len < $maxlen)
         {
           $hdr_value .= ($i>0?', ':'') . $value;
           $line_len += $len + ($i>0?2:0);
index bad9b70b6f885c921076ff48a19c7229c2e3dd7c..04d49871e669f5ce7418f561d980c9523e3d1392 100644 (file)
@@ -6,14 +6,14 @@
  | language/am/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Vahan Yerkanian <vahan@arminco.com>                           |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 584 2007-05-24 03:49:19Z estadtherr $
+ @version $Id: labels.inc 1160 2008-03-01 15:32:44Z yllar $
 
 */
 
@@ -75,6 +75,7 @@ $labels['replytomessage'] = 'Պատասխանել նամակին';
 $labels['replytoallmessage'] = 'Պատասխանել բոլորին';
 $labels['forwardmessage'] = 'Փոխանցել նամակը';
 $labels['deletemessage'] = 'Ջնջել նամակը';
+$labels['movemessagetotrash'] = 'Գցել աղբարկղը';
 $labels['printmessage'] = 'Տպել';
 $labels['previousmessage'] = 'Ցուցադրել նախորդ նամակը';
 $labels['previousmessages'] = 'Ցուցադրել նախորդ նամակները';
@@ -86,6 +87,9 @@ $labels['lastmessage'] = 'Ցուցադրել վերջին նամակը';
 $labels['lastmessages'] = 'Ցուցադրել վերջին էջը';
 $labels['backtolist'] = 'Վերադառնալ նամակների ցուցակ';
 $labels['viewsource'] = 'Ցուցադրել նամակի կոդը';
+$labels['markmessages'] = 'Նշել նամակները';
+$labels['markread'] = 'որպես կարդացած';
+$labels['markunread'] = 'որպես չկարդացած';
 $labels['select'] = 'Նշել';
 $labels['all'] = 'Բոլորը';
 $labels['none'] = 'Չնշել';
@@ -99,8 +103,8 @@ $labels['unlimited'] = 'անսահմանափակ';
 $labels['quicksearch'] = 'Արագ որոնում';
 $labels['resetsearch'] = 'Վերսկսել որոնումը';
 $labels['compose'] = 'Գրել նամակ';
-$labels['sendmessage'] = 'Ուղարկել';
 $labels['savemessage'] = 'Հիշել որպես սևագիր';
+$labels['sendmessage'] = 'Ուղարկել';
 $labels['addattachment'] = 'Կցել ֆայլ';
 $labels['charset'] = 'Տառաշար';
 $labels['editortype'] = 'Խմբագրի տիպը';
@@ -120,6 +124,13 @@ $labels['nosubject'] = '(առանց վերնագրի)';
 $labels['showimages'] = 'Ցուցադրել նկարները';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Պարզ տեքստ';
+$labels['addcc'] = 'Ավելացնել Cc';
+$labels['addbcc'] = 'Ավելացնել Bcc';
+$labels['addreplyto'] = 'Ավելացնել Reply-To';
+$labels['mdnrequest'] = 'Նամակի հեղինակը խնդրել է նամակը կարդալուն պես տեղեկացնել իրեն։ Ցանկանում էք Տեղեկացնե՞լ։';
+$labels['receiptread'] = 'Նամակի ընթերցման ծանուցագիր';
+$labels['yourmessage'] = 'Սա Ձեր նամակի ընթերցման ծանուցագիրն է';
+$labels['receiptnote'] = 'Նշում՝ Այս ծանուցագիրը ընդամենը տեղեկացնում է, որ նամակը ցուցադրվել է հասցեատիրոջ համակարչով։ Չկա որևիցե երաշխիք, որ հասցեատերը իսկապես կարդացել է նամակը։';
 $labels['name'] = 'Մականուն';
 $labels['firstname'] = 'Անուն';
 $labels['surname'] = 'Ազգանուն';
@@ -167,6 +178,7 @@ $labels['folder'] = 'Դարակ';
 $labels['folders'] = 'Դարակներ';
 $labels['foldername'] = 'Դարակի անուն';
 $labels['subscribed'] = 'Բաժանորդագրված';
+$labels['messagecount'] = 'Նամակներ';
 $labels['create'] = 'Ստեղծել';
 $labels['createfolder'] = 'Բացել նոր դարակ';
 $labels['rename'] = 'Վերանվանել';
index f257d87efb9064d0b416865c3e28a337fdb2a516..af16e8f2f4f08338c2e3d1b11c7537acd90861b0 100644 (file)
@@ -6,14 +6,14 @@
  | language/am/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Vahan Yerkanian <vahan@arminco.com>                           |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 584 2007-05-24 03:49:19Z estadtherr $
+ @version $Id: messages.inc 1160 2008-03-01 15:32:44Z yllar $
 
 */
 
@@ -73,5 +73,10 @@ $messages['copysuccess'] = '$nr հասցեների կրկնօրինակումը
 $messages['copyerror'] = 'Հասցեների կրկնօրինակումը ձախողվեց';
 $messages['sourceisreadonly'] = 'Այս հասցեն պաշտպանված է';
 $messages['errorsavingcontact'] = 'Հասցեի գրանցումն ձախողվեց';
+$messages['movingmessage'] = 'Նամակը տեղափոխվում է…';
+$messages['receiptsent'] = 'Նամակի ընթերցման ծանուցագիրն ուղարկված է';
+$messages['errorsendingreceipt'] = 'Ծանուցագրի ուղարկումը ձախողվեց';
+$messages['nodeletelastidentity'] = 'Անհնար է ջնջել վերջին տարբերակը';
+$messages['addsubfolderhint'] = 'Այս դարակը կստեղծվի որպես նշվածի ենթադարակ';
 
 ?>
\ No newline at end of file
index ca24f676bbcf64157fdd5edef8ed516ae389e45e..984aca713cbf685bc0e492e9058300b32b0f617a 100644 (file)
@@ -6,14 +6,14 @@
  | language/ar/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Ossama Khayat <okhayat@yahoo.com>                             |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: labels.inc 1068 2008-02-13 19:24:23Z yllar $
 
 */
 
@@ -75,6 +75,7 @@ $labels['replytomessage'] = 'الرد على الرسالة';
 $labels['replytoallmessage'] = 'الرد على المرسل وجميع مستقبلي الرسالة';
 $labels['forwardmessage'] = 'تمرير الرسالة';
 $labels['deletemessage'] = 'حذف الرسالة إلى المهملات';
+$labels['movemessagetotrash'] = 'انقل الرسالة إلى سلة المهملات';
 $labels['printmessage'] = 'طباعة هذه الرسالة';
 $labels['previousmessage'] = 'عرض الرسالة السابقة';
 $labels['previousmessages'] = 'عرض المجموعة السابقة من الرسائل';
@@ -86,6 +87,9 @@ $labels['lastmessage'] = 'عرض الرسالة الأخيرة';
 $labels['lastmessages'] = 'عرض مجموعة الرسائل الأخيرة';
 $labels['backtolist'] = 'العودة إلى لائحة الرسائل';
 $labels['viewsource'] = 'إظهار المصدر';
+$labels['markmessages'] = 'وسم الرسالة';
+$labels['markread'] = 'كمقروءة';
+$labels['markunread'] = 'كغير مقروءة';
 $labels['select'] = 'تحديد';
 $labels['all'] = 'الكل';
 $labels['none'] = 'لا شيء';
@@ -99,8 +103,8 @@ $labels['unlimited'] = 'غير محدود';
 $labels['quicksearch'] = 'البحث السريع';
 $labels['resetsearch'] = 'استعادة البحث للافتراضي';
 $labels['compose'] = 'إنشاء رسالة';
-$labels['sendmessage'] = 'إرسال الرسالة الآن';
 $labels['savemessage'] = 'حفظ هذه المسودة';
+$labels['sendmessage'] = 'إرسال الرسالة الآن';
 $labels['addattachment'] = 'إرفاق ملف';
 $labels['charset'] = 'مجموعة المحارف';
 $labels['editortype'] = 'نوع المُحرّر';
@@ -120,6 +124,13 @@ $labels['nosubject'] = '(دون موضوع)';
 $labels['showimages'] = 'إظهار الصور';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'نص مجرد';
+$labels['addcc'] = 'أضف CC';
+$labels['addbcc'] = 'أضف BCC';
+$labels['addreplyto'] = 'أضيف Reply-To';
+$labels['mdnrequest'] = 'طلب المرسل إعلامه عند قراءتك لرسالته. هل تود إعلام المرسل؟';
+$labels['receiptread'] = 'إيصال الاستلام )بالقراءة)';
+$labels['yourmessage'] = 'هذا إيصال بقراءة رسالتك';
+$labels['receiptnote'] = 'ملاحظة: يُعلمك هذا الإيصال بأن رسالتك قد ظهرت على جهاز المستقبِل. ليست هناك أية ضمانات أن المستقبل قد قرأ أو فهم محتويات الرسالة.';
 $labels['name'] = 'اسم العرض';
 $labels['firstname'] = 'الإسم الأول';
 $labels['surname'] = 'الإسم الأخير';
@@ -167,6 +178,7 @@ $labels['folder'] = 'مجلد';
 $labels['folders'] = 'مجلدات';
 $labels['foldername'] = 'اسم المجلد';
 $labels['subscribed'] = 'مشترك';
+$labels['messagecount'] = 'الرسائل';
 $labels['create'] = 'إنشاء';
 $labels['createfolder'] = 'إنشاء مجلد جديد';
 $labels['rename'] = 'إعادة التسمية';
index f9488964620df3a286dafb41322d4022d5fed16f..68b36a931a0037f3d2ca073a2489c751c20669d7 100644 (file)
@@ -6,14 +6,14 @@
  | language/ar/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Ossama Khayat <okhayat@yahoo.com>                             |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: messages.inc 1068 2008-02-13 19:24:23Z yllar $
 
 */
 
@@ -73,5 +73,10 @@ $messages['copysuccess'] = 'تم نسخ $nr رسائل بنجاح';
 $messages['copyerror'] = 'لم يمكن نسخ أية عناوين';
 $messages['sourceisreadonly'] = 'لا يمكن تعديل مصدر العنوان هذا';
 $messages['errorsavingcontact'] = 'تعذر حفظ عنوان المراسل';
+$messages['movingmessage'] = 'جاري نقل الرسالة...';
+$messages['receiptsent'] = 'أرسل إيصال الاستلام بنجاح';
+$messages['errorsendingreceipt'] = 'تعذر إرسال إيصال الاستلام';
+$messages['nodeletelastidentity'] = 'لا يمكن حذف هذا السجل حيث أنه الوحيد المتبقي.';
+$messages['addsubfolderhint'] = 'سيتم إنشاء هذا المجلد كمجلد فرعي للمحدد.';
 
 ?>
\ No newline at end of file
index 08991215c261206d20bfe3eb147fc7a89b583338..16c8428cfad8cdee30dc5ba2adea922c3f3123f8 100644 (file)
-<?php\r
-\r
-/*\r
-\r
- +-----------------------------------------------------------------------+\r
- | language/bg/labels.inc                                                |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2005-2007 RoundCube Dev. - Switzerland                  |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author: Todor Dragnev <todor.dragnev@gmail.com>                       |\r
- +-----------------------------------------------------------------------+\r
-\r
- @version $Id$\r
-\r
-*/\r
-\r
-$labels = array();\r
-$labels['welcome'] = 'Добре дошли в $product';\r
-$labels['username'] = 'Потребител';\r
-$labels['password'] = 'Парола';\r
-$labels['server'] = 'Сървър';\r
-$labels['login'] = 'Вход';\r
-$labels['logout'] = 'Изход';\r
-$labels['mail'] = 'Кутия';\r
-$labels['settings'] = 'Настройки';\r
-$labels['addressbook'] = 'Адреси';\r
-$labels['inbox'] = 'Входящи';\r
-$labels['drafts'] = 'Чернови';\r
-$labels['sent'] = 'Изпратени';\r
-$labels['trash'] = 'Кошче';\r
-$labels['junk'] = 'Спам';\r
-$labels['subject'] = 'Заглавие';\r
-$labels['from'] = 'От';\r
-$labels['to'] = 'Получател';\r
-$labels['cc'] = 'Копие до';\r
-$labels['bcc'] = 'Скрито копие до';\r
-$labels['replyto'] = 'Отговор на';\r
-$labels['date'] = 'Дата';\r
-$labels['size'] = 'Размер';\r
-$labels['priority'] = 'Приоритет';\r
-$labels['organization'] = 'Организация';\r
-$labels['reply-to'] = 'Отговор на';\r
-$labels['mailboxlist'] = 'Папки';\r
-$labels['messagesfromto'] = 'Съобщения $from до $to от $count';\r
-$labels['messagenrof'] = 'Съобщение $nr от $count';\r
-$labels['moveto'] = 'премести в...';\r
-$labels['download'] = 'изтегли';\r
-$labels['filename'] = 'Име на файла';\r
-$labels['filesize'] = 'Размер на файла';\r
-$labels['preferhtml'] = 'Показвай първо HTML версия';\r
-$labels['htmlmessage'] = 'HTML съобщение';\r
-$labels['prettydate'] = 'Кратки дати';\r
-$labels['addtoaddressbook'] = 'Добави в адресната книга';\r
-$labels['sun'] = 'Нед';\r
-$labels['mon'] = 'Пон';\r
-$labels['tue'] = 'Вто';\r
-$labels['wed'] = 'Сря';\r
-$labels['thu'] = 'Чет';\r
-$labels['fri'] = 'Пет';\r
-$labels['sat'] = 'Съб';\r
-$labels['sunday'] = 'Неделя';\r
-$labels['monday'] = 'Понеделник';\r
-$labels['tuesday'] = 'Вторник';\r
-$labels['wednesday'] = 'Сряда';\r
-$labels['thursday'] = 'Четвъртък';\r
-$labels['friday'] = 'Петък';\r
-$labels['saturday'] = 'Събота';\r
-$labels['today'] = 'Днес';\r
-$labels['checkmail'] = 'Провери за нови писма';\r
-$labels['writenewmessage'] = 'Създай ново писмо';\r
-$labels['replytomessage'] = 'Отговори на писмото';\r
-$labels['replytoallmessage'] = 'Отговори до всички получатели';\r
-$labels['forwardmessage'] = 'Препрати писмото';\r
-$labels['deletemessage'] = 'Премести писмото в кошчето';\r
-$labels['printmessage'] = 'Разпечатай писмото';\r
-$labels['previousmessage'] = 'Предно писмо';\r
-$labels['previousmessages'] = 'Предна страница';\r
-$labels['firstmessage'] = 'Първо писмо';\r
-$labels['firstmessages'] = 'Първа страница';\r
-$labels['nextmessage'] = 'Следващо писмо';\r
-$labels['nextmessages'] = 'Следваща страница';\r
-$labels['lastmessage'] = 'Последно писмо';\r
-$labels['lastmessages'] = 'Последна страница';\r
-$labels['backtolist'] = 'Обратно към списъка';\r
-$labels['viewsource'] = 'Виж кода';\r
-$labels['select'] = 'Избери';\r
-$labels['all'] = 'Всички';\r
-$labels['none'] = 'Нищо';\r
-$labels['unread'] = 'Нови';\r
-$labels['compact'] = 'Свий';\r
-$labels['empty'] = 'Изпразни';\r
-$labels['purge'] = 'Изчисти';\r
-$labels['quota'] = 'Използвано място';\r
-$labels['unknown'] = 'няма информация';\r
-$labels['unlimited'] = 'няма ограничение';\r
-$labels['quicksearch'] = 'Бързо търсене';\r
-$labels['resetsearch'] = 'Изчисти търсенето и покажи всички писма';\r
-$labels['compose'] = 'Ново писмо';\r
-$labels['sendmessage'] = 'Изпрати писмото';\r
-$labels['savemessage'] = 'Запиши в Чернови';\r
-$labels['addattachment'] = 'Прикачи файл';\r
-$labels['charset'] = 'Charset';\r
-$labels['editortype'] = 'Вид редактор';\r
-$labels['returnreceipt'] = 'Обратна разписка';\r
-$labels['checkspelling'] = 'Проверка на правописа';\r
-$labels['resumeediting'] = 'Продължи черновата';\r
-$labels['revertto'] = 'Върни се към';\r
-$labels['attachments'] = 'Прикачени файлове';\r
-$labels['upload'] = 'Качи';\r
-$labels['close'] = 'Затвори';\r
-$labels['low'] = '**';\r
-$labels['lowest'] = '*';\r
-$labels['normal'] = '***';\r
-$labels['high'] = '****';\r
-$labels['highest'] = '*****';\r
-$labels['nosubject'] = '(няма заглавие)';\r
-$labels['showimages'] = 'Виж изображенията';\r
-$labels['htmltoggle'] = 'HTML';\r
-$labels['plaintoggle'] = 'тесктов';\r
-$labels['name'] = 'Прякор';\r
-$labels['firstname'] = 'Име';\r
-$labels['surname'] = 'Фамилия';\r
-$labels['email'] = 'E-Mail';\r
-$labels['addcontact'] = 'Добави';\r
-$labels['editcontact'] = 'Редактирай';\r
-$labels['edit'] = 'Редактирай';\r
-$labels['cancel'] = 'Отказ';\r
-$labels['save'] = 'Запиши';\r
-$labels['delete'] = 'Изтрии';\r
-$labels['newcontact'] = 'Нов контакт';\r
-$labels['deletecontact'] = 'Изтрии маркираните контакти';\r
-$labels['composeto'] = 'Напиши писмо до';\r
-$labels['contactsfromto'] = 'Контакти $from до $to от $count';\r
-$labels['print'] = 'Разпечатай';\r
-$labels['export'] = 'Експорт';\r
-$labels['previouspage'] = 'Предна страница';\r
-$labels['firstpage'] = 'Първа страница';\r
-$labels['nextpage'] = 'Следваща страница';\r
-$labels['lastpage'] = 'Последна страница';\r
-$labels['groups'] = 'Групи';\r
-$labels['personaladrbook'] = 'Лични адреси';\r
-$labels['settingsfor'] = 'Настройки за';\r
-$labels['preferences'] = 'Настройки';\r
-$labels['userpreferences'] = 'Потребителски настройки';\r
-$labels['editpreferences'] = 'Редактирай потребителските настройки';\r
-$labels['identities'] = 'Самоличност';\r
-$labels['manageidentities'] = 'Промяна на самоличностите за този акаунт';\r
-$labels['newidentity'] = 'Нова самоличност';\r
-$labels['newitem'] = 'Нова самоличност';\r
-$labels['edititem'] = 'Редактиране на самоличност';\r
-$labels['setdefault'] = 'По подразбиране';\r
-$labels['language'] = 'Език';\r
-$labels['timezone'] = 'Часова зона';\r
-$labels['pagesize'] = 'Редове на страница';\r
-$labels['signature'] = 'Подпис';\r
-$labels['dstactive'] = 'Маркирай при лятно време';\r
-$labels['htmleditor'] = 'Писане на HTML съобщения';\r
-$labels['htmlsignature'] = 'HTML подпис';\r
-$labels['previewpane'] = 'Панел за преглед';\r
-$labels['autosavedraft'] = 'Автоматично записвай чернова';\r
-$labels['everynminutes'] = 'всеки $n минути';\r
-$labels['never'] = 'никога';\r
-$labels['folder'] = 'Папка';\r
-$labels['folders'] = 'Папки';\r
-$labels['foldername'] = 'Име на папката';\r
-$labels['subscribed'] = 'Използвай';\r
-$labels['create'] = 'Създай';\r
-$labels['createfolder'] = 'Направи нова папка';\r
-$labels['rename'] = 'Преименувай';\r
-$labels['renamefolder'] = 'Преименувай папката';\r
-$labels['deletefolder'] = 'Изтрий';\r
-$labels['managefolders'] = 'Настройки на папките';\r
-$labels['sortby'] = 'Сортирай по';\r
-$labels['sortasc'] = 'Сортирай възходящо';\r
-$labels['sortdesc'] = 'Сортирай низходящо';\r
-\r
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/bg/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Todor Dragnev <todor.dragnev@gmail.com>                       |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Добре дошли в $product';
+$labels['username'] = 'Потребител';
+$labels['password'] = 'Парола';
+$labels['server'] = 'Сървър';
+$labels['login'] = 'Вход';
+$labels['logout'] = 'Изход';
+$labels['mail'] = 'Кутия';
+$labels['settings'] = 'Настройки';
+$labels['addressbook'] = 'Адреси';
+$labels['inbox'] = 'Входящи';
+$labels['drafts'] = 'Чернови';
+$labels['sent'] = 'Изпратени';
+$labels['trash'] = 'Кошче';
+$labels['junk'] = 'Спам';
+$labels['subject'] = 'Заглавие';
+$labels['from'] = 'От';
+$labels['to'] = 'Получател';
+$labels['cc'] = 'Копие до';
+$labels['bcc'] = 'Скрито копие до';
+$labels['replyto'] = 'Отговор на';
+$labels['date'] = 'Дата';
+$labels['size'] = 'Размер';
+$labels['priority'] = 'Приоритет';
+$labels['organization'] = 'Организация';
+$labels['reply-to'] = 'Отговор на';
+$labels['mailboxlist'] = 'Папки';
+$labels['messagesfromto'] = 'Съобщения $from до $to от $count';
+$labels['messagenrof'] = 'Съобщение $nr от $count';
+$labels['moveto'] = 'премести в...';
+$labels['download'] = 'изтегли';
+$labels['filename'] = 'Име на файла';
+$labels['filesize'] = 'Размер на файла';
+$labels['preferhtml'] = 'Показвай първо HTML версия';
+$labels['htmlmessage'] = 'HTML съобщение';
+$labels['prettydate'] = 'Кратки дати';
+$labels['addtoaddressbook'] = 'Добави в адресната книга';
+$labels['sun'] = 'Нед';
+$labels['mon'] = 'Пон';
+$labels['tue'] = 'Вто';
+$labels['wed'] = 'Сря';
+$labels['thu'] = 'Чет';
+$labels['fri'] = 'Пет';
+$labels['sat'] = 'Съб';
+$labels['sunday'] = 'Неделя';
+$labels['monday'] = 'Понеделник';
+$labels['tuesday'] = 'Вторник';
+$labels['wednesday'] = 'Сряда';
+$labels['thursday'] = 'Четвъртък';
+$labels['friday'] = 'Петък';
+$labels['saturday'] = 'Събота';
+$labels['today'] = 'Днес';
+$labels['checkmail'] = 'Провери за нови писма';
+$labels['writenewmessage'] = 'Създай ново писмо';
+$labels['replytomessage'] = 'Отговори на писмото';
+$labels['replytoallmessage'] = 'Отговори до всички получатели';
+$labels['forwardmessage'] = 'Препрати писмото';
+$labels['deletemessage'] = 'Изтрий писмото';
+$labels['movemessagetotrash'] = 'Премести писмото в кошчето';
+$labels['printmessage'] = 'Разпечатай писмото';
+$labels['previousmessage'] = 'Предно писмо';
+$labels['previousmessages'] = 'Предна страница';
+$labels['firstmessage'] = 'Първо писмо';
+$labels['firstmessages'] = 'Първа страница';
+$labels['nextmessage'] = 'Следващо писмо';
+$labels['nextmessages'] = 'Следваща страница';
+$labels['lastmessage'] = 'Последно писмо';
+$labels['lastmessages'] = 'Последна страница';
+$labels['backtolist'] = 'Обратно към списъка';
+$labels['viewsource'] = 'Виж кода';
+$labels['markmessages'] = 'Маркирай писмата';
+$labels['markread'] = 'Като прочетени';
+$labels['markunread'] = 'Като нови';
+$labels['select'] = 'Избери';
+$labels['all'] = 'Всички';
+$labels['none'] = 'Нищо';
+$labels['unread'] = 'Нови';
+$labels['compact'] = 'Свий';
+$labels['empty'] = 'Изпразни';
+$labels['purge'] = 'Изчисти';
+$labels['quota'] = 'Използвано място';
+$labels['unknown'] = 'няма информация';
+$labels['unlimited'] = 'няма ограничение';
+$labels['quicksearch'] = 'Бързо търсене';
+$labels['resetsearch'] = 'Изчисти търсенето и покажи всички писма';
+$labels['compose'] = 'Ново писмо';
+$labels['savemessage'] = 'Запиши в Чернови';
+$labels['sendmessage'] = 'Изпрати писмото';
+$labels['addattachment'] = 'Прикачи файл';
+$labels['charset'] = 'Кодировка';
+$labels['editortype'] = 'Вид редактор';
+$labels['returnreceipt'] = 'Обратна разписка';
+$labels['checkspelling'] = 'Провери правописа';
+$labels['resumeediting'] = 'Продължи черновата';
+$labels['revertto'] = 'Върни се към';
+$labels['attachments'] = 'Прикачени файлове';
+$labels['upload'] = 'Качи';
+$labels['close'] = 'Затвори';
+$labels['low'] = '**';
+$labels['lowest'] = '*';
+$labels['normal'] = '***';
+$labels['high'] = '****';
+$labels['highest'] = '*****';
+$labels['nosubject'] = '(няма заглавие)';
+$labels['showimages'] = 'Виж изображенията';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'текстов';
+$labels['addcc'] = 'Копие до';
+$labels['addbcc'] = 'Скрито копие до';
+$labels['addreplyto'] = 'Отговор на';
+$labels['mdnrequest'] = 'Подателят на писмото е пожелал да бъде уведомен, че сте го прочели. Желаете ли да изпратите обратна разписка?';
+$labels['receiptread'] = 'Обратна разписка (прочетено)';
+$labels['yourmessage'] = 'Това е обратна разписка за писмото Ви';
+$labels['receiptnote'] = 'Забележка: Тази разписка потвърждава само, че писмото е било показано на компютъра на получателят. Няма никаква гаранция, че получателят е прочел и/или разбрал съдържанието на писмото.';
+$labels['name'] = 'Кратко име';
+$labels['firstname'] = 'Име';
+$labels['surname'] = 'Фамилия';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Добави';
+$labels['editcontact'] = 'Редактирай';
+$labels['edit'] = 'Редактирай';
+$labels['cancel'] = 'Отказ';
+$labels['save'] = 'Запиши';
+$labels['delete'] = 'Изтрий';
+$labels['newcontact'] = 'Нов контакт';
+$labels['deletecontact'] = 'Изтрий маркираните контакти';
+$labels['composeto'] = 'Напиши писмо до';
+$labels['contactsfromto'] = 'Контакти $from до $to от $count';
+$labels['print'] = 'Разпечатай';
+$labels['export'] = 'Експортиране';
+$labels['previouspage'] = 'Предна страница';
+$labels['firstpage'] = 'Първа страница';
+$labels['nextpage'] = 'Следваща страница';
+$labels['lastpage'] = 'Последна страница';
+$labels['groups'] = 'Групи';
+$labels['personaladrbook'] = 'Лични адреси';
+$labels['settingsfor'] = 'Настройки за';
+$labels['preferences'] = 'Настройки';
+$labels['userpreferences'] = 'Потребителски настройки';
+$labels['editpreferences'] = 'Редактирай потребителските настройки';
+$labels['identities'] = 'Самоличност';
+$labels['manageidentities'] = 'Промяна на самоличностите за този акаунт';
+$labels['newidentity'] = 'Нова самоличност';
+$labels['newitem'] = 'Нова самоличност';
+$labels['edititem'] = 'Редактиране на самоличност';
+$labels['setdefault'] = 'По подразбиране';
+$labels['language'] = 'Език';
+$labels['timezone'] = 'Часова зона';
+$labels['pagesize'] = 'Редове на страница';
+$labels['signature'] = 'Подпис';
+$labels['dstactive'] = 'Маркирай при лятно време';
+$labels['htmleditor'] = 'Писане на HTML съобщения';
+$labels['htmlsignature'] = 'HTML подпис';
+$labels['previewpane'] = 'Панел за преглед';
+$labels['autosavedraft'] = 'Автоматично записвай чернова';
+$labels['everynminutes'] = 'всеки $n минути';
+$labels['never'] = 'никога';
+$labels['folder'] = 'Папка';
+$labels['folders'] = 'Папки';
+$labels['foldername'] = 'Име на папката';
+$labels['subscribed'] = 'Използвай';
+$labels['messagecount'] = 'Писма';
+$labels['create'] = 'Създай';
+$labels['createfolder'] = 'Направи нова папка';
+$labels['rename'] = 'Преименувай';
+$labels['renamefolder'] = 'Преименувай папката';
+$labels['deletefolder'] = 'Изтрий';
+$labels['managefolders'] = 'Настройки на папките';
+$labels['sortby'] = 'Сортирай по';
+$labels['sortasc'] = 'Сортирай възходящо';
+$labels['sortdesc'] = 'Сортирай низходящо';
+
 ?>
\ No newline at end of file
index bcdf61e7fa9291e7ac04a4b8f55596cace72e4c8..75d1904482cc7caeea8ddc5d9ae63f8b1f6c1c56 100644 (file)
@@ -1,77 +1,82 @@
-<?php\r
-\r
-/*\r
-\r
- +-----------------------------------------------------------------------+\r
- | language/bg/messages.inc                                              |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2005-2007 RoundCube Dev. - Switzerland                  |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Author: Todor Dragnev <todor.dragnev@gmail.com>                       |\r
- +-----------------------------------------------------------------------+\r
-\r
- @version $Id$\r
-\r
-*/\r
-\r
-$messages = array();\r
-$messages['loginfailed'] = 'Вход неуспешен';\r
-$messages['cookiesdisabled'] = 'Вашия браузър не приема cookies';\r
-$messages['sessionerror'] = 'Невалидна или изтекла сесия';\r
-$messages['imaperror'] = 'Свързване към IMAP сървъра е неуспешно';\r
-$messages['nomessagesfound'] = 'Няма съобщения';\r
-$messages['loggedout'] = 'Довиждане!';\r
-$messages['mailboxempty'] = 'Папката е празна';\r
-$messages['loading'] = 'Зареждане...';\r
-$messages['loadingdata'] = 'Зареждане на данни...';\r
-$messages['checkingmail'] = 'Проверка за нови писма...';\r
-$messages['sendingmessage'] = 'Изпращане на писмото...';\r
-$messages['messagesent'] = 'Писмото е изпратено успешно';\r
-$messages['savingmessage'] = 'Записване на писмото...';\r
-$messages['messagesaved'] = 'Писмото е записано в Чернови';\r
-$messages['successfullysaved'] = 'Записано';\r
-$messages['addedsuccessfully'] = 'Контакта е добавен в адресната книга';\r
-$messages['contactexists'] = 'Контакт с този e-mail адрес вече същестува';\r
-$messages['blockedimages'] = 'С оглед на Вашата сигурност, изображенията в това писмо са блокирани .';\r
-$messages['encryptedmessage'] = 'Това е кодирано писмо и не може да бъде показано. Съжаляваме!';\r
-$messages['nocontactsfound'] = 'Няма контакти';\r
-$messages['contactnotfound'] = 'Исканият контакт не е намерен';\r
-$messages['sendingfailed'] = 'Изпращането неуспешно';\r
-$messages['errorsaving'] = 'Възникна грешка при записването';\r
-$messages['errormoving'] = 'Писмото не може да бъде преместено';\r
-$messages['errordeleting'] = 'Писмото не може да бъде изтрито';\r
-$messages['deletecontactconfirm'] = 'Искате ли да изтриете маркираните контакти?';\r
-$messages['deletemessagesconfirm'] = 'Искате ли да изтриете маркираните съобщения?';\r
-$messages['deletefolderconfirm'] = 'Искате ли да изтриете тази папка?';\r
-$messages['purgefolderconfirm'] = 'Искате ли да изтриете всички писма в тази папка?';\r
-$messages['formincomplete'] = 'Не сте попълнили всички полета';\r
-$messages['noemailwarning'] = 'Моля въведете валиден e-mail адрес';\r
-$messages['nonamewarning'] = 'Моля въведете име';\r
-$messages['nopagesizewarning'] = 'Въведете брой редове на страница';\r
-$messages['norecipientwarning'] = 'Въведете поне един получател';\r
-$messages['nosubjectwarning'] = 'Полето "Заглавие" е празно. Искате ли да въведете ново заглавие?';\r
-$messages['nobodywarning'] = 'Изпрати това писмо без текст?';\r
-$messages['notsentwarning'] = 'Писмото не е изпратено. Искате ли да бъде унищожено?';\r
-$messages['noldapserver'] = 'Изберете LDAP сървър за търсене';\r
-$messages['nocontactsreturned'] = 'Не са намерени контакти';\r
-$messages['nosearchname'] = 'Моля въведете Име на контакта или e-mail адрес';\r
-$messages['searchsuccessful'] = '$nr намерени писма';\r
-$messages['searchnomatch'] = 'Търсенето не откри съвпадения';\r
-$messages['searching'] = 'Търсене...';\r
-$messages['checking'] = 'Проверка...';\r
-$messages['nospellerrors'] = 'Не са открити правописни грешки';\r
-$messages['folderdeleted'] = 'Папката е изтрита';\r
-$messages['deletedsuccessfully'] = 'Изтриването е успешно';\r
-$messages['converting'] = 'Премахване форматирането на писмото...';\r
-$messages['messageopenerror'] = 'Писмото не може да бъде заредено от сървъра';\r
-$messages['fileuploaderror'] = 'Грешка при прикачването на файла';\r
-$messages['filesizeerror'] = 'Прикаченият файл надвишава лимита от $size';\r
-$messages['copysuccess'] = 'Успешно копирани $nr адреса';\r
-$messages['copyerror'] = 'Грешка при копирането на адресите';\r
-$messages['sourceisreadonly'] = 'Този източник на адреси е само за четене';\r
-$messages['errorsavingcontact'] = 'Грешка при записването на адреса';\r
-\r
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/bg/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Todor Dragnev <todor.dragnev@gmail.com>                       |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Вход неуспешен';
+$messages['cookiesdisabled'] = 'Вашият браузър не приема cookies';
+$messages['sessionerror'] = 'Невалидна или изтекла сесия';
+$messages['imaperror'] = 'Неуспешно свързване към IMAP сървъра';
+$messages['nomessagesfound'] = 'Няма съобщения';
+$messages['loggedout'] = 'Довиждане!';
+$messages['mailboxempty'] = 'Папката е празна';
+$messages['loading'] = 'Зареждане...';
+$messages['loadingdata'] = 'Зареждане на данни...';
+$messages['checkingmail'] = 'Проверка за нови писма...';
+$messages['sendingmessage'] = 'Изпращане на писмото...';
+$messages['messagesent'] = 'Писмото е изпратено успешно';
+$messages['savingmessage'] = 'Записване на писмото...';
+$messages['messagesaved'] = 'Писмото е записано в Чернови';
+$messages['successfullysaved'] = 'Записано';
+$messages['addedsuccessfully'] = 'Контакта е добавен в адресната книга';
+$messages['contactexists'] = 'Контакт с този e-mail адрес вече същестува';
+$messages['blockedimages'] = 'С оглед на Вашата сигурност, изображенията в това писмо са блокирани.';
+$messages['encryptedmessage'] = 'Това е кодирано писмо и не може да бъде показано. Съжаляваме!';
+$messages['nocontactsfound'] = 'Няма контакти';
+$messages['contactnotfound'] = 'Исканият контакт не е намерен';
+$messages['sendingfailed'] = 'Изпращането неуспешно';
+$messages['errorsaving'] = 'Възникна грешка при записването';
+$messages['errormoving'] = 'Писмото не може да бъде преместено';
+$messages['errordeleting'] = 'Писмото не може да бъде изтрито';
+$messages['deletecontactconfirm'] = 'Искате ли да изтриете маркираните контакти?';
+$messages['deletemessagesconfirm'] = 'Искате ли да изтриете маркираните съобщения?';
+$messages['deletefolderconfirm'] = 'Искате ли да изтриете тази папка?';
+$messages['purgefolderconfirm'] = 'Искате ли да изтриете всички писма в тази папка?';
+$messages['formincomplete'] = 'Не сте попълнили всички полета';
+$messages['noemailwarning'] = 'Моля, въведете валиден e-mail адрес';
+$messages['nonamewarning'] = 'Моля, въведете име';
+$messages['nopagesizewarning'] = 'Въведете брой редове на страница';
+$messages['norecipientwarning'] = 'Въведете поне един получател';
+$messages['nosubjectwarning'] = 'Полето "Заглавие" е празно. Искате ли да въведете заглавие?';
+$messages['nobodywarning'] = 'Изпрати това писмо без текст?';
+$messages['notsentwarning'] = 'Писмото не е изпратено. Искате ли да бъде унищожено?';
+$messages['noldapserver'] = 'Изберете LDAP сървър за търсене';
+$messages['nocontactsreturned'] = 'Не са намерени контакти';
+$messages['nosearchname'] = 'Моля, въведете Име на контакта или e-mail адрес';
+$messages['searchsuccessful'] = '$nr намерени писма';
+$messages['searchnomatch'] = 'Търсенето не откри съвпадения';
+$messages['searching'] = 'Търсене...';
+$messages['checking'] = 'Проверка...';
+$messages['nospellerrors'] = 'Не са открити правописни грешки';
+$messages['folderdeleted'] = 'Папката е изтрита';
+$messages['deletedsuccessfully'] = 'Изтриването е успешно';
+$messages['converting'] = 'Премахване форматирането на писмото...';
+$messages['messageopenerror'] = 'Писмото не може да бъде заредено от сървъра';
+$messages['fileuploaderror'] = 'Грешка при прикачването на файла';
+$messages['filesizeerror'] = 'Прикаченият файл надвишава лимита от $size';
+$messages['copysuccess'] = 'Успешно копирани $nr адреса';
+$messages['copyerror'] = 'Грешка при копирането на адресите';
+$messages['sourceisreadonly'] = 'Този източник на адреси е само за четене';
+$messages['errorsavingcontact'] = 'Грешка при записването на адреса';
+$messages['movingmessage'] = 'Преместване на писмото...';
+$messages['receiptsent'] = 'Обратната разписка е изпратена.';
+$messages['errorsendingreceipt'] = 'Грешка при изпращането на обратна разписка.';
+$messages['nodeletelastidentity'] = 'Не можете да изтриете тази самоличност, трябва да имате поне една.';
+$messages['addsubfolderhint'] = 'Тази папка ще бъде създадена като подпапка на текущо избраната';
+
 ?>
\ No newline at end of file
diff --git a/program/localization/bs_BA/labels.inc b/program/localization/bs_BA/labels.inc
new file mode 100644 (file)
index 0000000..24249de
--- /dev/null
@@ -0,0 +1,234 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/bs_BA/labels.inc                                             |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Begzudin Omerovic <Begzudin.Omerovic@gmail.com>               |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 950 2008-01-04 08:04:53Z tomekp $
+
+*/
+
+$labels = array();
+
+// login page
+$labels['welcome']   = 'Dobrodošli na $product';
+$labels['username']  = 'Korisničko ime';
+$labels['password']  = 'Lozinka';
+$labels['server']    = 'Server';
+$labels['login']     = 'Prijava';
+
+// taskbar
+$labels['logout']   = 'Odjava';
+$labels['mail']     = 'Sanduče';
+$labels['settings'] = 'Podešavanja';
+$labels['addressbook'] = 'Imenik';
+
+// mailbox names
+$labels['inbox']  = 'Inbox';
+$labels['drafts'] = 'Drafts';
+$labels['sent']   = 'Poslano';
+$labels['trash']  = 'Trash';
+$labels['junk']   = 'Junk';
+
+// message listing
+$labels['subject'] = 'Naslov';
+$labels['from']    = 'Od';
+$labels['to']      = 'Za';
+$labels['cc']      = 'Cc';
+$labels['bcc']     = 'Bcc';
+$labels['replyto'] = 'Reply-To';
+$labels['date']    = 'Datum';
+$labels['size']    = 'Veličina';
+$labels['priority'] = 'Prioritet';
+$labels['organization'] = 'Organizacija';
+
+// aliases
+$labels['reply-to'] = $labels['replyto'];
+
+$labels['mailboxlist'] = 'Fascikle';
+$labels['messagesfromto'] = 'Poruke od $from do $to od ukupno $count';
+$labels['messagenrof'] = 'Poruka broj $nr od $count';
+
+$labels['moveto']   = 'prebaci u...';
+$labels['download'] = 'preuzmi (download)';
+
+$labels['filename'] = 'Ime datoteke';
+$labels['filesize'] = 'Veličina datoteke';
+
+$labels['preferhtml'] = 'HTML format u prednosti';
+$labels['htmlmessage'] = 'HTML format poruke';
+$labels['prettydate'] = 'Formatiran datum';
+
+$labels['addtoaddressbook'] = 'Dodaj u imenik';
+
+// weekdays short
+$labels['sun'] = 'Ned';
+$labels['mon'] = 'Pon';
+$labels['tue'] = 'Uto';
+$labels['wed'] = 'Sri';
+$labels['thu'] = 'Čet';
+$labels['fri'] = 'Pet';
+$labels['sat'] = 'Sub';
+
+// weekdays long
+$labels['sunday']    = 'Nedjelja';
+$labels['monday']    = 'Ponedjeljak';
+$labels['tuesday']   = 'Utorak';
+$labels['wednesday'] = 'Srijeda';
+$labels['thursday']  = 'Četvrtak';
+$labels['friday']    = 'Petak';
+$labels['saturday']  = 'Subota';
+
+$labels['today'] = 'danas';
+
+// toolbar buttons
+$labels['checkmail']        = 'Provjera novih poruka';
+$labels['writenewmessage']  = 'Nova poruka';
+$labels['replytomessage']   = 'Odgovori na poruku';
+$labels['replytoallmessage'] = 'Odgovori pošiljaocu i svim primaocima';
+$labels['forwardmessage']   = 'Proslijedi poruku';
+$labels['deletemessage']    = 'Prebaci poruku u korpu (Trash)';
+$labels['printmessage']     = 'Odštampaj poruku';
+$labels['previousmessage'] = 'Prikaži prethodnu poruku';
+$labels['previousmessages'] = 'Prikaži prethodni skup poruka';
+$labels['nextmessages']     = 'Prikaži sljedeći skup poruka';
+$labels['lastmessage']     = 'Prikaži zadnju poruku';
+$labels['lastmessages']     = 'Prikaži zadnji skup poruka';
+$labels['backtolist']       = 'Povratak na listu poruka';
+$labels['viewsource']       = 'Prikaži poruku u izvornom obliku';
+
+$labels['select'] = 'Obilježi';
+$labels['all'] = 'Sve';
+$labels['none'] = 'Nijednu';
+$labels['unread'] = 'Nepročitane';
+
+$labels['compact'] = 'Skraćeno';
+$labels['empty'] = 'Izprazni';
+$labels['purge'] = 'Očisti';
+
+$labels['quota'] = 'Kvota';
+$labels['unknown']  = 'nepoznato';
+$labels['unlimited']  = 'beskonačna';
+
+$labels['quicksearch']  = 'Brza pretraga';
+$labels['resetsearch']  = 'Prikaži sve poruke';
+
+
+// message compose
+$labels['compose']  = 'Nova poruka';
+$labels['savemessage']  = 'Sačuvaj u \'Drafts\'';
+$labels['sendmessage']  = 'Pošalji poruku';
+$labels['addattachment']  = 'Priloži datoteku';
+$labels['charset']  = 'Skup znakova';
+$labels['editortype']  = 'Vrsta editora';
+$labels['returnreceipt'] = 'Potvrda o prispijeću poruke';
+
+$labels['checkspelling'] = 'Provjera pravopisa';
+$labels['resumeediting'] = 'Povratak u režim pisanja';
+$labels['revertto'] = 'Vrati na';
+
+$labels['attachments'] = 'Dodatci (Attachments)';
+$labels['upload'] = 'Dodaj';
+$labels['close']  = 'Zatvori';
+
+$labels['low']     = 'Nizak';
+$labels['lowest']  = 'Najniži';
+$labels['normal']  = 'Srednji';
+$labels['high']    = 'Visok';
+$labels['highest'] = 'Najviši';
+
+$labels['nosubject']  = '(bez naslova)';
+$labels['showimages'] = 'Prikaži slike';
+$labels['htmltoggle']  = 'HTML';
+$labels['plaintoggle']  = 'Običan tekst';
+
+// address boook
+$labels['name']      = 'Puno ime';
+$labels['firstname'] = 'Ime';
+$labels['surname']   = 'Prezime';
+$labels['email']     = 'E-Mail';
+
+$labels['addcontact'] = 'Dodaj novi kontakt';
+$labels['editcontact'] = 'Izmijeni kontakt';
+
+$labels['edit']   = 'Izmijeni';
+$labels['cancel'] = 'Otkaži';
+$labels['save']   = 'Sačuvaj';
+$labels['delete'] = 'Obriši';
+
+$labels['newcontact']     = 'Dodaj novi kontakt';
+$labels['deletecontact']  = 'Obriši odabrane kontakte';
+$labels['composeto']      = 'Napiši mail...';
+$labels['contactsfromto'] = 'Kontakti od $from do $to od ukupno $count';
+$labels['print']          = 'Štampaj';
+$labels['export']         = 'Izvezi';
+
+$labels['previouspage']   = 'Prikaži predhodnu stranicu';
+$labels['firstpage']      = 'Prikaži prvi skup';
+$labels['nextpage']       = 'Prikaži sljedeću stranicu';
+$labels['lastpage']       = 'Prikaži zadnji skup';
+
+// LDAP search
+$labels['ldapsearch'] = 'Pretraga LDAP imenika';
+
+$labels['ldappublicsearchname']    = 'Ime kontakta';
+$labels['ldappublicsearchtype'] = 'Potpuna fraza?';
+$labels['ldappublicserverselect'] = 'Odaberi servere';
+$labels['ldappublicsearchfield'] = 'Pretraži na';
+$labels['ldappublicsearchform'] = 'Pretraži kontakte';
+$labels['ldappublicsearch'] = 'Pretraga';
+
+
+// settings
+$labels['settingsfor']  = 'Podešavanja za';
+
+$labels['preferences']  = 'Podešavanja';
+$labels['userpreferences']  = 'Opšta podešavanja';
+$labels['editpreferences']  = 'Izmjena opštih podešavanja';
+
+$labels['identities']  = 'Identiteti';
+$labels['manageidentities']  = 'Podesi identitete za ovaj nalog';
+$labels['newidentity']  = 'Dodaj identitet';
+
+$labels['newitem']  = 'New item';
+$labels['edititem']  = 'Edit item';
+
+$labels['setdefault']  = 'Postavi glavnim';
+$labels['language']  = 'Jezik';
+$labels['timezone']  = 'Vremenska zona';
+$labels['pagesize']  = 'Redova po stranici';
+$labels['signature'] = 'Potpis';
+$labels['dstactive']  = 'Ljetno pomjeranje vremena';
+
+$labels['htmleditor']= 'Pisi HTML poruke';
+$labels['htmlsignature'] ='HTML potpis';
+$labels['previewpane'] ='Pokaži prethodu poruku';
+$labels['autosavedraft'] ='Automatski spasi predlozak';
+$labels['everynminutes'] ='svakih $n minuta';
+$labels['never'] ='nikada';
+
+$labels['folder']  = 'Fascikla';
+$labels['folders']  = 'Fascikle';
+$labels['foldername']  = 'Ime fascikle';
+$labels['subscribed']  = 'Pretplaćen';
+$labels['create']  = 'Napravi';
+$labels['createfolder']  = 'Napravi novu fasciklu';
+$labels['rename'] = 'Preimenuj';
+$labels['renamefolder'] = 'Preimenuj fasciklu';
+$labels['deletefolder']  = 'Obriši fasciklu';
+$labels['managefolders']  = 'Podesi fasciklu';
+
+$labels['sortby'] = 'Sortiraj po';
+$labels['sortasc']  = 'Sortiraj rastućim nizom';
+$labels['sortdesc'] = 'Sortiraj opadajućim nizom';
+
+?>
\ No newline at end of file
diff --git a/program/localization/bs_BA/messages.inc b/program/localization/bs_BA/messages.inc
new file mode 100644 (file)
index 0000000..197ae06
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/bs_BA/messages.inc                                           |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Begzudin Omerovic <Begzudin.Omerovic@gmail.com>               |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 950 2008-01-04 08:04:53Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed']  = 'Prijava neuspješna';
+$messages['cookiesdisabled'] = 'Vaš pretraživač ne podržava kolačiće (cookies)';
+$messages['sessionerror'] = 'Sesija nije validna ili je istekla';
+$messages['imaperror'] = 'Neuspješna konekcija na IMAP server';
+$messages['nomessagesfound'] = 'Nema poruka u sandučetu';
+$messages['loggedout'] = 'Uspješno ste se odjavili.';
+$messages['mailboxempty'] = 'Sanduče je prazno';
+$messages['loading'] = 'Učitavanje...';
+$messages['loadingdata'] = 'Učitavanje podataka...';
+$messages['checkingmail'] = 'Provjera novih poruka u toku...';
+$messages['sendingmessage'] = 'Poruka se šalje...';
+$messages['messagesent'] = 'Poruka je uspješno poslana';
+$messages['savingmessage'] = 'Poruka se snima...';
+$messages['messagesaved'] = 'Poruka uspješno sačuvana u \'Drafts\'';
+$messages['successfullysaved'] = 'Snimanje uspješno obavljeno';
+$messages['addedsuccessfully'] = 'Kontakt uspješno dodat u imenik';
+$messages['contactexists'] = 'Kontakt sa ovom e-mail adresom već postoji u imeniku';
+$messages['blockedimages'] = 'Zbog zaštite privatnosti, slike sa drugih servera su blokirane.';
+$messages['encryptedmessage'] = 'Ova poruka je šifrovana pa se ne može prikazati';
+$messages['nocontactsfound'] = 'Imenik je prazan';
+$messages['sendingfailed'] = 'Greška pri slanju poruke';
+$messages['errorsaving'] = 'Greška pri snimanju';
+$messages['errormoving'] = 'Greška pri premještanju poruke';
+$messages['errordeleting'] = 'Greška pri brisanju poruke';
+$messages['deletecontactconfirm']  = 'Da li želite da obrišete izabrane kontakte?';
+$messages['deletemessagesconfirm'] = 'Da li stvarno želite izbrisati poruku(e)?';
+$messages['deletefolderconfirm']  = 'Da li zaista želite da obrišete ovu fasciklu?';
+$messages['purgefolderconfirm']  = 'Da li zaista želite da obrišete sve poruke u fascikli?';
+$messages['formincomplete'] = 'Forma nije u cijelosti popunjena';
+$messages['noemailwarning'] = 'Unesite ispravnu e-mail adresu';
+$messages['nonamewarning']  = 'Unesite ime';
+$messages['nopagesizewarning'] = 'Unesite veličinu stranice';
+$messages['norecipientwarning'] = 'Unesite primaoca / primaoce (ZA)';
+$messages['nosubjectwarning']  = 'Polje \'Naslov\' je prazno. Želite li da unesete naslov poruke?';
+$messages['nobodywarning'] = 'Da li želite da pošaljete poruku bez teksta?';
+$messages['notsentwarning'] = 'Poruka nije poslana. Da li želite da odbacite ovu poruku?';
+$messages['noldapserver'] = 'Unesite LDAP server za pretragu';
+$messages['nocontactsreturned'] = 'Nije pronađen ni jedan kontakt';
+$messages['nosearchname'] = 'Unesite ime ili e-mail adresu';
+$messages['searchsuccessful'] = 'Broj pronađenih poruka: $nr';
+$messages['searchnomatch'] = 'Tražena fraza nije pronađena ni u jednoj poruci';
+$messages['searching'] = 'Pretraga u toku...';
+$messages['checking'] = 'Provjera u toku...';
+$messages['nospellerrors'] = 'Nije pronađena ni jedna pravopisna greška';
+$messages['folderdeleted'] = 'Fascikla uspješno obrisana';
+$messages['deletedsuccessfully'] = 'Uspješno izbrisano';
+$messages['converting'] = 'Vračeno formatiranje iz poruke ...';
+$messages['messageopenerror'] = 'Nije učitana poruka sa servera';
+
+?>
\ No newline at end of file
index ffedb30ff6dda09c90366ca2ace8e534b90aefdb..f238a02e5dcc1d9d15e3c9fcf874b4ff154974b8 100644 (file)
@@ -6,7 +6,7 @@
  | language/ca/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Simo <sim6@graciasensefils.net>                               |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 872 2007-10-16 09:27:16Z yllar $
+ @version $Id: labels.inc 1143 2008-02-26 20:50:10Z yllar $
 
 */
 
@@ -88,6 +88,9 @@ $labels['lastmessage'] = 'Mostrar l\'últim missatge';
 $labels['lastmessages'] = 'Mostrar els últims missatges';
 $labels['backtolist'] = 'Tornar a la llista de missatges';
 $labels['viewsource'] = 'Visualitza el codi font';
+$labels['markmessages'] = 'Marca missatges';
+$labels['markread'] = 'Com a llegits';
+$labels['markunread'] = 'Com a no llegits';
 $labels['select'] = 'Seleccionar';
 $labels['all'] = 'Tots';
 $labels['none'] = 'Cap';
@@ -125,6 +128,10 @@ $labels['plaintoggle'] = 'Text pla';
 $labels['addcc'] = 'Afegir Cc';
 $labels['addbcc'] = 'Afegir Bcc';
 $labels['addreplyto'] = 'Afegir Reply-To';
+$labels['mdnrequest'] = 'El remitent d\'aquest missatge ha demanat ser notificat quan llegeixis aquest missatge. Vols notificar al remitent?';
+$labels['receiptread'] = 'Confirmació de recepció';
+$labels['yourmessage'] = 'Aquesta és una confirmació de recepció per al teu missatge';
+$labels['receiptnote'] = 'Nota: Aquesta confirmació solament indica que el missatge ha estat mostrat en l\'ordinador del destinatari. No hi ha garantia que el destinatari hagi llegit o entès el contingut del missatge.';
 $labels['name'] = 'Nom a mostrar';
 $labels['firstname'] = 'Nom';
 $labels['surname'] = 'Cognom';
@@ -172,6 +179,7 @@ $labels['folder'] = 'Carpeta';
 $labels['folders'] = 'Carpetes';
 $labels['foldername'] = 'Nom de carpeta';
 $labels['subscribed'] = 'Subscriure\'s';
+$labels['messagecount'] = 'Missatges';
 $labels['create'] = 'Crear';
 $labels['createfolder'] = 'Crear nova carpeta';
 $labels['rename'] = 'Canvia el nom';
index 143db699737887fea31d9da5439481bfeecfeb62..5f2a13183251c3505f5f21cb9f6ebe8fd6c6306a 100644 (file)
@@ -6,7 +6,7 @@
  | language/ca/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Simo <sim6@graciasensefils.net>                               |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 872 2007-10-16 09:27:16Z yllar $
+ @version $Id: messages.inc 1143 2008-02-26 20:50:10Z yllar $
 
 */
 
@@ -75,5 +75,9 @@ $messages['copyerror'] = 'No s\'ha pogut copiar cap adreça';
 $messages['sourceisreadonly'] = 'Aquesta adreça és només de lectura.';
 $messages['errorsavingcontact'] = 'No s\'ha pogut guardar l\'adreça de contacte';
 $messages['movingmessage'] = 'Movent el missatge...';
+$messages['receiptsent'] = 'Confirmació de lectura enviada satisfactòriament';
+$messages['errorsendingreceipt'] = 'No es pot enviar la confirmació';
+$messages['nodeletelastidentity'] = 'No pots eliminar aquesta identitat, és l\'última.';
+$messages['addsubfolderhint'] = 'Aquesta carpeta serà creada com a subcarpeta de la seleccionada actualment';
 
 ?>
\ No newline at end of file
index a8cb285328c1ecbaaca847999f1b007cbe0997b0..5e8ef821e442f3b227e6dc017eaf1874c5e25e53 100644 (file)
@@ -6,15 +6,16 @@
  | language/cz/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | All rights reserved.                                                  |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Martin Mrajca <martin@moonlake.cz>                            |
  |        joe <joe@humlak.cz>                                            |
+ |        Jiri Kaderavek <jiri.kaderavek@webstep.net>                    |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 869 2007-10-15 13:27:08Z yllar $
+ @version $Id: labels.inc 1068 2008-02-13 19:24:23Z yllar $
 
 */
 
@@ -88,6 +89,9 @@ $labels['lastmessage'] = 'Zobrazit poslední zprávu';
 $labels['lastmessages'] = 'Zobrazit poslední zprávy';
 $labels['backtolist'] = 'Zpět do seznamu zpráv';
 $labels['viewsource'] = 'Zobrazit zdroj';
+$labels['markmessages'] = 'Označ zprávy';
+$labels['markread'] = 'Jako přečtené';
+$labels['markunread'] = 'Jako nepřečtené';
 $labels['select'] = 'Vybrat';
 $labels['all'] = 'Vše';
 $labels['none'] = 'Nic';
@@ -125,6 +129,10 @@ $labels['plaintoggle'] = 'Prostý text';
 $labels['addcc'] = 'Přidat pole "Kopie"';
 $labels['addbcc'] = 'Přidat pole "Skrytá Kopie"';
 $labels['addreplyto'] = 'Přidat pole "Odpověď"';
+$labels['mdnrequest'] = 'Odesílatel této zprávy si přeje být upozorněn na to, že jste zprávu obdrželi. Chcete přijetí zprávy potvrdit?';
+$labels['receiptread'] = 'Potvrzení o přijetí zprávy';
+$labels['yourmessage'] = 'Toto je potvrzení o přijetí Vaší zprávy';
+$labels['receiptnote'] = 'Poznámka: Toto potvrzení negarantuje, že zpráva byla příjemce přečtena a že porozuměl jejímu obsahu.';
 $labels['name'] = 'Zobrazit jméno';
 $labels['firstname'] = 'Jméno';
 $labels['surname'] = 'Příjmení';
@@ -172,6 +180,7 @@ $labels['folder'] = 'Složka';
 $labels['folders'] = 'Složky';
 $labels['foldername'] = 'Jméno složky';
 $labels['subscribed'] = 'Vybráno';
+$labels['messagecount'] = 'Počet zpráv';
 $labels['create'] = 'Vytvořit';
 $labels['createfolder'] = 'Vytvořit novou složku';
 $labels['rename'] = 'Přejmenovat';
index 97c30420b24ebb0a4aacf9fdeec3d1b26ffb5c88..20c5d488a8d84d26ed8d8ec6fc001c1c5dc763ea 100644 (file)
@@ -6,15 +6,16 @@
  | language/cz/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | All rights reserved.                                                  |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Martin Mrajca <martin@moonlake.cz>                            |
  |        joe <joe@humlak.cz>                                            |
+ |        Jiri Kaderavek <jiri.kaderavek@webstep.net>                    |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 869 2007-10-15 13:27:08Z yllar $
+ @version $Id: messages.inc 1068 2008-02-13 19:24:23Z yllar $
 
 */
 
@@ -75,5 +76,9 @@ $messages['copyerror'] = 'Nemohu zkopírovat žádnou adresu';
 $messages['sourceisreadonly'] = 'Tento zdroj adres je pouze pro čtení';
 $messages['errorsavingcontact'] = 'Nemohu uložit adresu kontaktu';
 $messages['movingmessage'] = 'Přesouvám zprávu...';
+$messages['receiptsent'] = 'Potvrzení o přřijetí zprávy odesláno';
+$messages['errorsendingreceipt'] = 'Potvrzení o přijetí zprávy nebylo možné odeslat';
+$messages['nodeletelastidentity'] = 'Alespoň jedna identita musí být ponechána. Identitu nelze odstranit.';
+$messages['addsubfolderhint'] = 'Tato složka bude vytvořena jako podsložka aktuálně zvolené složky';
 
 ?>
\ No newline at end of file
index 76b35d1894886f46e544a638c6aecbf0c7986bf8..a3266588bb6105f7b2549f8af4862168050821e8 100644 (file)
@@ -6,8 +6,8 @@
  | language/da/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | All rights reserved.                                                  |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Martin Moeller <martin@liga.dk>                               |
@@ -15,7 +15,7 @@
  |         Søren Aggeboe <soren@aggeboe.dk>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 886 2007-10-19 07:24:53Z yllar $
+ @version $Id: labels.inc 1160 2008-03-01 15:32:44Z yllar $
 
 */
 
@@ -26,7 +26,7 @@ $labels['password'] = 'Adgangskode';
 $labels['server'] = 'Server';
 $labels['login'] = 'Log på';
 $labels['logout'] = 'Log af';
-$labels['mail'] = 'Email';
+$labels['mail'] = 'E-mail';
 $labels['settings'] = 'Personlige indstillinger';
 $labels['addressbook'] = 'Adressebog';
 $labels['inbox'] = 'Indbakke';
@@ -89,6 +89,9 @@ $labels['lastmessage'] = 'Vis sidste besked';
 $labels['lastmessages'] = 'Vis sidste sæt beskeder';
 $labels['backtolist'] = 'Tilbage til beskedlisten';
 $labels['viewsource'] = 'Vis rå besked';
+$labels['markmessages'] = 'Markér beskeder';
+$labels['markread'] = 'Som læst';
+$labels['markunread'] = 'Som ulæst';
 $labels['select'] = 'Vælg';
 $labels['all'] = 'Alle';
 $labels['none'] = 'Ingen';
@@ -126,10 +129,14 @@ $labels['plaintoggle'] = 'Almindelig tekst';
 $labels['addcc'] = 'Tilføj Cc';
 $labels['addbcc'] = 'Tilføj Bcc';
 $labels['addreplyto'] = 'Tilføj Svar-Til adresse';
+$labels['mdnrequest'] = 'Afsenderen af denne besked har bedt om at modtage en bekræftelse når du læser beskeden. Vil du sende kvittering for læsning?';
+$labels['receiptread'] = 'Send kvittering for læsning';
+$labels['yourmessage'] = 'Dette er en kvittering for at din besked er blevet vist';
+$labels['receiptnote'] = 'Bemærk: Denne kvittering bekræfter udelukkende at beskeden blev vist på modtagerens computer. Der er ingen garanti for at modtageren har læst eller forstået beskedens indhold.';
 $labels['name'] = 'Vist navn';
 $labels['firstname'] = 'Fornavn';
 $labels['surname'] = 'Efternavn';
-$labels['email'] = 'Email';
+$labels['email'] = 'E-mail';
 $labels['addcontact'] = 'Tilføj en ny kontakt';
 $labels['editcontact'] = 'Redigér kontakt';
 $labels['edit'] = 'Redigér';
@@ -169,10 +176,11 @@ $labels['previewpane'] = 'Forhåndsvisning';
 $labels['autosavedraft'] = 'Gem kladde automatisk';
 $labels['everynminutes'] = 'hver $n. minut';
 $labels['never'] = 'aldrig';
-$labels['folder'] = 'Mapper';
+$labels['folder'] = 'Mappe';
 $labels['folders'] = 'Mapper';
 $labels['foldername'] = 'Mappenavn';
 $labels['subscribed'] = 'Abonneret';
+$labels['messagecount'] = 'Beskeder';
 $labels['create'] = 'Opret';
 $labels['createfolder'] = 'Opret ny mappe';
 $labels['rename'] = 'Omdøb';
@@ -183,4 +191,4 @@ $labels['sortby'] = 'Sortér efter';
 $labels['sortasc'] = 'Ældste først';
 $labels['sortdesc'] = 'Nyeste først';
 
-?>
\ No newline at end of file
+?>
index b0e6306596c2613ad46f1a58d8a44ada0145b349..d960380b499b4f531a4b69bc88cc41ec79625b04 100644 (file)
@@ -6,8 +6,8 @@
  | language/da/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | All rights reserved.                                                  |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author : Martin Moeller <martin@liga.dk>                              |
@@ -15,7 +15,7 @@
  |         Søren Aggeboe <soren@aggeboe.dk>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 886 2007-10-19 07:24:53Z yllar $
+ @version $Id: messages.inc 1160 2008-03-01 15:32:44Z yllar $
 
 */
 
@@ -36,21 +36,21 @@ $messages['savingmessage'] = 'Gemmer besked...';
 $messages['messagesaved'] = 'Beskeden er gemt i kladdemappen';
 $messages['successfullysaved'] = 'Det lykkedes at gemme';
 $messages['addedsuccessfully'] = 'Kontakten blev tilføjet adressebogen';
-$messages['contactexists'] = 'Der er allerede en kontakt med denne email adresse';
+$messages['contactexists'] = 'Der er allerede en kontakt med denne e-mail adresse';
 $messages['blockedimages'] = 'For at beskytte dit privatliv er billeder fra internetservere blokeret i denne besked.';
 $messages['encryptedmessage'] = 'Beskeden er krypteret og kan ikke vises. Beklager!';
 $messages['nocontactsfound'] = 'Ingen kontakter blev fundet';
 $messages['contactnotfound'] = 'Den søgte kontakt blev ikke fundet';
-$messages['sendingfailed'] = 'Kunne ikke sende beskeden';
+$messages['sendingfailed'] = 'Beskeden kunne ikke sendes';
 $messages['errorsaving'] = 'Der opstod en fejl ved lagring af data';
-$messages['errormoving'] = 'Kunne ikke flytte beskeden';
-$messages['errordeleting'] = 'Kunne ikke slette beskeden';
+$messages['errormoving'] = 'Beskeden kunne ikke flyttes';
+$messages['errordeleting'] = 'Beskeden kunne ikke slettes';
 $messages['deletecontactconfirm'] = 'Vil du virkelig slette den/de valgte kontakt(er)?';
 $messages['deletemessagesconfirm'] = 'Vil du virkelig slette den/de valgte besked(er)?';
-$messages['deletefolderconfirm'] = 'Vil du virkelig slette den vagte mappe';
+$messages['deletefolderconfirm'] = 'Vil du virkelig slette den valgte mappe';
 $messages['purgefolderconfirm'] = 'Vil du virkelig slette alle beskeder i denne mappe?';
 $messages['formincomplete'] = 'Formularen var ikke fuldstændig fyldt ud';
-$messages['noemailwarning'] = 'Indtast venligst en gyldig email adresse';
+$messages['noemailwarning'] = 'Indtast venligst en gyldig e-mail adresse';
 $messages['nonamewarning'] = 'Angiv venligst et navn';
 $messages['nopagesizewarning'] = 'Angiv sidestørrelsen';
 $messages['norecipientwarning'] = 'Indtast mindst én modtager';
@@ -59,14 +59,14 @@ $messages['nobodywarning'] = 'Send denne besked uden tekst?';
 $messages['notsentwarning'] = 'Beskeden er ikke blevet sendt. Vil du kassere din besked?';
 $messages['noldapserver'] = 'Vælg venligst hvilken LDAP-server der skal søges i';
 $messages['nocontactsreturned'] = 'Ingen kontakter blev fundet';
-$messages['nosearchname'] = 'Indtast venligst en kontakts navn eller email adresse';
+$messages['nosearchname'] = 'Indtast venligst en kontakts navn eller e-mail adresse';
 $messages['searchsuccessful'] = 'Fandt $nr beskeder';
 $messages['searchnomatch'] = 'Søgningen fandt ingen beskeder';
 $messages['searching'] = 'Søger...';
 $messages['checking'] = 'Tjekker...';
 $messages['nospellerrors'] = 'Ingen stavefejl fundet';
-$messages['folderdeleted'] = 'Mappen blev slettet korrekt';
-$messages['deletedsuccessfully'] = 'Slettet korrekt';
+$messages['folderdeleted'] = 'Mappen er slettet';
+$messages['deletedsuccessfully'] = 'Slettet';
 $messages['converting'] = 'Fjerner formatering fra besked...';
 $messages['messageopenerror'] = 'Beskeden kunne ikke hentes fra serveren';
 $messages['fileuploaderror'] = 'Den indsatte fil fejlede';
@@ -76,5 +76,9 @@ $messages['copyerror'] = 'Kunne ikke kopiere adresserne';
 $messages['sourceisreadonly'] = 'Denne adressekilde er kun til læsning';
 $messages['errorsavingcontact'] = 'Kunne ikke gemme kontakt adressen';
 $messages['movingmessage'] = 'Flytter besked...';
+$messages['receiptsent'] = 'Kvittering for læsning er sendt';
+$messages['errorsendingreceipt'] = 'Kvitteringen kunne ikke sendes';
+$messages['nodeletelastidentity'] = 'Du kan ikke slette denne identitet, da det er den eneste der er tilbage.';
+$messages['addsubfolderhint'] = 'Denne mappe vil blive oprettet som en undermappe af den der er valgt i øjeblikket.';
 
-?>
\ No newline at end of file
+?>
index 425ac229aa4c88af05a645c6983a6e76d5c88a4f..7e16ab944fb7bf8b9f9c9cb83f8abeca82040ba2 100644 (file)
@@ -6,7 +6,7 @@
  | language/de_CH/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  | Corrections: Alexander Stiebing <ja.stiebing[NOSPAM]@web.de>          |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 816 2007-09-26 08:13:21Z thomasb $
+ @version $Id: labels.inc 1075 2008-02-13 23:43:04Z thomasb $
 
 */
 
@@ -110,6 +110,9 @@ $labels['lastmessage']      = 'Die letzte Nachricht anzeigen';
 $labels['lastmessages']     = 'Die letzten Nachrichten anzeigen';
 $labels['backtolist']       = 'Zurück zur Liste';
 $labels['viewsource']       = 'Quelltext anzeigen';
+$labels['markmessages']     = 'Nachrichten markieren';
+$labels['markread']         = 'Als gelesen';
+$labels['markunread']       = 'Als ungelesen';
 
 $labels['select'] = 'Auswählen';
 $labels['all']    = 'Alle';
@@ -161,6 +164,11 @@ $labels['addcc'] = 'Cc hinzufügen';
 $labels['addbcc'] = 'Bcc hinzufügen';
 $labels['addreplyto'] = 'Antwortadresse hinzufügen';
 
+// mdn
+$labels['mdnrequest'] = 'Der Sender dieser Nachricht hat eine Empfangsbestätigung angefordert. Möchten Sie diese jetzt senden?';
+$labels['receiptread'] = 'Empfangsbestätigung (gelesen)';
+$labels['yourmessage'] = 'Dieses ist eine Empfangsbestätigung für Ihre Nachricht';
+$labels['receiptnote'] = 'Hinweis: Der Empfänger hat den Empfang der Nachricht bestätigt. Dieses ist keine Garantie, dass die Nachricht gelesen und verstanden wurde.';
 
 // address book // Adressbuch
 $labels['name']      = 'Anzeigename';
@@ -224,6 +232,7 @@ $labels['folder']  = 'Ordner';
 $labels['folders']  = 'Ordner';
 $labels['foldername']  = 'Ordnername';
 $labels['subscribed']  = 'Abonniert';
+$labels['messagecount'] = 'Nachrichten';
 $labels['create']      = 'Erstellen';
 $labels['createfolder']  = 'Neuen Ordner erstellen';
 $labels['rename'] = 'Umbenennen';
index 48a959105904566c50251f6c9bdaa9744e4f44ab..492fd61d0a46b365828ae1d50efe331f04753797 100644 (file)
@@ -6,14 +6,14 @@
  | language/de_CH/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 549 2007-05-01 18:53:56Z thomasb $
+ @version $Id: messages.inc 1075 2008-02-13 23:43:04Z thomasb $
 
 */
 
@@ -75,4 +75,11 @@ $messages['copyerror'] = 'Die Adressen konnten nicht kopiert werden';
 $messages['sourceisreadonly'] = 'Das Adressverzeichnis kann nicht verändert werden';
 $messages['errorsavingcontact'] = 'Die Änderungen konnten nicht gespeichert werden';
 
+$messages['movingmessage'] = 'Die E-Mail wird verschoben...';
+$messages['receiptsent'] = 'Bestätigung erfolgreich gesendet';
+$messages['errorsendingreceipt'] = 'Bestätigung konnte nicht gesendet werden';
+
+$messages['nodeletelastidentity'] = 'Sie können diesen Absender nicht löschen';
+$messages['addsubfolderhint'] = 'Wird als Unterdornder des aktuell selektieren Ordners erstellt';
+
 ?>
\ No newline at end of file
index 2f69c147d4b9c4b4b1d59a1c0fc914e7aa615285..9181bc2bd2851c08561a1c4d76d40ad8755fe392 100644 (file)
@@ -6,14 +6,14 @@
  | language/de_DE/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Stephan Diehl <info@sd-edv.de>                                |
+ | Author: Marcel Schlesinger <info@marcel-schlesinger.de>               |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 858 2007-10-04 10:14:19Z Stiwi $
+ @version $Id: labels.inc 1107 2008-02-17 18:32:46Z thomasb $
 
 */
 
@@ -87,6 +87,9 @@ $labels['lastmessage'] = 'Die letzte Nachricht anzeigen';
 $labels['lastmessages'] = 'Die letzten Nachrichten anzeigen';
 $labels['backtolist'] = 'Zurück zur Liste';
 $labels['viewsource'] = 'Quelltext anzeigen';
+$labels['markmessages'] = 'Nachrichten markieren';
+$labels['markread'] = 'Als gelesen';
+$labels['markunread'] = 'Als ungelesen';
 $labels['select'] = 'Auswählen';
 $labels['all'] = 'Alle';
 $labels['none'] = 'Keine';
@@ -124,7 +127,11 @@ $labels['plaintoggle'] = 'Nur-Text';
 $labels['addcc'] = 'Cc hinzufügen';
 $labels['addbcc'] = 'Bcc hinzufügen';
 $labels['addreplyto'] = 'Antwortadresse hinzufügen';
-$labels['name'] = 'Anzeigename';
+$labels['mdnrequest'] = 'Der Sender dieser Nachricht möchte gerne eine Lesebestätigung. Wollen Sie dieses bestätigen?';
+$labels['receiptread'] = 'Empfangsbestätigung (gelesen)';
+$labels['yourmessage'] = 'Dies ist eine Empfangsbestätigung für Ihre Nachricht';
+$labels['receiptnote'] = 'Hinweis: Der Empfänger hat den Empfang der Nachricht bestätigt. Dies ist keine Garantie, dass die Nachricht gelesen und verstanden wurde.';
+$labels['name'] = 'Angezeigter Name';
 $labels['firstname'] = 'Vorname';
 $labels['surname'] = 'Nachname';
 $labels['email'] = 'E-Mail';
@@ -150,7 +157,7 @@ $labels['settingsfor'] = 'Einstellungen für';
 $labels['preferences'] = 'Einstellungen';
 $labels['userpreferences'] = 'Benutzereinstellungen';
 $labels['editpreferences'] = 'Benutzereinstellungen bearbeiten';
-$labels['identities'] = 'Absender';
+$labels['identities'] = 'Identitäten';
 $labels['manageidentities'] = 'Absender für dieses Konto verwalten';
 $labels['newidentity'] = 'Neuer Absender';
 $labels['newitem'] = 'Neuer Eintrag';
@@ -171,6 +178,7 @@ $labels['folder'] = 'Ordner';
 $labels['folders'] = 'Ordner';
 $labels['foldername'] = 'Ordnername';
 $labels['subscribed'] = 'Abonniert';
+$labels['messagecount'] = 'Nachrichten';
 $labels['create'] = 'Erstellen';
 $labels['createfolder'] = 'Neuen Ordner erstellen';
 $labels['rename'] = 'Umbenennen';
@@ -181,4 +189,4 @@ $labels['sortby'] = 'Sortieren nach';
 $labels['sortasc'] = 'Aufsteigend sortieren';
 $labels['sortdesc'] = 'Absteigend sortieren';
 
-?>
+?>
\ No newline at end of file
index ea109a953ce28db92d64883c5655ea3daec80d44..002e90e86dac074c203015564980231be689d499 100644 (file)
@@ -6,19 +6,19 @@
  | language/de_DE/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Stephan Diehl <info@sd-edv.de>                                |
+ | Author: Marcel Schlesinger <info@marcel-schlesinger.de>               |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: messages.inc 1107 2008-02-17 18:32:46Z thomasb $
 
 */
 
 $messages = array();
-$messages['loginfailed'] = 'Anmelden fehlgeschlagen';
+$messages['loginfailed'] = 'Anmeldung fehlgeschlagen';
 $messages['cookiesdisabled'] = 'Ihr Browser akzeptiert keine Cookies';
 $messages['sessionerror'] = 'Ihre Session ist ungültig oder abgelaufen';
 $messages['imaperror'] = 'Keine Verbindung zum IMAP-Server';
@@ -59,13 +59,13 @@ $messages['noldapserver'] = 'Bitte wählen Sie einen LDAP-Server aus';
 $messages['nocontactsreturned'] = 'Es wurden keine Kontakte gefunden';
 $messages['nosearchname'] = 'Bitte geben Sie einen Namen oder eine E-Mail-Adresse ein';
 $messages['searchsuccessful'] = '$nr Nachrichten gefunden';
-$messages['searchnomatch'] = 'Keine Treffer';
+$messages['searchnomatch'] = 'Die Suche lieferte keine Treffer';
 $messages['searching'] = 'Suche...';
 $messages['checking'] = 'Prüfe...';
 $messages['nospellerrors'] = 'Keine Rechtschreibfehler gefunden';
 $messages['folderdeleted'] = 'Ordner erfolgreich gelöscht';
 $messages['deletedsuccessfully'] = 'Erfolgreich gelöscht';
-$messages['converting'] = 'Entferne Formatierung der Nachricht...';
+$messages['converting'] = 'Entferne Formatierungen der Nachricht...';
 $messages['messageopenerror'] = 'Die Nachricht konnte nicht vom Server geladen werden';
 $messages['fileuploaderror'] = 'Hochladen der Datei fehlgeschlagen';
 $messages['filesizeerror'] = 'Die hochzuladende Datei überschreitet die Maximalgröße von $size';
@@ -74,5 +74,9 @@ $messages['copyerror'] = 'Die Adressen konnten nicht kopiert werden';
 $messages['sourceisreadonly'] = 'Das Adressverzeichnis kann nicht verändert werden';
 $messages['errorsavingcontact'] = 'Die Änderungen konnten nicht gespeichert werden';
 $messages['movingmessage'] = 'Die E-Mail wird verschoben...';
+$messages['receiptsent'] = 'Lesebestätigung erfolgreich gesendet';
+$messages['errorsendingreceipt'] = 'Bestätigung konnte nicht gesendet werden';
+$messages['nodeletelastidentity'] = 'Diese Identität kann nicht gelöscht werden, da dies die letzte ist.';
+$messages['addsubfolderhint'] = 'Wird als Unterordner des aktuell selektieren Ordners erstellt';
 
 ?>
\ No newline at end of file
index 8ba5cf8353dd32934d562944bcdba1951495e61e..e3a25ad78d9943aabca7014f597dd9a5f55ff519 100644 (file)
@@ -6,15 +6,15 @@
  | language/el/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Jim Deves <jim@cobaltblue.gr>                                 |
- |         John Economou <hsoc@irc.gr>                                   | 
+ |         John Economou <hsoc@irc.gr>                                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 612 2007-06-12 18:17:21Z thomasb $
+ @version $Id: labels.inc 1160 2008-03-01 15:32:44Z yllar $
 
 */
 
@@ -75,7 +75,8 @@ $labels['writenewmessage'] = 'Δημιουργία νέου μηνύματος';
 $labels['replytomessage'] = 'Απάντηση';
 $labels['replytoallmessage'] = 'Απάντηση στον αποστολέα και όλους τους παραλήπτες';
 $labels['forwardmessage'] = 'Προώθηση μηνύματος';
-$labels['deletemessage'] = 'Μετακίνηση στον Κάδο';
+$labels['deletemessage'] = 'Διαγραφή μηνύματος';
+$labels['movemessagetotrash'] = 'Μετακίνηση μηνύματος στον Κάδο';
 $labels['printmessage'] = 'Εκτύπωση';
 $labels['previousmessage'] = 'Εμφάνιση προηγούμενου μηνύματος';
 $labels['previousmessages'] = 'Εμφάνιση προηγούμενης ομάδας μηνυμάτων';
@@ -87,6 +88,9 @@ $labels['lastmessage'] = 'Εμφάνιση τελευταίου μηνύματο
 $labels['lastmessages'] = 'Εμφάνιση τελευταίας ομάδας μηνυμάτων';
 $labels['backtolist'] = 'Επιστροφή στη λίστα μηνυμάτων';
 $labels['viewsource'] = 'Προβολή πηγαίου κώδικα';
+$labels['markmessages'] = 'Σήμανση μηνυμάτων';
+$labels['markread'] = 'ως αναγνωσμένα';
+$labels['markunread'] = 'ως μη-αναγνωσμένα';
 $labels['select'] = 'Επιλογή';
 $labels['all'] = 'Όλα';
 $labels['none'] = 'Κανένα';
@@ -100,8 +104,8 @@ $labels['unlimited'] = 'απεριόριστο';
 $labels['quicksearch'] = 'Γρήγορη Εύρεση';
 $labels['resetsearch'] = 'Επαναφορά Εύρεσης';
 $labels['compose'] = 'Συγγραφή μηνύματος';
-$labels['sendmessage'] = 'Αποστολή μηνύματος τώρα';
 $labels['savemessage'] = 'Αποθήκευση ως πρόχειρου';
+$labels['sendmessage'] = 'Αποστολή μηνύματος τώρα';
 $labels['addattachment'] = 'Επισύναψη αρχείου';
 $labels['charset'] = 'Charset';
 $labels['editortype'] = 'Είδος επεξεργαστή κειμένου';
@@ -121,6 +125,13 @@ $labels['nosubject'] = '(κανένα θέμα)';
 $labels['showimages'] = 'Εμφάνιση εικόνων';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Απλό κείμενο';
+$labels['addcc'] = 'Προσθήκη Cc';
+$labels['addbcc'] = 'Προσθήκη Bcc';
+$labels['addreplyto'] = 'Προσθήκη Απάντηση-Σε';
+$labels['mdnrequest'] = 'Ο αποστολέας του μηνύματος έχει ζητήσει να ενημερωθεί όταν διαβάσετε αυτό το μήνυμα. Επιθυμείτε να ενημερώστε τον αποστολέα;';
+$labels['receiptread'] = 'Αναφορά (ανάγνωσης)';
+$labels['yourmessage'] = 'Αυτό είναι μια Αναφορά για το μήνυμά σας';
+$labels['receiptnote'] = 'Σημείωση: Αυτή η αναφορά επιβεβαιώνει μόνο ότι το μήνυμα εμφανίστηκε μόνο στον υπολογιστή του παραλήπτη. Δεν επιβεβαιώνει ότι ο παραλήπτης έχει διαβάσει ή έχει κατανοήσει το περιεχόμενο του μηνύματος.';
 $labels['name'] = 'Εμφανιζόμενο όνομα';
 $labels['firstname'] = 'Όνομα';
 $labels['surname'] = 'Επώνυμο';
@@ -168,6 +179,7 @@ $labels['folder'] = 'Φάκελος';
 $labels['folders'] = 'Φάκελοι';
 $labels['foldername'] = 'Όνομα φακέλου';
 $labels['subscribed'] = 'Εγγραφή';
+$labels['messagecount'] = 'Μηνύματα';
 $labels['create'] = 'Δημιουργία';
 $labels['createfolder'] = 'Δημιουργία νέου φακέλου';
 $labels['rename'] = 'Μετονομασία';
index c490f58130df117ef101b35f461891e8d1bbb3cd..84890e8efc2775b8782fb32508b073fc2b182e00 100644 (file)
@@ -6,15 +6,15 @@
  | language/el/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Jim Deves <jim@cobaltblue.gr>                                 |
- |         John Economou <hsoc@irc.gr>                                   | 
+ |         John Economou <hsoc@irc.gr>                                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 612 2007-06-12 18:17:21Z thomasb $
+ @version $Id: messages.inc 1160 2008-03-01 15:32:44Z yllar $
 
 */
 
@@ -74,5 +74,10 @@ $messages['copysuccess'] = 'Επιτυχή αντιγραφή $nr διευθύν
 $messages['copyerror'] = 'Αποτυχία αντιγραφής διευθύνσεων';
 $messages['sourceisreadonly'] = 'Η διεύθυνση έχει μόνο δικαίωμα ανάγνωσης';
 $messages['errorsavingcontact'] = 'Σώσιμο επαφής απέτυχε';
+$messages['movingmessage'] = 'Μετακίνηση μηνύματος...';
+$messages['receiptsent'] = 'Επιτυχής αποστολή αναφοράς ανάγνωσης';
+$messages['errorsendingreceipt'] = 'Αποστολή αναφοράς απέτυχε';
+$messages['nodeletelastidentity'] = 'Δε μπορείτε να διαγράψετε αυτήν την ταυτότητα, είναι η τελευταία.';
+$messages['addsubfolderhint'] = 'Αυτός ο φάκελος θα δημιουργηθεί ως υποφάκελος του επιλεγμένου';
 
 ?>
\ No newline at end of file
index 7d26459a3684d24d37977633414cd91129bb8999..96f3447d58621ea5ed0a14bf2bbd2e09d6e4cace 100644 (file)
@@ -6,71 +6,54 @@
  | language/en_GB/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: labels.inc 1091 2008-02-15 15:13:38Z tomekp $
 
 */
 
 $labels = array();
-
-// login page
-$labels['welcome']   = 'Welcome to $product';
-$labels['username']  = 'Username';
-$labels['password']  = 'Password';
-$labels['server']    = 'Server';
-$labels['login']     = 'Login';
-
-// taskbar
-$labels['logout']   = 'Logout';
-$labels['mail']     = 'E-Mail';
+$labels['welcome'] = 'Welcome to $product';
+$labels['username'] = 'Username';
+$labels['password'] = 'Password';
+$labels['server'] = 'Server';
+$labels['login'] = 'Login';
+$labels['logout'] = 'Logout';
+$labels['mail'] = 'E-Mail';
 $labels['settings'] = 'Personal Settings';
 $labels['addressbook'] = 'Address Book';
-
-// mailbox names
-$labels['inbox']  = 'Inbox';
+$labels['inbox'] = 'Inbox';
 $labels['drafts'] = 'Drafts';
-$labels['sent']   = 'Sent';
-$labels['trash']  = 'Deleted Items';
-$labels['junk']   = 'Junk';
-
-// message listing
+$labels['sent'] = 'Sent';
+$labels['trash'] = 'Deleted Items';
+$labels['junk'] = 'Junk';
 $labels['subject'] = 'Subject';
-$labels['from']    = 'Sender';
-$labels['to']      = 'Recipient';
-$labels['cc']      = 'Copy';
-$labels['bcc']     = 'Bcc';
+$labels['from'] = 'Sender';
+$labels['to'] = 'Recipient';
+$labels['cc'] = 'Copy';
+$labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Reply-To';
-$labels['date']    = 'Date';
-$labels['size']    = 'Size';
+$labels['date'] = 'Date';
+$labels['size'] = 'Size';
 $labels['priority'] = 'Priority';
 $labels['organization'] = 'Organisation';
-
-// aliases
-$labels['reply-to'] = $labels['replyto'];
-
+$labels['reply-to'] = 'Reply-To';
 $labels['mailboxlist'] = 'Folders';
 $labels['messagesfromto'] = 'Messages $from to $to of $count';
 $labels['messagenrof'] = 'Message $nr of $count';
-
-$labels['moveto']   = 'move to...';
+$labels['moveto'] = 'move to...';
 $labels['download'] = 'download';
-
 $labels['filename'] = 'File name';
 $labels['filesize'] = 'File size';
-
 $labels['preferhtml'] = 'Display HTML';
 $labels['htmlmessage'] = 'HTML Message';
 $labels['prettydate'] = 'Pretty dates';
-
 $labels['addtoaddressbook'] = 'Add to address book';
-
-// weekdays short
 $labels['sun'] = 'Sun';
 $labels['mon'] = 'Mon';
 $labels['tue'] = 'Tue';
@@ -78,156 +61,132 @@ $labels['wed'] = 'Wed';
 $labels['thu'] = 'Thu';
 $labels['fri'] = 'Fri';
 $labels['sat'] = 'Sat';
-
-// weekdays long
-$labels['sunday']    = 'Sunday';
-$labels['monday']    = 'Monday';
-$labels['tuesday']   = 'Tuesday';
+$labels['sunday'] = 'Sunday';
+$labels['monday'] = 'Monday';
+$labels['tuesday'] = 'Tuesday';
 $labels['wednesday'] = 'Wednesday';
-$labels['thursday']  = 'Thursday';
-$labels['friday']    = 'Friday';
-$labels['saturday']  = 'Saturday';
-
+$labels['thursday'] = 'Thursday';
+$labels['friday'] = 'Friday';
+$labels['saturday'] = 'Saturday';
 $labels['today'] = 'Today';
-
-// toolbar buttons
-$labels['checkmail']        = 'Check for new messages';
-$labels['writenewmessage']  = 'Create a new message';
-$labels['replytomessage']   = 'Reply to the message';
+$labels['checkmail'] = 'Check for new messages';
+$labels['writenewmessage'] = 'Create a new message';
+$labels['replytomessage'] = 'Reply to the message';
 $labels['replytoallmessage'] = 'Reply to sender and all recipients';
-$labels['forwardmessage']   = 'Forward the message';
-$labels['deletemessage']    = 'Delete message';
+$labels['forwardmessage'] = 'Forward the message';
+$labels['deletemessage'] = 'Delete message';
 $labels['movemessagetotrash'] = 'Move message to "Deleted Items"';
-$labels['printmessage']     = 'Print this message';
-$labels['previousmessage']  = 'Show the previous message';
+$labels['printmessage'] = 'Print this message';
+$labels['previousmessage'] = 'Show the previous message';
 $labels['previousmessages'] = 'Show previous set of messages';
-$labels['firstmessage']     = 'Show the first message';
-$labels['firstmessages']    = 'Show first set of messages';
-$labels['nextmessage']      = 'Show the next message';
-$labels['nextmessages']     = 'Show next set of messages';
-$labels['lastmessage']      = 'Show the last message';
-$labels['lastmessages']     = 'Show last set of messages';
-$labels['backtolist']       = 'Back to message list';
-$labels['viewsource']       = 'Show source';
-
+$labels['firstmessage'] = 'Show the first message';
+$labels['firstmessages'] = 'Show first set of messages';
+$labels['nextmessage'] = 'Show the next message';
+$labels['nextmessages'] = 'Show next set of messages';
+$labels['lastmessage'] = 'Show the last message';
+$labels['lastmessages'] = 'Show last set of messages';
+$labels['backtolist'] = 'Back to message list';
+$labels['viewsource'] = 'Show source';
+$labels['markmessages'] = 'Mark messages';
+$labels['markread'] = 'As read';
+$labels['markunread'] = 'As unread';
 $labels['select'] = 'Select';
 $labels['all'] = 'All';
 $labels['none'] = 'None';
 $labels['unread'] = 'Unread';
-
 $labels['compact'] = 'Compact';
 $labels['empty'] = 'Empty';
 $labels['purge'] = 'Purge';
-
 $labels['quota'] = 'Disk usage';
-$labels['unknown']  = 'unknown';
-$labels['unlimited']  = 'unlimited';
-
-$labels['quicksearch']  = 'Quick search';
-$labels['resetsearch']  = 'Reset search';
-
-
-// message compose
-$labels['compose']        = 'Compose a message';
-$labels['savemessage']    = 'Save this draft';
-$labels['sendmessage']    = 'Send the message now';
-$labels['addattachment']  = 'Attach a file';
-$labels['charset']        = 'Charset';
-$labels['editortype']     = 'Editor type';
-$labels['returnreceipt']  = 'Return receipt';
-
+$labels['unknown'] = 'unknown';
+$labels['unlimited'] = 'unlimited';
+$labels['quicksearch'] = 'Quick search';
+$labels['resetsearch'] = 'Reset search';
+$labels['compose'] = 'Compose a message';
+$labels['savemessage'] = 'Save this draft';
+$labels['sendmessage'] = 'Send the message now';
+$labels['addattachment'] = 'Attach a file';
+$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';
-$labels['close']  = 'Close';
-
-$labels['low']     = 'Low';
-$labels['lowest']  = 'Lowest';
-$labels['normal']  = 'Normal';
-$labels['high']    = 'High';
+$labels['close'] = 'Close';
+$labels['low'] = 'Low';
+$labels['lowest'] = 'Lowest';
+$labels['normal'] = 'Normal';
+$labels['high'] = 'High';
 $labels['highest'] = 'Highest';
-
-$labels['nosubject']  = '(no subject)';
+$labels['nosubject'] = '(no subject)';
 $labels['showimages'] = 'Display images';
-
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Plain text';
-
-
-// address boook
-$labels['name']      = 'Display name';
+$labels['addcc'] = 'Add Cc';
+$labels['addbcc'] = 'Add Bcc';
+$labels['addreplyto'] = 'Add Reply-To';
+$labels['mdnrequest'] = 'The sender of this message has asked to be notified when you read this message. Do you wish to notify the sender?';
+$labels['receiptread'] = 'Return Receipt (read)';
+$labels['yourmessage'] = 'This is a Return Receipt for your message';
+$labels['receiptnote'] = 'Note: This receipt only acknowledges that the message was displayed on the recipient\'s computer. There is no guarantee that the recipient has read or understood the message contents.';
+$labels['name'] = 'Display name';
 $labels['firstname'] = 'First name';
-$labels['surname']   = 'Last name';
-$labels['email']     = 'E-Mail';
-
+$labels['surname'] = 'Last name';
+$labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Add new contact';
 $labels['editcontact'] = 'Edit contact';
-
-$labels['edit']   = 'Edit';
+$labels['edit'] = 'Edit';
 $labels['cancel'] = 'Cancel';
-$labels['save']   = 'Save';
+$labels['save'] = 'Save';
 $labels['delete'] = 'Delete';
-
-$labels['newcontact']     = 'Create new contact card';
-$labels['deletecontact']  = 'Delete selected contacts';
-$labels['composeto']      = 'Compose mail to';
+$labels['newcontact'] = 'Create new contact card';
+$labels['deletecontact'] = 'Delete selected contacts';
+$labels['composeto'] = 'Compose mail to';
 $labels['contactsfromto'] = 'Contacts $from to $to of $count';
-$labels['print']          = 'Print';
-$labels['export']         = 'Export';
-
-$labels['previouspage']   = 'Show previous set';
-$labels['firstpage']      = 'Show first set';
-$labels['nextpage']       = 'Show next set';
-$labels['lastpage']       = 'Show last set';
-
+$labels['print'] = 'Print';
+$labels['export'] = 'Export';
+$labels['previouspage'] = 'Show previous set';
+$labels['firstpage'] = 'Show first set';
+$labels['nextpage'] = 'Show next set';
+$labels['lastpage'] = 'Show last set';
 $labels['groups'] = 'Groups';
 $labels['personaladrbook'] = 'Personal Addresses';
-
-
-// settings
-$labels['settingsfor']  = 'Settings for';
-
-$labels['preferences']  = 'Preferences';
-$labels['userpreferences']  = 'User preferences';
-$labels['editpreferences']  = 'Edit user preferences';
-
-$labels['identities']  = 'Identities';
-$labels['manageidentities']  = 'Manage identities for this account';
-$labels['newidentity']  = 'New identity';
-
-$labels['newitem']  = 'New item';
-$labels['edititem']  = 'Edit item';
-
-$labels['setdefault']  = 'Set default';
-$labels['language']  = 'Language';
-$labels['timezone']  = 'Time zone';
-$labels['pagesize']  = 'Rows per page';
+$labels['settingsfor'] = 'Settings for';
+$labels['preferences'] = 'Preferences';
+$labels['userpreferences'] = 'User preferences';
+$labels['editpreferences'] = 'Edit user preferences';
+$labels['identities'] = 'Identities';
+$labels['manageidentities'] = 'Manage identities for this account';
+$labels['newidentity'] = 'New identity';
+$labels['newitem'] = 'New item';
+$labels['edititem'] = 'Edit item';
+$labels['setdefault'] = 'Set default';
+$labels['language'] = 'Language';
+$labels['timezone'] = 'Time zone';
+$labels['pagesize'] = 'Rows per page';
 $labels['signature'] = 'Signature';
-$labels['dstactive']  = 'Daylight savings';
+$labels['dstactive'] = 'Daylight savings';
 $labels['htmleditor'] = 'Compose HTML messages';
 $labels['htmlsignature'] = 'HTML signature';
 $labels['previewpane'] = 'Show preview pane';
-
-$labels['autosavedraft']  = 'Automatically save draft';
-$labels['everynminutes']  = 'every $n minutes';
-$labels['never']  = 'never';
-
-$labels['folder']  = 'Folder';
-$labels['folders']  = 'Folders';
-$labels['foldername']  = 'Folder name';
-$labels['subscribed']  = 'Subscribed';
-$labels['create']  = 'Create';
-$labels['createfolder']  = 'Create new folder';
+$labels['autosavedraft'] = 'Automatically save draft';
+$labels['everynminutes'] = 'every $n minutes';
+$labels['never'] = 'never';
+$labels['folder'] = 'Folder';
+$labels['folders'] = 'Folders';
+$labels['foldername'] = 'Folder name';
+$labels['subscribed'] = 'Subscribed';
+$labels['messagecount'] = 'Messages';
+$labels['create'] = 'Create';
+$labels['createfolder'] = 'Create new folder';
 $labels['rename'] = 'Rename';
 $labels['renamefolder'] = 'Rename folder';
-$labels['deletefolder']  = 'Delete folder';
-$labels['managefolders']  = 'Manage folders';
-
+$labels['deletefolder'] = 'Delete folder';
+$labels['managefolders'] = 'Manage folders';
 $labels['sortby'] = 'Sort by';
-$labels['sortasc']  = 'Sort ascending';
+$labels['sortasc'] = 'Sort ascending';
 $labels['sortdesc'] = 'Sort descending';
 
 ?>
\ No newline at end of file
index dce6e124f32f02c7125d2348dfae1a0500660d4b..8cc0b20a79e9ad0bd9436f1c8e39f55810a48ae0 100644 (file)
@@ -6,19 +6,19 @@
  | language/en_GB/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: messages.inc 1091 2008-02-15 15:13:38Z tomekp $
 
 */
 
 $messages = array();
-$messages['loginfailed']  = 'Login failed';
+$messages['loginfailed'] = 'Login failed';
 $messages['cookiesdisabled'] = 'Your browser does not accept cookies';
 $messages['sessionerror'] = 'Your session is invalid or has expired';
 $messages['imaperror'] = 'Connection to IMAP server failed';
@@ -43,16 +43,16 @@ $messages['sendingfailed'] = 'Failed to send message';
 $messages['errorsaving'] = 'An error occured while saving';
 $messages['errormoving'] = 'Could not move the message';
 $messages['errordeleting'] = 'Could not delete the message';
-$messages['deletecontactconfirm']  = 'Do you really want to delete the selected contact(s)?';
+$messages['deletecontactconfirm'] = 'Do you really want to delete the selected contact(s)?';
 $messages['deletemessagesconfirm'] = 'Do you really want to delete the selected message(s)?';
-$messages['deletefolderconfirm']  = 'Do you really want to delete this folder?';
-$messages['purgefolderconfirm']  = 'Do you really want to delete all messages in this folder?';
+$messages['deletefolderconfirm'] = 'Do you really want to delete this folder?';
+$messages['purgefolderconfirm'] = 'Do you really want to delete all messages in this folder?';
 $messages['formincomplete'] = 'The form was not completely filled out';
 $messages['noemailwarning'] = 'Please enter a valid email address';
-$messages['nonamewarning']  = 'Please enter a name';
+$messages['nonamewarning'] = 'Please enter a name';
 $messages['nopagesizewarning'] = 'Please enter a page size';
 $messages['norecipientwarning'] = 'Please enter at least one recipient';
-$messages['nosubjectwarning']  = 'The "Subject" field is empty. Would you like to enter one now?';
+$messages['nosubjectwarning'] = 'The "Subject" field is empty. Would you like to enter one now?';
 $messages['nobodywarning'] = 'Send this message without any text?';
 $messages['notsentwarning'] = 'Your message has not been sent. Do you want to discard it?';
 $messages['noldapserver'] = 'Please select an LDAP server to search';
@@ -64,7 +64,7 @@ $messages['searching'] = 'Searching...';
 $messages['checking'] = 'Checking...';
 $messages['nospellerrors'] = 'No spelling errors found';
 $messages['folderdeleted'] = 'Folder successfully deleted';
-$messages['deletedsuccessfully'] = "Successfully deleted";
+$messages['deletedsuccessfully'] = 'Successfully deleted';
 $messages['converting'] = 'Removing formatting from message...';
 $messages['messageopenerror'] = 'Could not load message from server';
 $messages['fileuploaderror'] = 'File upload failed';
@@ -74,5 +74,9 @@ $messages['copyerror'] = 'Could not copy any addresses';
 $messages['sourceisreadonly'] = 'This address source is read-only';
 $messages['errorsavingcontact'] = 'Could not save the contact address';
 $messages['movingmessage'] = 'Moving message...';
+$messages['receiptsent'] = 'Successfully sent a read receipt';
+$messages['errorsendingreceipt'] = 'Could not send the receipt';
+$messages['nodeletelastidentity'] = 'You cannot delete this identity, it\'s your last one.';
+$messages['addsubfolderhint'] = 'This folder will be created as subfolder of the currently selected one';
 
 ?>
\ No newline at end of file
index c893a63b7e181c13c6098feb7da164d77107e696..2a01df6004780bdd8253415b9d09c8396509e720 100644 (file)
@@ -6,14 +6,14 @@
  | language/en_US/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: labels.inc 1052 2008-02-12 18:41:53Z thomasb $
 
 */
 
@@ -109,6 +109,9 @@ $labels['lastmessage']      = 'Show the last message';
 $labels['lastmessages']     = 'Show last set of messages';
 $labels['backtolist']       = 'Back to message list';
 $labels['viewsource']       = 'Show source';
+$labels['markmessages']     = 'Mark messages';
+$labels['markread']         = 'As read';
+$labels['markunread']       = 'As unread';
 
 $labels['select'] = 'Select';
 $labels['all'] = 'All';
@@ -160,6 +163,11 @@ $labels['addcc'] = 'Add Cc';
 $labels['addbcc'] = 'Add Bcc';
 $labels['addreplyto'] = 'Add Reply-To';
 
+// mdn
+$labels['mdnrequest'] = 'The sender of this message has asked to be notified when you read this message. Do you wish to notify the sender?';
+$labels['receiptread'] = 'Return Receipt (read)';
+$labels['yourmessage'] = 'This is a Return Receipt for your message';
+$labels['receiptnote'] = 'Note: This receipt only acknowledges that the message was displayed on the recipient\'s computer. There is no guarantee that the recipient has read or understood the message contents.';
 
 // address boook
 $labels['name']      = 'Display name';
@@ -223,6 +231,7 @@ $labels['folder']  = 'Folder';
 $labels['folders']  = 'Folders';
 $labels['foldername']  = 'Folder name';
 $labels['subscribed']  = 'Subscribed';
+$labels['messagecount'] = 'Messages';
 $labels['create']  = 'Create';
 $labels['createfolder']  = 'Create new folder';
 $labels['rename'] = 'Rename';
index 8240eda1dc3bcc160c89b9886fe283b081042e95..e94ee407a8d66f9588545b61f4bc41dac7ffa00d 100644 (file)
@@ -6,14 +6,14 @@
  | language/en_US/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: messages.inc 1052 2008-02-12 18:41:53Z thomasb $
 
 */
 
@@ -74,5 +74,9 @@ $messages['copyerror'] = 'Could not copy any addresses';
 $messages['sourceisreadonly'] = 'This address source is read only';
 $messages['errorsavingcontact'] = 'Could not save the contact address';
 $messages['movingmessage'] = 'Moving message...';
+$messages['receiptsent'] = 'Successfully sent a read receipt';
+$messages['errorsendingreceipt'] = 'Could not send the receipt';
+$messages['nodeletelastidentity'] = 'You cannot delete this identity, it\'s your last one.';
+$messages['addsubfolderhint'] = 'This folder will be created as subfolder of the currently selected one';
 
 ?>
\ No newline at end of file
index 9ec4f7ab03d91ef92eeed4123cd8392f1563b6aa..85e236221d9caee4b0fba5acb11d85255e73e2a1 100644 (file)
@@ -6,72 +6,52 @@
  | language/eo/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Andreas van Cranenburgh <andreas@unstable.nl>                 |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 858 2007-10-04 10:14:19Z Stiwi $
-
 */
 
-
 $labels = array();
-
-// login page
-$labels['welcome']   = 'Bonvenon al $product';
-$labels['username']  = 'Uzanta-nomo';
-$labels['password']  = 'Pasvorto';
-$labels['server']    = 'Servilo';
-$labels['login']     = 'Ensalutu';
-
-// taskbar
-$labels['logout']   = 'Elsalutu';
-$labels['mail']     = 'Retpoŝto';
+$labels['welcome'] = 'Bonvenon al $product';
+$labels['username'] = 'Uzantnomo';
+$labels['password'] = 'Pasvorto';
+$labels['server'] = 'Servilo';
+$labels['login'] = 'Ensalutu';
+$labels['logout'] = 'Elsalutu';
+$labels['mail'] = 'Retpoŝto';
 $labels['settings'] = 'Preferoj';
 $labels['addressbook'] = 'Adresaro';
-
-// mailbox names
-$labels['inbox']  = 'Ricevitujo';
+$labels['inbox'] = 'Ricevitujo';
 $labels['drafts'] = 'Malnetujo';
-$labels['sent']   = 'Senditujo';
-$labels['trash']  = 'Rubujo';
-$labels['junk']   = 'Spamujo'; #FIXME. eble fatrasujo.
-
-// message listing
-$labels['subject'] = 'Subjekto'; #temo?
-$labels['from']    = 'Sendanto';
-$labels['to']      = 'Ricevanto';
-$labels['cc']      = 'Kopio';
-$labels['bcc']     = 'Blindkopio';
+$labels['sent'] = 'Senditujo';
+$labels['trash'] = 'Rubujo';
+$labels['junk'] = 'Spamujo';
+$labels['subject'] = 'Temo';
+$labels['from'] = 'Sendanto';
+$labels['to'] = 'Ricevanto';
+$labels['cc'] = 'Kopio';
+$labels['bcc'] = 'Blindkopio';
 $labels['replyto'] = 'Respondu-Al';
-$labels['date']    = 'Dato';
-$labels['size']    = 'Grando';
+$labels['date'] = 'Dato';
+$labels['size'] = 'Grando';
 $labels['priority'] = 'Prioritato';
 $labels['organization'] = 'Organizo';
-
-// aliases
-$labels['reply-to'] = $labels['replyto'];
-
+$labels['reply-to'] = 'Respondu-Al';
 $labels['mailboxlist'] = 'Dosierujoj';
 $labels['messagesfromto'] = 'Mesaĝoj ekde $from ĝis $to de $count';
 $labels['messagenrof'] = 'Mesaĝo $nr-a de $count';
-
-$labels['moveto']   = 'transloku al...';
+$labels['moveto'] = 'transloku al...';
 $labels['download'] = 'elŝutu';
-
 $labels['filename'] = 'Dosiernomo';
 $labels['filesize'] = 'Dosiergrando';
-
 $labels['preferhtml'] = 'Montru HTML';
 $labels['htmlmessage'] = 'HTML Mesaĝo';
 $labels['prettydate'] = 'Agrablaj Datoj';
-
 $labels['addtoaddressbook'] = 'Aldonu al adresaro';
-
-// weekdays short
 $labels['sun'] = 'Dim';
 $labels['mon'] = 'Lun';
 $labels['tue'] = 'Mar';
@@ -79,155 +59,132 @@ $labels['wed'] = 'Mer';
 $labels['thu'] = 'Ĵaŭ';
 $labels['fri'] = 'Ven';
 $labels['sat'] = 'Sab';
-
-// weekdays long
-$labels['sunday']    = 'Dimanĉo';
-$labels['monday']    = 'Luno';
-$labels['tuesday']   = 'Mardo';
+$labels['sunday'] = 'Dimanĉo';
+$labels['monday'] = 'Luno';
+$labels['tuesday'] = 'Mardo';
 $labels['wednesday'] = 'Merkredo';
-$labels['thursday']  = 'Ĵaŭdo';
-$labels['friday']    = 'Vendredo';
-$labels['saturday']  = 'Sabato';
-
+$labels['thursday'] = 'Ĵaŭdo';
+$labels['friday'] = 'Vendredo';
+$labels['saturday'] = 'Sabato';
 $labels['today'] = 'Hodiaŭ';
-
-// toolbar buttons
-$labels['checkmail']        = 'Kontrolu por novaj mesaĝoj';
-$labels['writenewmessage']  = 'Verku novan mesaĝon';
-$labels['replytomessage']   = 'Respondu al mesaĝo';
-$labels['replytoallmessage'] = 'Respondu al sendanto kaj ĉiu ricevanto';
-$labels['forwardmessage']   = 'Plusendu mesaĝon';
-$labels['deletemessage']    = 'Transloku mesaĝon al rubujo';
-$labels['printmessage']     = 'Printu ĉi tiun mesaĝon';
-$labels['previousmessage']  = 'Montru antaŭan mesaĝon';
+$labels['checkmail'] = 'Kontrolu, ĉu novaj mesaĝoj';
+$labels['writenewmessage'] = 'Verku novan mesaĝon';
+$labels['replytomessage'] = 'Respondu al mesaĝo';
+$labels['replytoallmessage'] = 'Respondu al sendinto kaj ĉiu ricevinto';
+$labels['forwardmessage'] = 'Plusendu mesaĝon';
+$labels['deletemessage'] = 'Forigu mesaĝon';
+$labels['movemessagetotrash'] = 'Transloku mesaĝon al rubujo';
+$labels['printmessage'] = 'Printu ĉi tiun mesaĝon';
+$labels['previousmessage'] = 'Montru antaŭan mesaĝon';
 $labels['previousmessages'] = 'Montru antaŭan aron de mesaĝoj';
-$labels['firstmessage']     = 'Montru unuan mesaĝon';
-$labels['firstmessages']    = 'Montru unuan aron de mesaĝoj';
-$labels['nextmessage']      = 'Montru sekvan mesaĝon';
-$labels['nextmessages']     = 'Montru sekvan aron de mesaĝoj';
-$labels['lastmessage']      = 'Montru lastan mesaĝon';
-$labels['lastmessages']     = 'Montru lastan aron de mesaĝoj';
-$labels['backtolist']       = 'Reen al mesaĝo-listo';
-$labels['viewsource']       = 'Montru fonton';
-
+$labels['firstmessage'] = 'Montru unuan mesaĝon';
+$labels['firstmessages'] = 'Montru unuan aron de mesaĝoj';
+$labels['nextmessage'] = 'Montru sekvan mesaĝon';
+$labels['nextmessages'] = 'Montru sekvan aron de mesaĝoj';
+$labels['lastmessage'] = 'Montru lastan mesaĝon';
+$labels['lastmessages'] = 'Montru lastan aron de mesaĝoj';
+$labels['backtolist'] = 'Reen al mesaĝo-listo';
+$labels['viewsource'] = 'Montru fonton';
+$labels['markmessages'] = 'Marku mesaĝojn';
+$labels['markread'] = 'Kiel legita';
+$labels['markunread'] = 'Kiel nelegita';
 $labels['select'] = 'Elektu';
 $labels['all'] = 'Ĉion';
 $labels['none'] = 'Nenion';
-$labels['unread'] = 'Nelegatan';
-
+$labels['unread'] = 'Nelegitan';
 $labels['compact'] = 'Kompakta';
 $labels['empty'] = 'Malplena';
 $labels['purge'] = 'Senrubigu';
-
 $labels['quota'] = 'Diskuzo';
-$labels['unknown']  = 'nekonata';
-$labels['unlimited']  = 'senlimo';
-
-$labels['quicksearch']  = 'Rapida serĉo';
-$labels['resetsearch']  = 'Vakigu serĉon';
-
-
-// message compose
-$labels['compose']        = 'Verku mesaĝon';
-$labels['sendmessage']    = 'Sendu mesaĝon nun';
-$labels['savemessage']  = 'Savu ĉi tiun malneton';
-$labels['addattachment']  = 'Alfiksu dosieron';
-$labels['charset']        = 'Karakteraro';
-$labels['editortype']     = 'Speco de redaktilo'; #???
-$labels['returnreceipt']  = 'Return receipt';
-
-$labels['checkspelling'] = 'Kontrolu grafismon';
-$labels['resumeediting'] = 'Rekomencu redakti';
-$labels['revertto']      = 'Reiru al';
-
+$labels['unknown'] = 'nekonata';
+$labels['unlimited'] = 'senlima';
+$labels['quicksearch'] = 'Rapida serĉo';
+$labels['resetsearch'] = 'Vakigu serĉon';
+$labels['compose'] = 'Verku mesaĝon';
+$labels['savemessage'] = 'Savu ĉi tiun malneton';
+$labels['sendmessage'] = 'Sendu mesaĝon';
+$labels['addattachment'] = 'Alfiksu dosieron';
+$labels['charset'] = 'Karaktraro';
+$labels['editortype'] = 'Speco de redaktilo';
+$labels['returnreceipt'] = 'Return receipt';
+$labels['checkspelling'] = 'Kontrolu literumadon';
+$labels['resumeediting'] = 'Rekomencu redaktadon';
+$labels['revertto'] = 'Reiru al';
 $labels['attachments'] = 'Alfiksaĵoj';
 $labels['upload'] = 'Alŝutu';
-$labels['close']  = 'Fermu';
-
-$labels['low']     = 'Malalta';
-$labels['lowest']  = 'Plej malalta';
-$labels['normal']  = 'Normala';
-$labels['high']    = 'Alta';
+$labels['close'] = 'Fermu';
+$labels['low'] = 'Malalta';
+$labels['lowest'] = 'Plej malalta';
+$labels['normal'] = 'Normala';
+$labels['high'] = 'Alta';
 $labels['highest'] = 'Plej alta';
-
-$labels['nosubject']  = '(sensubjekto)';
+$labels['nosubject'] = '(sen temo)';
 $labels['showimages'] = 'Montru bildojn';
-
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Plata teksto';
-
-
-// address boook
-$labels['name']      = 'Nomo';
-$labels['firstname'] = 'Antaŭa nomo';
-$labels['surname']   = 'Familia nomo';
-$labels['email']     = 'Retpoŝto';
-
+$labels['addcc'] = 'Aldonu kopi-ricevanton';
+$labels['addbcc'] = 'Aldonu blindan kopi-ricevanton';
+$labels['addreplyto'] = 'Aldonu Respondu-Al';
+$labels['mdnrequest'] = 'La sendinto de ĉi tiu mesaĝo petis sciigon de kiam vi legas ĝin. Ĉu volas sciigi la sendinton?';
+$labels['receiptread'] = 'Legokonfirmo';
+$labels['yourmessage'] = 'Jen estas legokonfirmo de via mesaĝo';
+$labels['receiptnote'] = 'Notu: Ĉi tiu konfirmo nur asertas ke la mesaĝo estis malfermita je la komputilo de la ricevinto. Ne estas garantio ke la ricevinto legis aŭ komprenis la enhavon.';
+$labels['name'] = 'Nomo';
+$labels['firstname'] = 'Antaŭnomo';
+$labels['surname'] = 'Familia nomo';
+$labels['email'] = 'Retpoŝto';
 $labels['addcontact'] = 'Aldonu kontakton';
 $labels['editcontact'] = 'Redaktu kontakton';
-
-$labels['edit']   = 'Redaktu';
+$labels['edit'] = 'Redaktu';
 $labels['cancel'] = 'Rezignu';
-$labels['save']   = 'Savu';
+$labels['save'] = 'Savu';
 $labels['delete'] = 'Forigu';
-
-$labels['newcontact']     = 'Kreu novan kontaktaĵon';
-$labels['deletecontact']  = 'Forigu elektatajn kontaktojn';
-$labels['composeto']      = 'Verku mesaĝon al';
+$labels['newcontact'] = 'Kreu novan kontakton';
+$labels['deletecontact'] = 'Forigu elektatajn kontaktojn';
+$labels['composeto'] = 'Verku mesaĝon al';
 $labels['contactsfromto'] = 'Kontaktoj ekde $from ĝis $to de $count';
-$labels['print']          = 'Printu';
-$labels['export']         = 'Eksportu';
-
-$labels['previouspage']   = 'Montru auntaŭan aron';
-$labels['firstpage']      = 'Montru unuan aron';
-$labels['nextpage']       = 'Montru sekvan aron';
-$labels['lastpage']       = 'Montru lastan aron';
-
+$labels['print'] = 'Printu';
+$labels['export'] = 'Eksportu';
+$labels['previouspage'] = 'Montru auntaŭan';
+$labels['firstpage'] = 'Montru unuan';
+$labels['nextpage'] = 'Montru sekvan';
+$labels['lastpage'] = 'Montru lastan';
 $labels['groups'] = 'Grupoj';
 $labels['personaladrbook'] = 'Persona Adresoj';
-
-
-// settings
-$labels['settingsfor']  = 'Preferoj de';
-
-$labels['preferences']  = 'Preferoj';
-$labels['userpreferences']  = 'Uzant-preferoj';
-$labels['editpreferences']  = 'Redajtu uzant-preferojn';
-
-$labels['identities']  = 'Identoj';
-$labels['manageidentities']  = 'Administru identoj de ĉi tiu konto';
-$labels['newidentity']  = 'Nova idento';
-
-$labels['newitem']  = 'Nova ero';
-$labels['edititem']  = 'Redaktu eron';
-
-$labels['setdefault']  = 'Agordu kiel defaŭlta';
-$labels['language']  = 'Lingvo';
-$labels['timezone']  = 'Tempzono';
-$labels['pagesize']  = 'Mesaĝoj po paĝo';
+$labels['settingsfor'] = 'Preferoj de';
+$labels['preferences'] = 'Preferoj';
+$labels['userpreferences'] = 'Uzant-preferoj';
+$labels['editpreferences'] = 'Redaktu uzant-preferojn';
+$labels['identities'] = 'Identoj';
+$labels['manageidentities'] = 'Administru identojn de ĉi tiu konto';
+$labels['newidentity'] = 'Nova idento';
+$labels['newitem'] = 'Nova ero';
+$labels['edititem'] = 'Redaktu eron';
+$labels['setdefault'] = 'Agordu kiel norma';
+$labels['language'] = 'Lingvo';
+$labels['timezone'] = 'Tempzono';
+$labels['pagesize'] = 'Mesaĝoj po paĝo';
 $labels['signature'] = 'Subskribo';
-$labels['dstactive']  = 'Taglumsavado';
-$labels['htmleditor'] = 'Verku HTML mesaĝojn';
+$labels['dstactive'] = 'Taglumsavado';
+$labels['htmleditor'] = 'Uzado de HTML-redaktilo';
 $labels['htmlsignature'] = 'HTML subskribo';
 $labels['previewpane'] = 'Montru antaŭrigardejon';
-
-$labels['autosavedraft']  = 'Aŭtomate savu malneton';
-$labels['everynminutes']  = 'ĉiu $n minutoj';
-$labels['never']  = 'neniam';
-
-$labels['folder']  = 'Dosierujo';
-$labels['folders']  = 'Dosierujoj';
-$labels['foldername']  = 'Dosierujo-nomo';
-$labels['subscribed']  = 'Abonata';
-$labels['create']  = 'Kreu';
-$labels['createfolder']  = 'Kreu novan dosierujon';
+$labels['autosavedraft'] = 'Aŭtomate savu malneton';
+$labels['everynminutes'] = 'ĉiujn $n minutojn';
+$labels['never'] = 'neniam';
+$labels['folder'] = 'Dosierujo';
+$labels['folders'] = 'Dosierujoj';
+$labels['foldername'] = 'Dosierujo-nomo';
+$labels['subscribed'] = 'Abonata';
+$labels['messagecount'] = 'Mesaĝoj';
+$labels['create'] = 'Kreu';
+$labels['createfolder'] = 'Kreu novan dosierujon';
 $labels['rename'] = 'Renomu';
 $labels['renamefolder'] = 'Renomu dosierujon';
-$labels['deletefolder']  = 'Forigu dosierujon';
-$labels['managefolders']  = 'Administru dosierujon';
-
+$labels['deletefolder'] = 'Forigu dosierujon';
+$labels['managefolders'] = 'Administru dosierujon';
 $labels['sortby'] = 'Ordigu per';
-$labels['sortasc']  = 'Ordigu kreskante';
+$labels['sortasc'] = 'Ordigu kreskante';
 $labels['sortdesc'] = 'Ordigu malkreskante';
 
-?>
\ No newline at end of file
+?>
index 9051d1dd85e3e590cdad1fd579d191b0a51f4128..a831dbc5256ee9c6e051c442bfc3737fb96eef1d 100644 (file)
@@ -6,75 +6,75 @@
  | language/eo/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Andreas van Cranenburgh <andreas@unstable.nl                  |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
-
 */
 
 $messages = array();
-$messages['loginfailed']  = 'Malsukcesis ensaluti';
+$messages['loginfailed'] = 'Malsukcesis ensaluti';
 $messages['cookiesdisabled'] = 'Via foliumilo ne akceptas kuketojn';
-$messages['sessionerror'] = 'Via seanco estas nevalida aŭ finiĝita';
+$messages['sessionerror'] = 'Via seanco estas nevalida aŭ finita';
 $messages['imaperror'] = 'Konekto kun IMAP-servilo malsukcesis';
 $messages['nomessagesfound'] = 'Neniu mesaĝo en ĉi tiu dosierujo';
-$messages['loggedout'] = 'Vi sukcese finiĝis la seanco. Ĝis!';
+$messages['loggedout'] = 'Vi sukcese finis la seancon. Ĝis!';
 $messages['mailboxempty'] = 'Dosierujo estas malplena';
-$messages['loading'] = 'Ŝarĝante...';
-$messages['loadingdata'] = 'Ŝarĝante datumo...';
-$messages['checkingmail'] = 'Kontrolu por novaj mesaĝoj...';
-$messages['sendingmessage'] = 'Sedante mesaĝo...';
+$messages['loading'] = 'Ŝarganta...';
+$messages['loadingdata'] = 'Ŝarganta datumojn...';
+$messages['checkingmail'] = 'Kontrolanta, ĉu  novaj mesaĝoj...';
+$messages['sendingmessage'] = 'Sedanta mesaĝon...';
 $messages['messagesent'] = 'Mesaĝo estas sendita sukcese';
-$messages['savingmessage'] = 'Savante mesaĝo...';
+$messages['savingmessage'] = 'Savanta mesaĝon...';
 $messages['messagesaved'] = 'Mesaĝo savita en Malnetujo';
 $messages['successfullysaved'] = 'Sukcese savis';
 $messages['addedsuccessfully'] = 'Sukcese aldonis kontakton al adresaro';
 $messages['contactexists'] = 'Kontakto kun ĉi tiu adreso jam ekzistas';
-$messages['blockedimages'] = 'Por protekti vian privatecon, foraj bildoj ne estas montrata en ĉi tiu mesaĝo.';
-$messages['encryptedmessage'] = 'Ĉi tiu mesaĝo estas ĉifrata kaj ne eblas montri. Pardonu!'; #sorry -> pardonu?
+$messages['blockedimages'] = 'Por protekti vian privatecon, foraj bildoj estas blokitaj en ĉi tiu mesaĝo.';
+$messages['encryptedmessage'] = 'Ĉi tiu mesaĝo estas ĉifrata kaj ne estas montrebla. Pardonu!';
 $messages['nocontactsfound'] = 'Trovis neniun kontakton';
-$messages['contactnotfound'] = 'La petitan kontakton ne trovis';
-
-$messages['sendingfailed'] = 'Nesukcesis sendi mesaĝon';
-$messages['errorsaving'] = 'Eraro dum savo de mesaĝo';
+$messages['contactnotfound'] = 'La petita kontakto ne trovis';
+$messages['sendingfailed'] = 'Ne sukcesis sendi mesaĝon';
+$messages['errorsaving'] = 'Okazis eraro dum savo de mesaĝo';
 $messages['errormoving'] = 'Ne povis transloki mesaĝon';
 $messages['errordeleting'] = 'Ne povis forigi mesaĝon';
-$messages['deletecontactconfirm']  = 'Ĉu vi vere volas forigi la elektata(j)n kontakto(j)n?';
+$messages['deletecontactconfirm'] = 'Ĉu vi vere volas forigi la elektata(j)n kontakto(j)n?';
 $messages['deletemessagesconfirm'] = 'Ĉu vi vere volas forigi la elektata(j)n mesaĝo(j)n?';
-$messages['deletefolderconfirm']  = 'Ĉu vi vere volas forigi la elektatan dosierujon?';
-$messages['purgefolderconfirm']  = 'Ĉu vi vere volas forigi ĉiun mesaĝon en ĉi tiu dosierujo?';
-$messages['formincomplete'] = 'La formularo ne estis kompletiĝita';
-$messages['noemailwarning'] = 'Bonvolu skribu validan retpoŝt-adreson';
-$messages['nonamewarning']  = 'Bonvulu skribu nomon';
-$messages['nopagesizewarning'] = 'Bonvolu skribu paĝ-grando';
-$messages['norecipientwarning'] = 'Bonvolu skribu minumume unu ricevonto';
-$messages['nosubjectwarning']  = 'La "Subjekto" kampo estas malplena. Ĉu vi volas skribi subjekton nun?';
-$messages['nobodywarning'] = 'Ĉu sendu ĉi tiun mesaĝon sen teksto?';
+$messages['deletefolderconfirm'] = 'Ĉu vi vere volas forigi la elektatan dosierujon?';
+$messages['purgefolderconfirm'] = 'Ĉu vi vere volas forigi ĉiun mesaĝon el ĉi tiu dosierujo?';
+$messages['formincomplete'] = 'La formularo ne estis kompletigita';
+$messages['noemailwarning'] = 'Bonvolu enmeti validan retpoŝt-adreson';
+$messages['nonamewarning'] = 'Bonvulu enmeti nomon';
+$messages['nopagesizewarning'] = 'Bonvolu enmeti paĝ-grando';
+$messages['norecipientwarning'] = 'Bonvolu enmeti minumume unu ricevonto';
+$messages['nosubjectwarning'] = 'La temkampo estas malplena. Ĉu vi volas skribi temon nun?';
+$messages['nobodywarning'] = 'Ĉu sendi ĉi tiun mesaĝon sen teksto?';
 $messages['notsentwarning'] = 'Mesaĝo ne estas sendita. Ĉu vi volas forigi vian mesaĝon?';
-$messages['noldapserver'] = 'Bonvolu elekti ldap-servilo por serĉi';
-$messages['nocontactsreturned'] = 'Trovis nenion kontakton';
-$messages['nosearchname'] = 'Bonvolu skribi kontakt-nomo aŭ retpoŝt-adreson.';
+$messages['noldapserver'] = 'Bonvolu elekti ldap-servilon por serĉado';
+$messages['nocontactsreturned'] = 'Trovis neniun kontakton';
+$messages['nosearchname'] = 'Bonvolu enmeti kontakt-nomon aŭ retpoŝt-adreson.';
 $messages['searchsuccessful'] = 'trovis $nr mesaĝojn';
 $messages['searchnomatch'] = 'Serĉo donis nenion';
-$messages['searching'] = 'Serĉante...';
-$messages['checking'] = 'Kontrolante...';
-$messages['nospellerrors'] = 'Neniujn grafismaj erarojn trovis';
+$messages['searching'] = 'Serĉanta...';
+$messages['checking'] = 'Kontrolanta...';
+$messages['nospellerrors'] = 'Neniujn literumada eraro trovita';
 $messages['folderdeleted'] = 'Forigis dosierujon sukcese';
-$messages['deletedsuccessfully'] = "Sukcese forigis";
-$messages['converting'] = 'Forigante formata de mesaĝo...';
-$messages['messageopenerror'] = 'Ne povis ŝarĝi mesaĝon de servilo';
+$messages['deletedsuccessfully'] = 'Sukcese forigis';
+$messages['converting'] = 'Foriganta formatan de mesaĝo...';
+$messages['messageopenerror'] = 'Ne povis ŝargi mesaĝon de servilo';
 $messages['fileuploaderror'] = 'Malsukcesis alŝuti dosieron';
-$messages['filesizeerror'] = 'La dosiero superas la maksimuma grando de $size';
-
+$messages['filesizeerror'] = 'La alŝutita dosiero superas la maksimuman grandon de $size';
 $messages['copysuccess'] = 'Sukcese kopiis $nr adresojn';
-$messages['copyerror'] = 'Ne povis kopii ajn adresojn';
+$messages['copyerror'] = 'Ne povis kopii ajn adreson';
 $messages['sourceisreadonly'] = 'Ĉi tiu adres-fonto estas nurlegebla';
 $messages['errorsavingcontact'] = 'Ne povis savi la kontakt-adreson';
+$messages['movingmessage'] = 'Translokanta mesaĝon...';
+$messages['receiptsent'] = 'Sukcese sendis konfirmon';
+$messages['errorsendingreceipt'] = 'Ne povis sendi konfirmon';
+$messages['nodeletelastidentity'] = 'Vi ne povas forigi ĉi tiun identon, ĉar ĝi estas la lasta';
+$messages['addsubfolderhint'] = 'Ĉi tiu dosierujo estos farita kiel subdosierujo de la nune elektita dosierujo';
 
-
-?>
\ No newline at end of file
+?>
index ea20eba588832e1f9ecb0794aff1c286fe086243..54a5e8c730e6425e4ac70e875f08164a50b9e02d 100644 (file)
@@ -6,7 +6,7 @@
  | language/es/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -16,7 +16,7 @@
  |         http://david.grajal.net                                       |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 873 2007-10-16 19:06:34Z yllar $
+ @version $Id: labels.inc 1079 2008-02-14 07:47:11Z tomekp $
 
 */
 
@@ -47,7 +47,7 @@ $labels['priority'] = 'Prioridad';
 $labels['organization'] = 'Organización';
 $labels['reply-to'] = 'Respuesta a';
 $labels['mailboxlist'] = 'Bandejas';
-$labels['messagesfromto'] = 'Mensajes desde $from a $to de $count';
+$labels['messagesfromto'] = 'Mensajes $from a $to de $count';
 $labels['messagenrof'] = 'Mensaje $nr de $count';
 $labels['moveto'] = 'mover a...';
 $labels['download'] = 'descargar';
@@ -60,7 +60,7 @@ $labels['addtoaddressbook'] = 'Añadir a contactos';
 $labels['sun'] = 'Dom';
 $labels['mon'] = 'Lun';
 $labels['tue'] = 'Mar';
-$labels['wed'] = 'Mie';
+$labels['wed'] = 'Mié';
 $labels['thu'] = 'Jue';
 $labels['fri'] = 'Vie';
 $labels['sat'] = 'Sáb';
@@ -90,6 +90,9 @@ $labels['lastmessage'] = 'Mostrar último mensaje';
 $labels['lastmessages'] = 'Mostrar último grupo de mensajes';
 $labels['backtolist'] = 'Volver a la lista de mensajes';
 $labels['viewsource'] = 'Mostrar código';
+$labels['markmessages'] = 'Marcar mensajes';
+$labels['markread'] = 'Como leído';
+$labels['markunread'] = 'Como no leído';
 $labels['select'] = 'Elija';
 $labels['all'] = 'Todos';
 $labels['none'] = 'Ninguno';
@@ -127,6 +130,10 @@ $labels['plaintoggle'] = 'Texto';
 $labels['addcc'] = 'Añadir Cc';
 $labels['addbcc'] = 'Añadir Bcc';
 $labels['addreplyto'] = 'Añadir Respuesta a';
+$labels['mdnrequest'] = 'El emisor de este mensaje desea ser notificado cuando usted lo lea. ¿Quiere enviar esta notificación?';
+$labels['receiptread'] = 'Notificación de lectura';
+$labels['yourmessage'] = 'Esta es una notificación de lectura de su mensaje';
+$labels['receiptnote'] = 'Nota: Esta notificación sólo significa que su mensaje fue mostrado en la computadora del receptor. No hay garantía de que el receptor haya leído o entendido el contenido del mensaje.';
 $labels['name'] = 'Nombre completo';
 $labels['firstname'] = 'Nombre';
 $labels['surname'] = 'Apellido';
@@ -174,6 +181,7 @@ $labels['folder'] = 'Bandeja';
 $labels['folders'] = 'Bandejas';
 $labels['foldername'] = 'Nombre de bandeja';
 $labels['subscribed'] = 'Suscrita';
+$labels['messagecount'] = 'Mensajes';
 $labels['create'] = 'Crear';
 $labels['createfolder'] = 'Crear nueva bandeja';
 $labels['rename'] = 'Renombrar';
@@ -184,4 +192,4 @@ $labels['sortby'] = 'Ordenar por';
 $labels['sortasc'] = 'Orden ascendente';
 $labels['sortdesc'] = 'Orden descendente';
 
-?>
+?>
\ No newline at end of file
index 32a5a4427b955da3a876c314be47525e47de2609..3092a3f0b1ad6c3594179389bba6c948af3d0bbf 100644 (file)
@@ -6,7 +6,7 @@
  | language/es/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
  |         Lito Jornero <jornero@gmail.com>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 873 2007-10-16 19:06:34Z yllar $
+ @version $Id: messages.inc 1079 2008-02-14 07:47:11Z tomekp $
 
 */
 
@@ -76,5 +76,9 @@ $messages['copyerror'] = 'No se pudo copiar ninguna dirección';
 $messages['sourceisreadonly'] = 'Esta dirección es de sólo-lectura';
 $messages['errorsavingcontact'] = 'No se pudo guardar la dirección de contacto';
 $messages['movingmessage'] = 'Moviendo mensaje...';
+$messages['receiptsent'] = 'La notificación de lectura se ha enviado con éxito.';
+$messages['errorsendingreceipt'] = 'No se ha podido enviar la notificación de lectura.';
+$messages['nodeletelastidentity'] = 'No se puede borrar esta identidad puesto que es la última.';
+$messages['addsubfolderhint'] = 'Esta carpeta se creará como una subcarpeta dentro de la carpeta seleccionada';
 
-?>
+?>
\ No newline at end of file
index 52461214646c0df3dd51a3c2ba7f71e2d6863b27..f66eddd513d595c68f5abcbf7ed61f75b2e3ea0e 100644 (file)
@@ -6,7 +6,7 @@
  | language/et_EE/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -87,6 +87,9 @@ $labels['lastmessage'] = 'Näita viimast kirja';
 $labels['lastmessages'] = 'Näita viimast kirjade komplekti';
 $labels['backtolist'] = 'Tagasi kirjade nimekirja';
 $labels['viewsource'] = 'Näita lähtekoodi';
+$labels['markmessages'] = 'Märgi kirjad';
+$labels['markread'] = 'Loetuks';
+$labels['markunread'] = 'Mitte loetuks';
 $labels['select'] = 'Vali';
 $labels['all'] = 'kõik';
 $labels['none'] = 'mitte midagi';
@@ -124,6 +127,10 @@ $labels['plaintoggle'] = 'Lihttekst';
 $labels['addcc'] = 'Lisa koopia';
 $labels['addbcc'] = 'Lisa pimekoopia';
 $labels['addreplyto'] = 'Lisa vastus aadressile';
+$labels['mdnrequest'] = 'Selle kirja saatja soovib saada kinnitust kirja lugemise kohta. Soovid kinnituse saata ?';
+$labels['receiptread'] = 'Kättesaamiskinnitus (leotud)';
+$labels['yourmessage'] = 'See on sinu saadetud kirja kättesaamiskinnitus';
+$labels['receiptnote'] = 'Märkus: Kättesaamiskinnituse saamine tähendab ainult seda, et saaja on kirja avanud. Pole mingit garantiid, et ta kirja tegelikult luges ja selle sisust aru sai.';
 $labels['name'] = 'Näidatav nimi';
 $labels['firstname'] = 'Eesnimi';
 $labels['surname'] = 'Perekonnanimi';
@@ -171,6 +178,7 @@ $labels['folder'] = 'Kaust';
 $labels['folders'] = 'Kaustad';
 $labels['foldername'] = 'Kausta nimi';
 $labels['subscribed'] = 'Näitan';
+$labels['messagecount'] = 'Kirju';
 $labels['create'] = 'Loo';
 $labels['createfolder'] = 'Uue kausta loomine';
 $labels['rename'] = 'Nimeta ümber';
@@ -181,4 +189,4 @@ $labels['sortby'] = 'Järjesta';
 $labels['sortasc'] = 'Järjesta kasvavalt';
 $labels['sortdesc'] = 'Järjesta kahanevalt';
 
-?>
\ No newline at end of file
+?>
index 7077d1dca587980f7286dda4390b8f7e6dd24785..ecea2711842cbaa6ea836ca95ce546af985bd111 100644 (file)
@@ -6,7 +6,7 @@
  | language/et_EE/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -74,5 +74,8 @@ $messages['copyerror'] = 'Ühegi aadressi kopeerimine ei õnnestunud ';
 $messages['sourceisreadonly'] = 'Aadressi asukohas puuduvad kirjutusõigused';
 $messages['errorsavingcontact'] = 'Kontakti aadressi salvestamine ebaõnnestus';
 $messages['movingmessage'] = 'Kirja liigutamine...';
-
-?>
\ No newline at end of file
+$messages['receiptsent'] = 'Kättesaamiskinnitus saadetud';
+$messages['errorsendingreceipt'] = 'Ei õnnestunud kättesaamiskinnitust saata';
+$messages['nodeletelastidentity'] = 'See identiteet on viimane ja seda ei saa kustutada.';
+$messages['addsubfolderhint'] = 'See kataloog luuakse valitud kausta alamkataloogina.';
+?>
index f040729533aa2490ebefed84049b584de45e9465..2fb5feea0cde97b89120e0051d88796bffbc4757 100644 (file)
@@ -5,14 +5,14 @@
  | language/eu/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundQube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Bicyus <bicyus@tenkanet.com>                                  |
  +-----------------------------------------------------------------------+
 
$Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
@version $Id: labels.inc 950 2008-01-04 08:04:53Z tomekp $
 
 */
 
index 4bb6e2e4df59bb1770b84728aceff7df98374a9e..279efd8dc127ea5b35abec9589836ef6ab0f7460 100644 (file)
@@ -5,14 +5,14 @@
  | language/eu/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: pi <pi@beobide.net>                                           |
  +-----------------------------------------------------------------------+
 
$Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
@version $Id: messages.inc 950 2008-01-04 08:04:53Z tomekp $
 
 */
 
index 47ddfbbb2f27d47b9ca80d02a9e8d534b59a5713..6b81d1d2044524ecdad5e93116d80c73e93c6583 100644 (file)
-<?php\r
-\r
-/*\r
- +-----------------------------------------------------------------------+\r
- | language/fa/labels.inc                                                |\r
- |                                                                       |\r
- | Language file of the RoundCube Webmail client                         |\r
- | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |\r
- | Licensed under the GNU GPL                                            |\r
- |                                                                       |\r
- +-----------------------------------------------------------------------+\r
- | Translators:                                                          |
- |     Anoosh <anoosher2003@yahoo.com>                                   |\r
- |     Mohammad Ebrahim Mohammadi Panah <mebrahim@gmail.com>             |\r
- +-----------------------------------------------------------------------+\r
-\r
-*/\r
-\r
-$labels = array();\r
-$labels['welcome'] = 'به $product خوش آمدید';\r
-$labels['username'] = 'نام کاربری';\r
-$labels['password'] = 'گذرواژه';\r
-$labels['server'] = 'خادم';\r
-$labels['login'] = 'ورود';\r
-$labels['logout'] = 'خروج';\r
-$labels['mail'] = 'رایانامه';\r
-$labels['settings'] = 'تنظیمات شخصی';\r
-$labels['addressbook'] = 'دفتر نشانی‌ها';\r
-$labels['inbox'] = 'صندوق';\r
-$labels['drafts'] = 'پیش‌نویس‌ها';\r
-$labels['sent'] = 'فرستاده‌شده‌ها';\r
-$labels['trash'] = 'زباله‌دان';\r
-$labels['junk'] = 'بنجل';\r
-$labels['subject'] = 'موضوع';\r
-$labels['from'] = 'فرستنده';\r
-$labels['to'] = 'گیرنده';\r
-$labels['cc'] = 'رونوشت';\r
-$labels['bcc'] = 'رونوشت مخفی';\r
-$labels['replyto'] = 'پاسخ-به';\r
-$labels['date'] = 'تاریخ';\r
-$labels['size'] = 'حجم';\r
-$labels['priority'] = 'اولویت';\r
-$labels['organization'] = 'سازمان‌دهی';\r
-$labels['reply-to'] = 'پاسخ-به';\r
-$labels['mailboxlist'] = 'پوشه‌ها';\r
-$labels['messagesfromto'] = 'پیغام‌های $from تا $to از $count تا';\r
-$labels['messagenrof'] = 'پیغام $nr از $count تا';\r
-$labels['moveto'] = '...انتقال به';\r
-$labels['download'] = 'پایین‌گذاری';\r
-$labels['filename'] = 'نام پرونده';\r
-$labels['filesize'] = 'اندازه‌ی پرونده';\r
-$labels['preferhtml'] = 'نمایش HTML';\r
-$labels['htmlmessage'] = 'پیغام HTML';\r
-$labels['prettydate'] = 'تاریخ‌های زیبا';\r
-$labels['addtoaddressbook'] = 'افزودن به دفتر نشانی‌ها';\r
-$labels['sun'] = 'یک‌شنبه';\r
-$labels['mon'] = 'دوشنبه';\r
-$labels['tue'] = 'سه‌شنبه';\r
-$labels['wed'] = 'چهارشنبه';\r
-$labels['thu'] = 'پنج‌شنبه';\r
-$labels['fri'] = 'جمعه';\r
-$labels['sat'] = 'شنبه';\r
-$labels['sunday'] = 'یک‌شنبه';\r
-$labels['monday'] = 'دوشنبه';\r
-$labels['tuesday'] = 'سه‌شنبه';\r
-$labels['wednesday'] = 'چهارشنبه';\r
-$labels['thursday'] = 'پنج‌شنبه';\r
-$labels['friday'] = 'جمعه';\r
-$labels['saturday'] = 'شنبه';\r
-$labels['today'] = 'امروز';\r
-$labels['checkmail'] = 'بررسی برای پیغام‌های جدید';\r
-$labels['writenewmessage'] = 'ایجاد پیغام جدید';\r
-$labels['replytomessage'] = 'پاسخ به پیغام';\r
-$labels['replytoallmessage'] = 'پاسخ به فرستنده وتمام گیرنده‌ها';\r
-$labels['forwardmessage'] = 'ارجاع پیغام';\r
-$labels['deletemessage'] = 'حذف پیغام';\r
-$labels['movemessagetotrash'] = 'انتقال پیغام به زباله‌دان';\r
-$labels['printmessage'] = 'چاپ این پیغام';\r
-$labels['previousmessage'] = 'نمایش پیغام قبلی';\r
-$labels['previousmessages'] = 'نمایش دسته‌ی قبلی  پیغام‌ها';\r
-$labels['firstmessage'] = 'نمایش اولین  پیغام';\r
-$labels['firstmessages'] = 'نمایش اولین دسته‌ی پیغام‌ها';\r
-$labels['nextmessage'] = 'نمایش پیغام بعدی';\r
-$labels['nextmessages'] = 'نمایش دسته‌ی بعدی  پیغام‌ها';\r
-$labels['lastmessage'] = 'نمایش آخرین پیغام';\r
-$labels['lastmessages'] = 'نمایش آخرین دسته‌ی  پیغام‌ها';\r
-$labels['backtolist'] = 'بازگشت به فهرست پیغام‌ها';\r
-$labels['viewsource'] = 'نمایش منبع';\r
-$labels['select'] = 'انتخاب';\r
-$labels['all'] = 'همه';\r
-$labels['none'] = 'هیچ';\r
-$labels['unread'] = 'ناخوانده';\r
-$labels['compact'] = 'فشرده';\r
-$labels['empty'] = 'خالی';\r
-$labels['purge'] = 'خرد کردن';\r
-$labels['quota'] = 'فضای استفاده شده';\r
-$labels['unknown'] = 'ناشناخته';\r
-$labels['unlimited'] = 'نامحدود';\r
-$labels['quicksearch'] = 'جستجوی سریع';\r
-$labels['resetsearch'] = 'شروع مجدد جستجو';\r
-$labels['compose'] = 'نوشتن پیغام';\r
-$labels['savemessage'] = 'ذخیره‌ی این پیش‌نویس';\r
-$labels['sendmessage'] = 'ارسال پیغام';\r
-$labels['addattachment'] = 'پیوست کردن یک پرونده';\r
-$labels['charset'] = 'مجموعه‌نمایه';\r
-$labels['editortype'] = 'نوع ویرایش‌گر';\r
-$labels['returnreceipt'] = 'گیرنده‌ی پیغام بازگشت';\r
-$labels['checkspelling'] = 'بررسی املایی';\r
-$labels['resumeediting'] = 'ادامه‌ی ویرایش';\r
-$labels['revertto'] = 'برگرداندن به';\r
-$labels['attachments'] = 'پیوست‌ها';\r
-$labels['upload'] = 'بالاگذاری';\r
-$labels['close'] = 'بستن';\r
-$labels['low'] = 'کم';\r
-$labels['lowest'] = 'کم‌ترین';\r
-$labels['normal'] = 'معمولی';\r
-$labels['high'] = 'زیاد';\r
-$labels['highest'] = 'بیش‌ترین';\r
-$labels['nosubject'] = '(بدون موضوع)';\r
-$labels['showimages'] = 'نمایش عکس‌ها';\r
-$labels['htmltoggle'] = 'HTML';\r
-$labels['plaintoggle'] = 'متن ساده';\r
-$labels['addcc'] = 'افزودن رونوشت';\r
-$labels['addbcc'] = 'افزودن رونوشت مخفی';\r
-$labels['addreplyto'] = 'افزودن پاسخ-به';\r
-$labels['name'] = 'نمایش نام';\r
-$labels['firstname'] = 'نام';\r
-$labels['surname'] = 'نام خانوادگی';\r
-$labels['email'] = 'رایانامه';\r
-$labels['addcontact'] = 'افزودن تماس جدید';\r
-$labels['editcontact'] = 'ویرایش تماس';\r
-$labels['edit'] = 'ویرایش';\r
-$labels['cancel'] = 'لغو';\r
-$labels['save'] = 'ذخیره';\r
-$labels['delete'] = 'حذف';\r
-$labels['newcontact'] = 'ایجاد کارت تماس جدید';\r
-$labels['deletecontact'] = 'حذف تماس‌های انتخاب شده';\r
-$labels['composeto'] = 'نوشتن نامه به';\r
-$labels['contactsfromto'] = 'تماس‌های $from تا $to از $count تا';\r
-$labels['print'] = 'چاپ';\r
-$labels['export'] = 'صدور';\r
-$labels['previouspage'] = 'نمایش دسته‌ی قبلی';\r
-$labels['firstpage'] = 'نمایش دسته‌ی اول';\r
-$labels['nextpage'] = 'نمایش دسته‌ی بعدی';\r
-$labels['lastpage'] = 'نمایش دسته‌ی آخر';\r
-$labels['groups'] = 'گروه‌ها';\r
-$labels['personaladrbook'] = 'نشانی‌های شخصی';\r
-$labels['settingsfor'] = 'تنظیمات';\r
-$labels['preferences'] = 'ترجیحات';\r
-$labels['userpreferences'] = 'ترجیحات کاربر';\r
-$labels['editpreferences'] = 'ویرایش ترجیحات کاربر';\r
-$labels['identities'] = 'شناسه‌ها';\r
-$labels['manageidentities'] = 'مدیریت شناسه‌ها برای این حساب';\r
-$labels['newidentity'] = 'شناسه جدید';\r
-$labels['newitem'] = 'مورد جدید';\r
-$labels['edititem'] = 'ویرایش مورد';\r
-$labels['setdefault'] = 'پیش‌فرض کن';\r
-$labels['language'] = 'زبان';\r
-$labels['timezone'] = 'محدوده‌ی زمانی';\r
-$labels['pagesize'] = 'سطر در صفحه';\r
-$labels['signature'] = 'امضا';\r
-$labels['dstactive'] = 'ساعت تابستانی';\r
-$labels['htmleditor'] = 'HTML ‌نوشتن پیغام‌های';\r
-$labels['htmlsignature'] = 'HTML امضای';\r
-$labels['previewpane'] = 'نمایش قاب پیش‌نمایش';\r
-$labels['autosavedraft'] = 'ذخیره‌ی خودکار پیش‌نویس';\r
-$labels['everynminutes'] = 'هر $n دقیقه';\r
-$labels['never'] = 'هرگز';\r
-$labels['folder'] = 'پوشه';\r
-$labels['folders'] = 'پوشه‌ها';\r
-$labels['foldername'] = 'نام پوشه';\r
-$labels['subscribed'] = 'مورد اشتراک';\r
-$labels['create'] = 'ایجاد';\r
-$labels['createfolder'] = 'ایجاد پوشه‌ی جدید';\r
-$labels['rename'] = 'تغییر نام';\r
-$labels['renamefolder'] = 'تغییر نام پوشه';\r
-$labels['deletefolder'] = 'حذف پوشه';\r
-$labels['managefolders'] = 'مدیریت پوشه‌ها';\r
-$labels['sortby'] = 'مرتب‌سازی بر اساس';\r
-$labels['sortasc'] = 'مرتب‌سازی صعودی';\r
-$labels['sortdesc'] = 'مرتب‌سازی نزولی';\r
-\r
-?>
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | language/fa/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Mohammad Ebrahim Mohammadi Panah <mebrahim@gmail.com>         |
+ |         Anoosh <anoosher2003@yahoo.com>                               |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'به $product خوش آمدید';
+$labels['username'] = 'نام کاربری';
+$labels['password'] = 'گذرواژه';
+$labels['server'] = 'خادم';
+$labels['login'] = 'ورود';
+$labels['logout'] = 'خروج';
+$labels['mail'] = 'رایانامه';
+$labels['settings'] = 'تنظیمات شخصی';
+$labels['addressbook'] = 'دفتر نشانی‌ها';
+$labels['inbox'] = 'صندوق';
+$labels['drafts'] = 'پیش‌نویس‌ها';
+$labels['sent'] = 'فرستاده‌شده‌ها';
+$labels['trash'] = 'زباله‌دان';
+$labels['junk'] = 'بنجل';
+$labels['subject'] = 'موضوع';
+$labels['from'] = 'فرستنده';
+$labels['to'] = 'گیرنده';
+$labels['cc'] = 'رونوشت';
+$labels['bcc'] = 'رونوشت مخفی';
+$labels['replyto'] = 'پاسخ-به';
+$labels['date'] = 'تاریخ';
+$labels['size'] = 'حجم';
+$labels['priority'] = 'اولویت';
+$labels['organization'] = 'سازمان‌دهی';
+$labels['reply-to'] = 'پاسخ-به';
+$labels['mailboxlist'] = 'پوشه‌ها';
+$labels['messagesfromto'] = 'پیغام‌های $from تا $to از $count تا';
+$labels['messagenrof'] = 'پیغام $nr از $count تا';
+$labels['moveto'] = '...انتقال به';
+$labels['download'] = 'پایین‌گذاری';
+$labels['filename'] = 'نام پرونده';
+$labels['filesize'] = 'اندازه‌ی پرونده';
+$labels['preferhtml'] = 'نمایش HTML';
+$labels['htmlmessage'] = 'پیغام HTML';
+$labels['prettydate'] = 'تاریخ‌های زیبا';
+$labels['addtoaddressbook'] = 'افزودن به دفتر نشانی‌ها';
+$labels['sun'] = 'یک‌شنبه';
+$labels['mon'] = 'دوشنبه';
+$labels['tue'] = 'سه‌شنبه';
+$labels['wed'] = 'چهارشنبه';
+$labels['thu'] = 'پنج‌شنبه';
+$labels['fri'] = 'جمعه';
+$labels['sat'] = 'شنبه';
+$labels['sunday'] = 'یک‌شنبه';
+$labels['monday'] = 'دوشنبه';
+$labels['tuesday'] = 'سه‌شنبه';
+$labels['wednesday'] = 'چهارشنبه';
+$labels['thursday'] = 'پنج‌شنبه';
+$labels['friday'] = 'جمعه';
+$labels['saturday'] = 'شنبه';
+$labels['today'] = 'امروز';
+$labels['checkmail'] = 'بررسی برای پیغام‌های جدید';
+$labels['writenewmessage'] = 'ایجاد پیغام جدید';
+$labels['replytomessage'] = 'پاسخ به پیغام';
+$labels['replytoallmessage'] = 'پاسخ به فرستنده وتمام گیرنده‌ها';
+$labels['forwardmessage'] = 'ارجاع پیغام';
+$labels['deletemessage'] = 'حذف پیغام';
+$labels['movemessagetotrash'] = 'انتقال پیغام به زباله‌دان';
+$labels['printmessage'] = 'چاپ این پیغام';
+$labels['previousmessage'] = 'نمایش پیغام قبلی';
+$labels['previousmessages'] = 'نمایش دسته‌ی قبلی  پیغام‌ها';
+$labels['firstmessage'] = 'نمایش اولین  پیغام';
+$labels['firstmessages'] = 'نمایش اولین دسته‌ی پیغام‌ها';
+$labels['nextmessage'] = 'نمایش پیغام بعدی';
+$labels['nextmessages'] = 'نمایش دسته‌ی بعدی  پیغام‌ها';
+$labels['lastmessage'] = 'نمایش آخرین پیغام';
+$labels['lastmessages'] = 'نمایش آخرین دسته‌ی  پیغام‌ها';
+$labels['backtolist'] = 'بازگشت به فهرست پیغام‌ها';
+$labels['viewsource'] = 'نمایش منبع';
+$labels['markmessages'] = 'علامت‌گذاری پیغام‌ها';
+$labels['markread'] = 'به عنوان خوانده‌شده';
+$labels['markunread'] = 'به عنوان خوانده‌نشده';
+$labels['select'] = 'انتخاب';
+$labels['all'] = 'همه';
+$labels['none'] = 'هیچ';
+$labels['unread'] = 'ناخوانده';
+$labels['compact'] = 'فشرده';
+$labels['empty'] = 'خالی';
+$labels['purge'] = 'خرد کردن';
+$labels['quota'] = 'فضای استفاده شده';
+$labels['unknown'] = 'ناشناخته';
+$labels['unlimited'] = 'نامحدود';
+$labels['quicksearch'] = 'جستجوی سریع';
+$labels['resetsearch'] = 'شروع مجدد جستجو';
+$labels['compose'] = 'نوشتن پیغام';
+$labels['savemessage'] = 'ذخیره‌ی این پیش‌نویس';
+$labels['sendmessage'] = 'ارسال پیغام';
+$labels['addattachment'] = 'پیوست کردن یک پرونده';
+$labels['charset'] = 'مجموعه‌نمایه';
+$labels['editortype'] = 'نوع ویرایش‌گر';
+$labels['returnreceipt'] = 'رسید دریافت';
+$labels['checkspelling'] = 'بررسی املایی';
+$labels['resumeediting'] = 'ادامه‌ی ویرایش';
+$labels['revertto'] = 'برگرداندن به';
+$labels['attachments'] = 'پیوست‌ها';
+$labels['upload'] = 'بالاگذاری';
+$labels['close'] = 'بستن';
+$labels['low'] = 'کم';
+$labels['lowest'] = 'کم‌ترین';
+$labels['normal'] = 'معمولی';
+$labels['high'] = 'زیاد';
+$labels['highest'] = 'بیش‌ترین';
+$labels['nosubject'] = '(بدون موضوع)';
+$labels['showimages'] = 'نمایش عکس‌ها';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'متن ساده';
+$labels['addcc'] = 'افزودن رونوشت';
+$labels['addbcc'] = 'افزودن رونوشت مخفی';
+$labels['addreplyto'] = 'افزودن پاسخ-به';
+$labels['mdnrequest'] = 'فرستندهٔ این پیغام خواسته است که وقتی شما این پیغام را می‌خوانید، آگاه شود. آیا مایلید فرستنده را آگاه کنید؟';
+$labels['receiptread'] = 'رسید دریافت (خواندن)';
+$labels['yourmessage'] = 'این یک رسید دریافت برای پیغام شماست';
+$labels['receiptnote'] = 'تذکر: این رسید فقط تصدیق می‌کند که پیغام، روی رایانهٔ گیرنده نمایش داده شده است. هیچ تضمینی نیست که گیرنده، محتوای پیغام را خوانده یا فهمیده باشد.';
+$labels['name'] = 'نمایش نام';
+$labels['firstname'] = 'نام';
+$labels['surname'] = 'نام خانوادگی';
+$labels['email'] = 'رایانامه';
+$labels['addcontact'] = 'افزودن تماس جدید';
+$labels['editcontact'] = 'ویرایش تماس';
+$labels['edit'] = 'ویرایش';
+$labels['cancel'] = 'لغو';
+$labels['save'] = 'ذخیره';
+$labels['delete'] = 'حذف';
+$labels['newcontact'] = 'ایجاد کارت تماس جدید';
+$labels['deletecontact'] = 'حذف تماس‌های انتخاب شده';
+$labels['composeto'] = 'نوشتن نامه به';
+$labels['contactsfromto'] = 'تماس‌های $from تا $to از $count تا';
+$labels['print'] = 'چاپ';
+$labels['export'] = 'صدور';
+$labels['previouspage'] = 'نمایش دسته‌ی قبلی';
+$labels['firstpage'] = 'نمایش دسته‌ی اول';
+$labels['nextpage'] = 'نمایش دسته‌ی بعدی';
+$labels['lastpage'] = 'نمایش دسته‌ی آخر';
+$labels['groups'] = 'گروه‌ها';
+$labels['personaladrbook'] = 'نشانی‌های شخصی';
+$labels['settingsfor'] = 'تنظیمات';
+$labels['preferences'] = 'ترجیحات';
+$labels['userpreferences'] = 'ترجیحات کاربر';
+$labels['editpreferences'] = 'ویرایش ترجیحات کاربر';
+$labels['identities'] = 'شناسه‌ها';
+$labels['manageidentities'] = 'مدیریت شناسه‌ها برای این حساب';
+$labels['newidentity'] = 'شناسه جدید';
+$labels['newitem'] = 'مورد جدید';
+$labels['edititem'] = 'ویرایش مورد';
+$labels['setdefault'] = 'پیش‌فرض کن';
+$labels['language'] = 'زبان';
+$labels['timezone'] = 'محدوده‌ی زمانی';
+$labels['pagesize'] = 'سطر در صفحه';
+$labels['signature'] = 'امضا';
+$labels['dstactive'] = 'ساعت تابستانی';
+$labels['htmleditor'] = 'HTML ‌نوشتن پیغام‌های';
+$labels['htmlsignature'] = 'HTML امضای';
+$labels['previewpane'] = 'نمایش قاب پیش‌نمایش';
+$labels['autosavedraft'] = 'ذخیره‌ی خودکار پیش‌نویس';
+$labels['everynminutes'] = 'هر $n دقیقه';
+$labels['never'] = 'هرگز';
+$labels['folder'] = 'پوشه';
+$labels['folders'] = 'پوشه‌ها';
+$labels['foldername'] = 'نام پوشه';
+$labels['subscribed'] = 'مورد اشتراک';
+$labels['messagecount'] = 'پیغام‌ها';
+$labels['create'] = 'ایجاد';
+$labels['createfolder'] = 'ایجاد پوشه‌ی جدید';
+$labels['rename'] = 'تغییر نام';
+$labels['renamefolder'] = 'تغییر نام پوشه';
+$labels['deletefolder'] = 'حذف پوشه';
+$labels['managefolders'] = 'مدیریت پوشه‌ها';
+$labels['sortby'] = 'مرتب‌سازی بر اساس';
+$labels['sortasc'] = 'مرتب‌سازی صعودی';
+$labels['sortdesc'] = 'مرتب‌سازی نزولی';
+
+?>
\ No newline at end of file
index e885abbe283df1957acb3a5b309799510b15e943..2020b11254986723f6849e84dc4c2ef802d005b8 100644 (file)
@@ -5,15 +5,16 @@
  | language/fa/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2006, RoundQube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Translators:                                                          |
- |     Anoosh <anoosher2003@yahoo.com>                                   |\r
- |     Mohammad Ebrahim Mohammadi Panah <mebrahim@gmail.com>             |\r
+ | Author: Mohammad Ebrahim Mohammadi Panah <mebrahim@gmail.com>         |
+ |         Anoosh <anoosher2003@yahoo.com>                               |
  +-----------------------------------------------------------------------+
 
+ @version $Id$
+
 */
 
 $messages = array();
@@ -73,5 +74,9 @@ $messages['copyerror'] = 'رونوشت‌برداری از نشانی‌ها ن
 $messages['sourceisreadonly'] = 'این منبع نشانی فقط‌خواندنی است';
 $messages['errorsavingcontact'] = 'ذخیره‌ی نشانی تماس ناموفق بود';
 $messages['movingmessage'] = 'در حال انتقال پیغام ...';
+$messages['receiptsent'] = 'رسید خواندن با موفقیت ارسال شد';
+$messages['errorsendingreceipt'] = 'ناتوان از ارسال رسید';
+$messages['nodeletelastidentity'] = 'نمی‌توانید این هویت را حذف کنید، زیرا آخرین هویت شماست.';
+$messages['addsubfolderhint'] = 'پوشه به عنوان زیرپوشه ای ساخته خواهد شد که هم اکنون انتخاب شده است';
 
-?>
+?>
\ No newline at end of file
index 329c685598353bfdf7a01220bc5cdfd53984520d..4be2c8baf89e9e9280134890748bcba25217c459 100644 (file)
@@ -6,7 +6,7 @@
  | language/fi/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Veljo Velling <veve@utu.fi>                                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 612 2007-06-12 18:17:21Z thomasb $
+ @version $Id: labels.inc 1151 2008-02-28 19:56:47Z thomasb $
 
 */
 
@@ -75,7 +75,8 @@ $labels['writenewmessage'] = 'Kirjoita uusi viesti';
 $labels['replytomessage'] = 'Vastaa viestiin';
 $labels['replytoallmessage'] = 'Vastaa kaikille';
 $labels['forwardmessage'] = 'Välitä viesti';
-$labels['deletemessage'] = 'Siirrä viesti roskakoriin';
+$labels['deletemessage'] = 'Poista viesti';
+$labels['movemessagetotrash'] = 'Siirrä viesti roskakoriin';
 $labels['printmessage'] = 'Tulosta viesti';
 $labels['previousmessage'] = 'Näytä edellinen viesti';
 $labels['previousmessages'] = 'Näytä edelliset viestit';
@@ -87,6 +88,9 @@ $labels['lastmessage'] = 'Näytä viimeinen viesti';
 $labels['lastmessages'] = 'Näytä viimeinen viestiluettelo';
 $labels['backtolist'] = 'Takaisin viesteihin';
 $labels['viewsource'] = 'Näytä lähdekoodi';
+$labels['markmessages'] = 'Merkitse viestit';
+$labels['markread'] = 'luetuiksi';
+$labels['markunread'] = 'ei-luetuiksi';
 $labels['select'] = 'Valitse';
 $labels['all'] = 'Kaikki';
 $labels['none'] = 'Ei mitään';
@@ -100,8 +104,8 @@ $labels['unlimited'] = 'rajoittamaton';
 $labels['quicksearch'] = 'Pikahaku';
 $labels['resetsearch'] = 'Nollaa haku';
 $labels['compose'] = 'Viestin kirjoitus';
-$labels['sendmessage'] = 'Lähetä viesti';
 $labels['savemessage'] = 'Tallenna tämä luonnos';
+$labels['sendmessage'] = 'Lähetä viesti';
 $labels['addattachment'] = 'Liitetiedosto';
 $labels['charset'] = 'Merkistö';
 $labels['editortype'] = 'Editorin tyyppi';
@@ -121,6 +125,13 @@ $labels['nosubject'] = '(ei otsikkoa)';
 $labels['showimages'] = 'Näytä kuvat';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Tavallinen teksti';
+$labels['addcc'] = 'Lisää kopio';
+$labels['addbcc'] = 'Lisää piilokopio';
+$labels['addreplyto'] = 'Lisää vastausosoite';
+$labels['mdnrequest'] = 'Viestin lähettäjä on pyytänyt kuittauksen siitä että olet lukenut viestin. Haluatko lähettää kuittauksen?';
+$labels['receiptread'] = 'Lukukuittaus';
+$labels['yourmessage'] = 'Tämä viesti on kuittaus lähettämällesi viestille';
+$labels['receiptnote'] = 'Huom! Kuittaus kertoo vain siitä, että viesti on avattu vastaanottajan tietokoneella. Se ei tarkoita että vastaanottaja on myös lukenut tai ymmärtänyt viestin.';
 $labels['name'] = 'Näkyvä nimi';
 $labels['firstname'] = 'Etunimi';
 $labels['surname'] = 'Sukunimi';
@@ -168,6 +179,7 @@ $labels['folder'] = 'Kansio';
 $labels['folders'] = 'Kansiot';
 $labels['foldername'] = 'Kansion nimi';
 $labels['subscribed'] = 'Näytetään';
+$labels['messagecount'] = 'Viestejä';
 $labels['create'] = 'Luo uusi';
 $labels['createfolder'] = 'Luo uusi kansio';
 $labels['rename'] = 'Nimeä uudelleen';
index b314248bbfab13b72b8afb2c0961de67ad5f236e..e4e1a595d9d331a9cbc0b3feb4b57b15c20dfa50 100644 (file)
@@ -6,7 +6,7 @@
  | language/fi/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Veljo Velling <veve@utu.fi>                                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 612 2007-06-12 18:17:21Z thomasb $
+ @version $Id: messages.inc 1151 2008-02-28 19:56:47Z thomasb $
 
 */
 
@@ -55,7 +55,7 @@ $messages['nopagesizewarning'] = 'Anna sivukoko';
 $messages['norecipientwarning'] = 'Anna ainakin yksi vastaanottaja';
 $messages['nosubjectwarning'] = '"Otsikko" -kenttä on tyhjä. Haluaisitko kirjoittaa viestillesi otsikon?';
 $messages['nobodywarning'] = 'Lähetetäänkö viesti ilman tekstiä?';
-$messages['notsentwarning'] = 'Viestiä ei lähetetty. Haluatko poistaa viestin?';
+$messages['notsentwarning'] = 'Viestiä ei lähethttp://translator.roundcube.net/index.phpetty. Haluatko poistaa viestin?';
 $messages['noldapserver'] = 'Valitse LDAP -palvelin';
 $messages['nocontactsreturned'] = 'Yhtään kontaktia ei löytynyt';
 $messages['nosearchname'] = 'Anna kontaktin nimi tai sähköpostiosoite';
@@ -74,5 +74,10 @@ $messages['copysuccess'] = 'Kopioitu $nr osoitetta onnistuneesti';
 $messages['copyerror'] = 'Yhtään osoitetta ei voitu kopioida';
 $messages['sourceisreadonly'] = 'Tämän osoitteen lähde on kirjoitussuojattu';
 $messages['errorsavingcontact'] = 'Yhteystietoa ei voitu tallentaa';
+$messages['movingmessage'] = 'Siirretään viestiä...';
+$messages['receiptsent'] = 'Lukukuittaus lähetetty onnistuneesti';
+$messages['errorsendingreceipt'] = 'Lukukuittausta ei voitu lähettää';
+$messages['nodeletelastidentity'] = 'Et voi poistaa tätä identiteettiä, koska se on ainoa jäljelläoleva';
+$messages['addsubfolderhint'] = 'Uusi kansio luodaan valitun kansion alikansiona';
 
 ?>
\ No newline at end of file
index 2693ea9e49249ce759b6dcda2f3f24e594ab5d89..e35d6bd7900fef61de30610db0488433ce22aa4c 100644 (file)
@@ -6,7 +6,7 @@
  | language/fr/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -77,6 +77,7 @@ $labels['replytomessage'] = 'Répondre au message';
 $labels['replytoallmessage'] = 'Répondre à tous';
 $labels['forwardmessage'] = 'Transmettre le message';
 $labels['deletemessage'] = 'Déplacer le message dans la corbeille';
+$labels['movemessagetotrash'] = 'Déplacer le message dans la corbeille';
 $labels['printmessage'] = 'Imprimer ce message';
 $labels['previousmessage'] = 'Voir le message précédent';
 $labels['previousmessages'] = 'Voir les messages précédents';
@@ -88,6 +89,9 @@ $labels['lastmessage'] = 'Voir le dernier message';
 $labels['lastmessages'] = 'Voir la dernière page de messages';
 $labels['backtolist'] = 'Retourner à la liste des messages';
 $labels['viewsource'] = 'Voir le source';
+$labels['markmessages'] = 'Marquer les messages';
+$labels['markread'] = 'Comme lus';
+$labels['markunread'] = 'Comme non lus';
 $labels['select'] = 'Sélectionner';
 $labels['all'] = 'Tous';
 $labels['none'] = 'Aucun';
@@ -101,8 +105,8 @@ $labels['unlimited'] = 'illimitée';
 $labels['quicksearch'] = 'Recherche rapide';
 $labels['resetsearch'] = 'Réinitialiser la recherche';
 $labels['compose'] = 'Composer un nouveau message';
-$labels['sendmessage'] = 'Envoyer le message maintenant';
 $labels['savemessage'] = 'Sauvegarder ce brouillon';
+$labels['sendmessage'] = 'Envoyer le message maintenant';
 $labels['addattachment'] = 'Joindre un fichier';
 $labels['charset'] = 'Encodage';
 $labels['editortype'] = 'Type d\'éditeur';
@@ -122,6 +126,13 @@ $labels['nosubject'] = '(pas de sujet)';
 $labels['showimages'] = 'Afficher les images';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'texte brut';
+$labels['addcc'] = 'Ajouter Cc';
+$labels['addbcc'] = 'Ajouter Cci';
+$labels['addreplyto'] = 'Ajouter Répondre à';
+$labels['mdnrequest'] = 'L\'expéditeur de ce message a demandé d\'être prévenu quand vous lirez ce message. Souhaitez-vous prévenir l\'expéditeur ?';
+$labels['receiptread'] = 'Accusé de réception (lire)';
+$labels['yourmessage'] = 'Ceci est un accusé de réception pour votre message';
+$labels['receiptnote'] = 'Note : Cet accusé de réception indique seulement que le message a été affiché sur l\'ordinateur du destinataire. Il n\'y a aucune garantie que le destinataire a lu ou compris le contenu du message.';
 $labels['name'] = 'Nom à afficher';
 $labels['firstname'] = 'Prénom';
 $labels['surname'] = 'Nom';
@@ -143,7 +154,7 @@ $labels['firstpage'] = 'Voir la première page';
 $labels['nextpage'] = 'Montrer page suivante';
 $labels['lastpage'] = 'Voir la dernière page';
 $labels['groups'] = 'Groupes';
-$labels['personaladrbook'] = 'Adresses personnelle';
+$labels['personaladrbook'] = 'Adresses personnelles';
 $labels['settingsfor'] = 'Paramètres pour';
 $labels['preferences'] = 'Préférences';
 $labels['userpreferences'] = 'Préférences utilisateur';
@@ -169,6 +180,7 @@ $labels['folder'] = 'Dossier';
 $labels['folders'] = 'Dossiers';
 $labels['foldername'] = 'Nom du dossier';
 $labels['subscribed'] = 'Abonné';
+$labels['messagecount'] = 'Messages';
 $labels['create'] = 'Créer';
 $labels['createfolder'] = 'Créer un nouveau dossier';
 $labels['rename'] = 'Renommer';
@@ -179,4 +191,4 @@ $labels['sortby'] = 'Trier par';
 $labels['sortasc'] = 'Tri ascendant';
 $labels['sortdesc'] = 'Tri descendant';
 
-?>
\ No newline at end of file
+?>
index 4e3985bbfd545d9da6ba2aca2b83b457d45ffe99..fcd59fcfc87e7aed6216f556b2ee0d8fac5be551 100644 (file)
@@ -6,7 +6,7 @@
  | language/fr/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -75,5 +75,10 @@ $messages['copysuccess'] = 'Succès de la copie des $nr adresses';
 $messages['copyerror'] = 'Ne peut pas copier les adresses';
 $messages['sourceisreadonly'] = 'Cette source d\'adresse est en lecture seule';
 $messages['errorsavingcontact'] = 'Ne peut pas enregistrer l\'adresse du contact';
+$messages['movingmessage'] = 'Déplacement du message...';
+$messages['receiptsent'] = 'L\'accusé de réception a bien été envoyé';
+$messages['errorsendingreceipt'] = 'L\'accusé de réception n\'a pas pu être envoyé';
+$messages['nodeletelastidentity'] = 'Vous ne pouvez pas effacer votre seule identité.';
+$messages['addsubfolderhint'] = 'Ce dossier sera créé comme sous-dossier de celui sélectionné.';
 
 ?>
\ No newline at end of file
index 96b0d94a6263e305aad8975ab6a47a82832ea7b4..557912e3a643ed9f7ec49b34ee05ec02323538c1 100755 (executable)
@@ -5,13 +5,15 @@
  | language/ga/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author:   Noel Bourke  (cros13)                                       |
  +-----------------------------------------------------------------------+
 
+ @version $Id$
+
 */
 
 $labels = array();
index cd118be41258dc199cb2739351b7641739a2c338..cca590c0f6acb04e39ef663950a8904fa4c62687 100755 (executable)
@@ -5,13 +5,15 @@
  | language/ga/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author:   Noel Bourke  (cros13)                                       |
  +-----------------------------------------------------------------------+
 
+ @version $Id$
+
 */
 
 $messages = array();
diff --git a/program/localization/ge/labels.inc b/program/localization/ge/labels.inc
new file mode 100755 (executable)
index 0000000..75ccc1d
--- /dev/null
@@ -0,0 +1,237 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ge/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Zaza Zviadadze <zviadadze@gmail.com>                          |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 842 2007-10-20 13:55:02Z  zaza$
+
+*/
+
+$labels = array();
+
+// login page
+$labels['welcome']   = 'მოგესალმებათ $product';
+$labels['username']  = 'მომხმარებელი';
+$labels['password']  = 'პაროლი';
+$labels['server']    = 'სერვერი';
+$labels['login']     = 'შესვლა';
+
+// taskbar
+$labels['logout']   = 'გამოსვლა';
+$labels['mail']     = 'ელ–ფოსტა';
+$labels['settings'] = 'პარამეტრები';
+$labels['addressbook'] = 'მისამართები';
+
+// mailbox names
+$labels['inbox']  = 'მიღებული';
+$labels['drafts'] = 'დროებითი';
+$labels['sent']   = 'გაგზავნილები';
+$labels['trash']  = 'წაშლილები';
+$labels['junk']   = 'სპამი';
+
+// message listing
+$labels['subject'] = 'სათაური';
+$labels['from']    = 'გამგზავნი';
+$labels['to']      = 'მიმღები';
+$labels['cc']      = 'კოპია';
+$labels['bcc']     = 'ფარული';
+$labels['replyto'] = 'დაბრუნება';
+$labels['date']    = 'თარიღი';
+$labels['size']    = 'ზომა';
+$labels['priority'] = 'პრიორიტეტი';
+$labels['organization'] = 'ორგანიზაცია';
+
+// aliases
+$labels['reply-to'] = $labels['replyto'];
+
+$labels['mailboxlist'] = 'საქაღალდეები';
+$labels['messagesfromto'] = 'შეტყობინება $from  $to დან $count';
+$labels['messagenrof'] = 'შეტყობინება $nr დან $count';
+
+$labels['moveto']   = 'გადატანა...';
+$labels['download'] = 'გადმოწერა';
+
+$labels['filename'] = 'ფაილის სახელი';
+$labels['filesize'] = 'ფაილის ზომა';
+
+$labels['preferhtml'] = 'როგორც HTML';
+$labels['htmlmessage'] = 'HTML შეტყობინება';
+$labels['prettydate'] = 'კარგი თარიღები';
+
+$labels['addtoaddressbook'] = 'მისამართებში დამატება';
+
+// weekdays short
+$labels['sun'] = 'კვ';
+$labels['mon'] = 'ორ';
+$labels['tue'] = 'სამ';
+$labels['wed'] = 'ოთხ';
+$labels['thu'] = 'ხუთ';
+$labels['fri'] = 'პარ';
+$labels['sat'] = 'შაბ';
+
+// weekdays long
+$labels['sunday']    = 'კვირა';
+$labels['monday']    = 'ორშაბათი';
+$labels['tuesday']   = 'სამშაბათი';
+$labels['wednesday'] = 'ოთხშაბათი';
+$labels['thursday']  = 'ხუთშაბათი';
+$labels['friday']    = 'პარასკევი';
+$labels['saturday']  = 'შაბათი';
+
+$labels['today'] = 'დღეს';
+
+// toolbar buttons
+$labels['checkmail']        = 'შემოწმება ახალ შეტყობინებაზე';
+$labels['writenewmessage']  = 'ახალი შეტყობინება';
+$labels['replytomessage']   = 'პასუხი';
+$labels['replytoallmessage'] = 'პასუხი ყველას';
+$labels['forwardmessage']   = 'გადაგზავნა';
+$labels['deletemessage']    = 'წაშლა';
+$labels['movemessagetotrash'] = 'შეტყობინების წაშლილებში გადატანა';
+$labels['printmessage']     = 'შეტყობინების ამობეჭვდა';
+$labels['previousmessage']  = 'წინა შეტყობინების ნახვა';
+$labels['previousmessages'] = 'წინა შეტყობინებების ნახვა';
+$labels['firstmessage']     = 'პირველი შეტყობინების ნახვა';
+$labels['firstmessages']    = 'პრველი შეტყობინებები';
+$labels['nextmessage']      = 'შემდეგი შეტყობინების ნახვა';
+$labels['nextmessages']     = 'შემდეგი შეტყობინებების ნახვა';
+$labels['lastmessage']      = 'ბოლო შეტყობინების ნახვა';
+$labels['lastmessages']     = 'ბოლო შეტყობინებების ნახვა';
+$labels['backtolist']       = 'უკან ჩამონათვალში';
+$labels['viewsource']       = 'შიგთავსი';
+
+$labels['select'] = 'მონიშვნა';
+$labels['all'] = 'ყველა';
+$labels['none'] = 'არცერთი';
+$labels['unread'] = 'წაუკითხავი';
+
+$labels['compact'] = 'შეკუმშვა';
+$labels['empty'] = 'გაცარიელება';
+$labels['purge'] = 'გასუფთავება';
+
+$labels['quota'] = 'შეზღუდვა';
+$labels['unknown']  = 'უცნობი';
+$labels['unlimited']  = 'შეუზღუდავი';
+
+$labels['quicksearch']  = 'სწრაფი ძიება';
+$labels['resetsearch']  = 'ძიების გასუფთავება';
+
+
+// message compose
+$labels['compose']        = 'შეტყობინების დაწერა';
+$labels['sendmessage']    = 'შეტყობინების გაგზავნა';
+$labels['savemessage']  = 'დროებით შენახვა';
+$labels['addattachment']  = 'ფაილის ატვირთვა';
+$labels['charset']        = 'კოდირება';
+$labels['editortype']     = 'რედაქტორი';
+$labels['returnreceipt']  = 'პასუხის მოთხოვნა';
+
+$labels['checkspelling'] = 'ორთოგრაფიული შემოწმება';
+$labels['resumeediting'] = 'რედაქტირების გაგრძელება';
+$labels['revertto']      = 'გაუქმება';
+
+$labels['attachments'] = 'გზავნილები';
+$labels['upload'] = 'ატვირთვა';
+$labels['close']  = 'დახურვა';
+
+$labels['low']     = 'დაბალი';
+$labels['lowest']  = 'უდაბლესი';
+$labels['normal']  = 'საშუალო';
+$labels['high']    = 'მაღალი';
+$labels['highest'] = 'უმაღლესი';
+
+$labels['nosubject']  = '(უსათაურო)';
+$labels['showimages'] = 'გამოსახულების ჩვენება';
+
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'ტექსტური';
+
+$labels['addcc'] = 'დაამატე კოპიო';
+$labels['addbcc'] = 'დაამატე ფარული კოპიო';
+$labels['addreplyto'] = 'დაამატე გამომგზავნი';
+
+
+// address boook
+$labels['name']      = 'სრული სახელი';
+$labels['firstname'] = 'სახელი';
+$labels['surname']   = 'გვარი';
+$labels['email']     = 'ელ–ფოსტა';
+
+$labels['addcontact'] = 'კონტაქტებში დამატება';
+$labels['editcontact'] = 'კონტაქტის რედაქტირება';
+
+$labels['edit']   = 'რედაქტირება';
+$labels['cancel'] = 'გაუქმება';
+$labels['save']   = 'შენახვა';
+$labels['delete'] = 'წაშლა';
+
+$labels['newcontact']     = 'კონტაქტის შექმნა';
+$labels['deletecontact']  = 'მონიშნელი კონტაქტის წაშლა';
+$labels['composeto']      = 'ფოსტის გაგზავნა შერჩეულ ადრესატებთან';
+$labels['contactsfromto'] = 'კონტაქტები $from დან $to ში $count';
+$labels['print']          = 'დაბეჭვდა';
+$labels['export']         = 'ექსპორტი';
+
+$labels['previouspage']   = 'წინას ჩვენება';
+$labels['firstpage']      = 'პირველის ჩვენება';
+$labels['nextpage']       = 'შემდეგის ჩვენება';
+$labels['lastpage']       = 'ბოლოს ჩვენება';
+
+$labels['groups'] = 'ჯგუფები';
+$labels['personaladrbook'] = 'პერსონალური მისამართები';
+
+
+// settings
+$labels['settingsfor']  = 'პარამეტრები';
+
+$labels['preferences']  = 'პარამეტრები';
+$labels['userpreferences']  = 'მომხმარებლის პარამეტრები';
+$labels['editpreferences']  = 'მომხმარებლის პარამეტრების რედაქტირება';
+
+$labels['identities']  = 'პროფილები';
+$labels['manageidentities']  = 'პროფილების მართვა';
+$labels['newidentity']  = 'ახალი პროფილი';
+
+$labels['newitem']  = 'ახალი';
+$labels['edititem']  = 'რედაქტირება';
+
+$labels['setdefault']  = 'როგორც ზოგაგად';
+$labels['language']  = 'ენა';
+$labels['timezone']  = 'დროითი ზონა';
+$labels['pagesize']  = 'სტრიქონი გვერდზე';
+$labels['signature'] = 'ხელმოწერა';
+$labels['dstactive']  = 'დროის გადაყვანა';
+$labels['htmleditor'] = 'შეტყობინების შექმნა HTML –ში';
+$labels['htmlsignature'] = 'HTML ხელმოწერა';
+$labels['previewpane'] = 'ჩვენება';
+
+$labels['autosavedraft']  = 'ავტომატური შენახვა';
+$labels['everynminutes']  = 'ყოველ $n წუთში';
+$labels['never']  = 'არასდროს';
+
+$labels['folder']  = 'საქაღალდე';
+$labels['folders']  = 'საქაღალდეები';
+$labels['foldername']  = 'საქაღალდის დასახელება';
+$labels['subscribed']  = 'გამოცერილია';
+$labels['create']  = 'შექმნა';
+$labels['createfolder']  = 'საქაღალდის შექმნა';
+$labels['rename'] = 'სახელის გადარქმევა';
+$labels['renamefolder'] = 'სახელის გადარქმევა საქაღალდისთვის';
+$labels['deletefolder']  = 'საქაღალდის წაშლა';
+$labels['managefolders']  = 'საქაღალდეების მართვა';
+
+$labels['sortby'] = 'დალაგება';
+$labels['sortasc']  = 'დალაგება ზრდადობით';
+$labels['sortdesc'] = 'დალაგება კლებადობით';
+
+?>
diff --git a/program/localization/ge/messages.inc b/program/localization/ge/messages.inc
new file mode 100755 (executable)
index 0000000..c455742
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/ge/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Zaza Zviadadze <zviadadze@gmail.com>                          |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 842 2007-10-20 13:55:02Z  zaza $
+
+*/
+
+$messages = array();
+$messages['loginfailed']  = 'შესვლა შეუძლებელია';
+$messages['cookiesdisabled'] = 'თქვენი ბროუზერი კუკიებს არ პასუხობს';
+$messages['sessionerror'] = 'თქვენი სესია არის მცდარი ან ვადაგასული';
+$messages['imaperror'] = 'IMAP სერვერთან დაკავშირება შეუძლებელია';
+$messages['nomessagesfound'] = 'არ არის ახალი შეტყობინება';
+$messages['loggedout'] = 'წარმატებით დაიხურა თქვენი სესია';
+$messages['mailboxempty'] = 'საფოსტო ყუთი ცარიელია';
+$messages['loading'] = 'იტვირთება...';
+$messages['loadingdata'] = 'მონაცემების ჩატვირთვა...';
+$messages['checkingmail'] = 'ახალი შეტყობინების ნახვა';
+$messages['sendingmessage'] = 'შეტყობინების გაგზავნა';
+$messages['messagesent'] = 'შეტყობინება გაიგზავნა წარმატებით';
+$messages['savingmessage'] = 'შეტყობინების შენახვა...';
+$messages['messagesaved'] = 'შეტყობინების დროებით შენახვა';
+$messages['successfullysaved'] = 'წარმატებით შეინახა';
+$messages['addedsuccessfully'] = 'კონტაქტი წარმატებით დაემატა მისამართებში';
+$messages['contactexists'] = 'კონტაქტი ამ მისამართზე უკვე არსებობს';
+$messages['blockedimages'] = 'უსაფრთხოების მიზნით სურათების ჩვენება შეზღუდულია';
+$messages['encryptedmessage'] = 'შეტყობინება დაშიფრულია და სამწუხაროდ ჩვენება შეუძლებელია';
+$messages['nocontactsfound'] = 'კონტაქტი ვერ მოიძებნა';
+$messages['contactnotfound'] = 'მოთხოვნილი კონტაქტი ვერ მოიძებნა';
+$messages['sendingfailed'] = 'შეტყობინება ვერ გაიგზავნა';
+$messages['errorsaving'] = 'შენახვის დროს მოხდა შეცდომა';
+$messages['errormoving'] = 'შეტყობინების გადატანა შეუძლებელია';
+$messages['errordeleting'] = 'შეტყობინების წაშლა შეუძლებელია';
+$messages['deletecontactconfirm']  = 'ნამდვილად გსურთ მონიშნული კონტაქტების წაშლა?';
+$messages['deletemessagesconfirm'] = 'ნამდვილად გსურთ მონიშნული შეტყობინებების წაშლა?';
+$messages['deletefolderconfirm']  = 'ნამდვილად გსურთ ამ საქაღალდის წაშლა?';
+$messages['purgefolderconfirm']  = 'ნამდვილად გსურთ ყველა შეტყობინების წაშლა აღნიშნულ საქაღალდეში?';
+$messages['formincomplete'] = 'ყველა ველი არ არის შევსებული';
+$messages['noemailwarning'] = 'მიუთითეთ სწორი ელ–ფოსტის მისამართი';
+$messages['nonamewarning']  = 'მიუთითეთ სახელი';
+$messages['nopagesizewarning'] = 'მიუთითეთ ფურცლის ზომა';
+$messages['norecipientwarning'] = 'მიუთითეთ მიმღები';
+$messages['nosubjectwarning']  = 'გსურთ თუ არა შეტყობინების გაგზავნა უსათაუროდ?';
+$messages['nobodywarning'] = 'გსურთ თუ არა შეტყობინების გაგზავნა უტექსტოდ?';
+$messages['notsentwarning'] = 'შეტყობინება ვერ იქნა გაგზავნილი. გსურთ თუ არა გზავნილის გაუქმება?';
+$messages['noldapserver'] = 'მიუთითეთ LDAP სერვერი ძიებისთვის';
+$messages['nocontactsreturned'] = 'კონტაქტები ვერ მოძებნა';
+$messages['nosearchname'] = 'მიუთითეთ სახელი ან ელ–ფოსტის მისამართი';
+$messages['searchsuccessful'] = '$nr შეტყობინეა მოიძებნა';
+$messages['searchnomatch'] = 'შეტყობინება ვერ მოიძებნა';
+$messages['searching'] = 'ძიება...';
+$messages['checking'] = 'შემოწმება...';
+$messages['nospellerrors'] = 'ორთოგრაფიული შეცდომა არ არის';
+$messages['folderdeleted'] = 'საქაღალდე წარმატებით წაიშალა';
+$messages['deletedsuccessfully'] = 'წარმატებით წაიშალა';
+$messages['converting'] = 'შეტყობინების ფორმატირების გაუქმება...';
+$messages['messageopenerror'] = 'შეტყობინება ვერ ჩაიტვირთა სერვერიდან';
+$messages['fileuploaderror'] = 'ფაილი ვერ აიტვირთა';
+$messages['filesizeerror'] = 'ატვირთული ფაილის ზომა მეტია დასაშვებ ფაილის მაქსიმალურ ზომაზე ($size)';
+$messages['copysuccess'] = 'წარმატებით დაკოპირდა $nr მისამართი';
+$messages['copyerror'] = 'ვერცერთი მისამართი ვერ დაკოპირდა';
+$messages['sourceisreadonly'] = 'აღნიშნული მისამართის მხოლოდ წაკითხვაა შესაძლებელი';
+$messages['errorsavingcontact'] = 'საკონტაქტო მისამართის შენახვა შეუძლებელია';
+$messages['movingmessage'] = 'შეტყობინების გადატანა...';
+
+?>
index 33898ff41a6d711b5187aef0e84640d6e28eed34..4203d2540deb9021457e66949e1cea27b4ce8110 100644 (file)
@@ -5,11 +5,11 @@
  | language/gl/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2006, RoundQube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author:    David Garabana Barro <david_garabana-com>                  |
+ | Author:    David Garabana Barro <david garabana com>                  |
  +-----------------------------------------------------------------------+
 
 */
@@ -84,6 +84,9 @@ $labels['lastmessage'] = 'Amosar a última mensaxe';
 $labels['lastmessages'] = 'Amosar o último grupo de mensaxes';
 $labels['backtolist'] = 'Voltar á lista de mensaxes';
 $labels['viewsource'] = 'Ver fonte';
+$labels['markmessages'] = 'Marcar mensaxes';
+$labels['markread'] = 'Coma lidos';
+$labels['markunread'] = 'Coma non lidos';
 $labels['select'] = 'Seleccionar';
 $labels['all'] = 'Todas';
 $labels['none'] = 'Ningunha';
@@ -121,6 +124,10 @@ $labels['plaintoggle'] = 'Texto claro';
 $labels['addcc'] = 'Engadir Copia (CC)';
 $labels['addbcc'] = 'Engadir Copia Oculta (BCC)';
 $labels['addreplyto'] = 'Engadir Respostar a (Reply-To)';
+$labels['mdnrequest'] = 'O remitente desta mensaxe pediu ser notificado cando vostede lea esta mensaxe. Quere notificar ao remitente?';
+$labels['receiptread'] = 'Notificación da disposición da mensaxe (lectura)';
+$labels['yourmessage'] = 'Esta é unha notificación de disposición para a súa mensaxe';
+$labels['receiptnote'] = 'Nota: Esta notificación só confirma que a mensaxe se abriu no computador do destinatario. Non asegura que o destinatario o lera ou entendera o seu contido.';
 $labels['name'] = 'Nome completo';
 $labels['firstname'] = 'Nome';
 $labels['surname'] = 'Apelidos';
@@ -168,6 +175,7 @@ $labels['folder'] = 'Cartafol';
 $labels['folders'] = 'Cartafoles';
 $labels['foldername'] = 'Nome do cartafol';
 $labels['subscribed'] = 'Subscrito';
+$labels['messagecount'] = 'Mensaxes';
 $labels['create'] = 'Crear';
 $labels['createfolder'] = 'Crear novo cartafol';
 $labels['rename'] = 'Renomear';
index 05ff976ebe3a40eb96fbbc57799c321dbd18e3fc..2ba57d0d74562d0dbf67b85b2f8b909e59bdb413 100644 (file)
@@ -5,7 +5,7 @@
  | language/gl/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2006, RoundQube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -20,7 +20,7 @@ $messages['cookiesdisabled'] = 'O seu navegador non acepta galletas';
 $messages['sessionerror'] = 'A súa sesión non é válida ou expirou';
 $messages['imaperror'] = 'Fallou a conexión co servidor IMAP';
 $messages['nomessagesfound'] = 'Non se atoparon mensaxes nesta caixa de correo';
-$messages['loggedout'] = 'Rematou correctamente a súa sesión. ¡Ata logo!';
+$messages['loggedout'] = 'Rematou correctamente a súa sesión. Ata logo!';
 $messages['mailboxempty'] = 'A caixa de correo está vacía';
 $messages['loading'] = 'Cargando...';
 $messages['loadingdata'] = 'Cargando datos...';
@@ -33,25 +33,25 @@ $messages['successfullysaved'] = 'Gardada correctamente';
 $messages['addedsuccessfully'] = 'O contacto engadiuse correctamente ao caderno de enderezos';
 $messages['contactexists'] = 'Xa existe un contacto con este enderezo de correo electrónico';
 $messages['blockedimages'] = 'Estanse a bloquear as imaxes remotas para protexer a súa privacidade';
-$messages['encryptedmessage'] = '¡Síntoo!. Non se pode amosar a mensaxe porque está cifrada';
+$messages['encryptedmessage'] = 'Síntoo!. Non se pode amosar a mensaxe porque está cifrada';
 $messages['nocontactsfound'] = 'Non se atoparon contactos';
 $messages['contactnotfound'] = 'Non se atopou o contacto solicitado';
 $messages['sendingfailed'] = 'Fallou o envío da mensaxe';
 $messages['errorsaving'] = 'Ocurriu un erro mentres se gardaba';
 $messages['errormoving'] = 'Non puiden mover a mensaxe';
 $messages['errordeleting'] = 'Non puiden borrar a mensaxe';
-$messages['deletecontactconfirm'] = '¿Quere borrar o(s) contacto(s) seleccionados?';
-$messages['deletemessagesconfirm'] = '¿Quere borrar a(s) mensaxe(s) seleccionadas?';
-$messages['deletefolderconfirm'] = '¿Quere borrar este cartafol?';
-$messages['purgefolderconfirm'] = '¿Quere borrar tódalas mensaxes neste cartafol?';
+$messages['deletecontactconfirm'] = 'Quere borrar o(s) contacto(s) seleccionados?';
+$messages['deletemessagesconfirm'] = 'Quere borrar a(s) mensaxe(s) seleccionadas?';
+$messages['deletefolderconfirm'] = 'Quere borrar este cartafol?';
+$messages['purgefolderconfirm'] = 'Quere borrar tódalas mensaxes neste cartafol?';
 $messages['formincomplete'] = 'Non se cumprimentou completamente o formulario';
 $messages['noemailwarning'] = 'Por favor, introduza un enderezo de correo electrónico válida';
 $messages['nonamewarning'] = 'Por favor, introduza un nome';
 $messages['nopagesizewarning'] = 'Por favor, introduza un tamaño de páxina';
 $messages['norecipientwarning'] = 'Por favor, introduza polo menos un destinatario';
-$messages['nosubjectwarning'] = 'O campo "tema" está baleiro. ¿Quere introducir un?';
-$messages['nobodywarning'] = '¿Quere enviar esta mensaxe sen texto?';
-$messages['notsentwarning'] = 'A mensaxe non se enviou. ¿Quere descartala?';
+$messages['nosubjectwarning'] = 'O campo "tema" está baleiro. Quere introducir un?';
+$messages['nobodywarning'] = 'Quere enviar esta mensaxe sen texto?';
+$messages['notsentwarning'] = 'A mensaxe non se enviou. Quere descartala?';
 $messages['noldapserver'] = 'Por favor, elixa un servidor LDAP para buscar';
 $messages['nocontactsreturned'] = 'Non se atoparon contactos';
 $messages['nosearchname'] = 'Por favor, introduza un contacto ou un enderezo de correo electrónico';
@@ -71,5 +71,9 @@ $messages['copyerror'] = 'Non puiden copiar ningún enderezo';
 $messages['sourceisreadonly'] = 'A orixe é de só lectura';
 $messages['errorsavingcontact'] = 'Non puiden gardar o contacto';
 $messages['movingmessage'] = 'Movendo mensaxe...';
+$messages['receiptsent'] = 'A notificación de disposición enviouse correctamente';
+$messages['errorsendingreceipt'] = 'Non se puido enviar a notificación';
+$messages['nodeletelastidentity'] = 'Non pode borrar esta identidade, é a última';
+$messages['addsubfolderhint'] = 'Este cartafol vaise crear coma un subcartafol do seleccionado';
 
-?>
\ No newline at end of file
+?>
diff --git a/program/localization/he/labels.inc b/program/localization/he/labels.inc
new file mode 100644 (file)
index 0000000..b51a586
--- /dev/null
@@ -0,0 +1,188 @@
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | language/he/labels.inc                                                |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Moshe Leibovitch  <moish@mln.co.il>                           |\r
+ +-----------------------------------------------------------------------+\r
+*/\r
+\r
+$labels = array();\r
+$labels['welcome'] = 'ברוך בואך אל  $product';\r
+$labels['username'] = 'שם';\r
+$labels['password'] = 'סיסמה';\r
+$labels['server'] = 'שרת';\r
+$labels['login'] = 'כניסה';\r
+$labels['logout'] = 'יציאה';\r
+$labels['mail'] = 'תיבת דואר';\r
+$labels['settings'] = 'הגדרות אישיות';\r
+$labels['addressbook'] = 'פנקס כתובות';\r
+$labels['inbox'] = 'נכנס';\r
+$labels['drafts'] = 'טיוטות';\r
+$labels['sent'] = 'נשלח';\r
+$labels['trash'] = 'אשפה';\r
+$labels['junk'] = 'זבל';\r
+$labels['subject'] = 'נושא';\r
+$labels['from'] = 'מאת';\r
+$labels['to'] = 'אל';\r
+$labels['cc'] = 'לידיעה';\r
+$labels['bcc'] = 'מכותב מוסתר';\r
+$labels['replyto'] = 'מענה לשולח';\r
+$labels['date'] = 'תאריך';\r
+$labels['size'] = 'גודל';\r
+$labels['priority'] = 'עדיפות';\r
+$labels['organization'] = 'ארגון';\r
+$labels['reply-to'] = 'מענה לשולח';\r
+$labels['mailboxlist'] = 'תיקים';\r
+$labels['messagesfromto'] = 'הודעות  $from  עד  $to  מתוך  $count';\r
+$labels['messagenrof'] = 'הודעה  $nr  מתוך  $count';\r
+$labels['moveto'] = 'תיוק ב..';\r
+$labels['download'] = 'הורדה';\r
+$labels['filename'] = 'שם קובץ';\r
+$labels['filesize'] = 'גודל קובץ';\r
+$labels['preferhtml'] = 'הצגת  HTML';\r
+$labels['htmlmessage'] = 'תוכן  HTML';\r
+$labels['prettydate'] = 'תאריכים מעוצבים';\r
+$labels['addtoaddressbook'] = 'הוספה לפנקס כתובות';\r
+$labels['sun'] = 'יום א';\r
+$labels['mon'] = 'יום ב';\r
+$labels['tue'] = 'יום ג';\r
+$labels['wed'] = 'יום ד';\r
+$labels['thu'] = 'יום ה';\r
+$labels['fri'] = 'יום ו';\r
+$labels['sat'] = 'יום ש';\r
+$labels['sunday'] = 'ראשון';\r
+$labels['monday'] = 'שני';\r
+$labels['tuesday'] = 'שלישי';\r
+$labels['wednesday'] = 'רביעי';\r
+$labels['thursday'] = 'חמישי';\r
+$labels['friday'] = 'ששי';\r
+$labels['saturday'] = 'שבת';\r
+$labels['today'] = 'היום';\r
+$labels['checkmail'] = 'בדיקת תיבה';\r
+$labels['writenewmessage'] = 'מכתב חדש';\r
+$labels['replytomessage'] = 'מענה למכתב';\r
+$labels['replytoallmessage'] = 'מענה לשולח ולכל הנמענים';\r
+$labels['forwardmessage'] = 'העברת מכתב';\r
+$labels['deletemessage'] = 'מחיקה';\r
+$labels['movemessagetotrash'] = 'השלכה לאשפה';\r
+$labels['printmessage'] = 'הדפסה';\r
+$labels['previousmessage'] = 'הצגת מכתב קודם';\r
+$labels['previousmessages'] = 'הצגת רשימה קודמת';\r
+$labels['firstmessage'] = 'הצגת המכתב הראשון';\r
+$labels['firstmessages'] = 'הצגה של קבוצת המכתבים הראשונה';\r
+$labels['nextmessage'] = 'הצגת המכתב הבא';\r
+$labels['nextmessages'] = 'הצגה של קבוצת המכתבים הבאה';\r
+$labels['lastmessage'] = 'הצגת המכתב האחרון';\r
+$labels['lastmessages'] = 'הצגה של קבוצת המכתבים האחרונה';\r
+$labels['backtolist'] = 'חזרה אל רשימת המכתבים';\r
+$labels['viewsource'] = 'הצגת קוד מקור';\r
+$labels['markmessages'] = 'סימון הודעות';\r
+$labels['markread'] = 'כנקראו';\r
+$labels['markunread'] = 'כלא נקראו';\r
+$labels['select'] = 'בחירה';\r
+$labels['all'] = 'הכל';\r
+$labels['none'] = 'כלום';\r
+$labels['unread'] = 'לא נקראו';\r
+$labels['compact'] = 'פינוי שטח לא מנוצל';\r
+$labels['empty'] = 'ריקון';\r
+$labels['purge'] = 'מחיקה';\r
+$labels['quota'] = 'ניצול קיבולת';\r
+$labels['unknown'] = 'לא ידוע';\r
+$labels['unlimited'] = 'ללא הגבלה';\r
+$labels['quicksearch'] = 'חיפוש מהיר';\r
+$labels['resetsearch'] = 'ניקוי תיבת החיפוש';\r
+$labels['compose'] = 'מכתב חדש';\r
+$labels['savemessage'] = 'שמירת טיוטה';\r
+$labels['sendmessage'] = 'משלוח מיידי';\r
+$labels['addattachment'] = 'צירוף קובץ';\r
+$labels['charset'] = 'קידוד';\r
+$labels['editortype'] = 'סוג עורך';\r
+$labels['returnreceipt'] = 'אישור קבלה';\r
+$labels['checkspelling'] = 'בדיקת איות';\r
+$labels['resumeediting'] = 'המשך עריכה';\r
+$labels['revertto'] = 'חזור למצב קודם';\r
+$labels['attachments'] = 'קבצים מצורפים';\r
+$labels['upload'] = 'העלאה';\r
+$labels['close'] = 'סגירה';\r
+$labels['low'] = 'נמוך';\r
+$labels['lowest'] = 'נמוך ביותר';\r
+$labels['normal'] = 'רגיל';\r
+$labels['high'] = 'גבוה';\r
+$labels['highest'] = 'גבוה ביותר';\r
+$labels['nosubject'] = '(ללא נושא)';\r
+$labels['showimages'] = 'הצגת תמונות';\r
+$labels['htmltoggle'] = 'HTML';\r
+$labels['plaintoggle'] = 'ללא עיצוב';\r
+$labels['addcc'] = 'הוספת מכותב לידיעה';\r
+$labels['addbcc'] = 'הוספת מכותב נסתר';\r
+$labels['addreplyto'] = 'הוספת כתובת למענה';\r
+$labels['mdnrequest'] = 'השולח ביקש לדעת אם המכתב נקרא. האם להודיע לשולח?';\r
+$labels['receiptread'] = '(אישור קבלה (נקרא';\r
+$labels['yourmessage'] = 'זה אישור קבלה למכתבך';\r
+$labels['receiptnote'] = 'זה אישור על כך שהמכתב הוצג אבל אינו מבטיח שהתוכן נקרא או הובן';\r
+$labels['name'] = 'שם להצגה';\r
+$labels['firstname'] = 'שם פרטי';\r
+$labels['surname'] = 'שם משפחה';\r
+$labels['email'] = 'כתובת דוא"ל';\r
+$labels['addcontact'] = 'הוספת איש קשר';\r
+$labels['editcontact'] = 'עריכת איש קשר';\r
+$labels['edit'] = 'עריכה';\r
+$labels['cancel'] = 'ביטול';\r
+$labels['save'] = 'שמירה';\r
+$labels['delete'] = 'מחיקה';\r
+$labels['newcontact'] = 'איש קשר חדש';\r
+$labels['deletecontact'] = 'מחיקת אנשי קשר מסומנים';\r
+$labels['composeto'] = 'משלוח מכתב אל';\r
+$labels['contactsfromto'] = 'אנשי קשר  $from  עד  $to  מתוך  $count';\r
+$labels['print'] = 'הדפסה';\r
+$labels['export'] = 'ייצוא';\r
+$labels['previouspage'] = 'הצגת הקבוצה הקודמת';\r
+$labels['firstpage'] = 'הצגת הקבוצה הראשונה';\r
+$labels['nextpage'] = 'הצגת הקבוצה הבאה';\r
+$labels['lastpage'] = 'הצגת הקבוצה האחרונה';\r
+$labels['groups'] = 'קבוצות';\r
+$labels['personaladrbook'] = 'כתובות פרטיות';\r
+$labels['settingsfor'] = 'הגדרות עבור';\r
+$labels['preferences'] = 'העדפות';\r
+$labels['userpreferences'] = 'העדפות משתמש';\r
+$labels['editpreferences'] = 'עריכה של העדפות משתמש';\r
+$labels['identities'] = 'זהויות';\r
+$labels['manageidentities'] = 'ניהול זהויות לחשבון זה';\r
+$labels['newidentity'] = 'זהות חדשה';\r
+$labels['newitem'] = 'פריט חדש';\r
+$labels['edititem'] = 'עריכת פריט';\r
+$labels['setdefault'] = 'קביעה של ברירת מחדל';\r
+$labels['language'] = 'שפה';\r
+$labels['timezone'] = 'איזור זמן';\r
+$labels['pagesize'] = 'מספר שורות בדף';\r
+$labels['signature'] = 'חתימה';\r
+$labels['dstactive'] = 'שעון קיץ';\r
+$labels['htmleditor'] = 'יצירת הודעה מעוצבת';\r
+$labels['htmlsignature'] = 'חתימה מעוצבת';\r
+$labels['previewpane'] = 'הצג הצצה מוקדמת';\r
+$labels['autosavedraft'] = 'שמירה אוטומטית של טיוטה';\r
+$labels['everynminutes'] = 'כל  $n  דקות';\r
+$labels['never'] = 'אף פעם';\r
+$labels['folder'] = 'תיק';\r
+$labels['folders'] = 'תיקים';\r
+$labels['foldername'] = 'שם תיק';\r
+$labels['subscribed'] = 'מנוי';\r
+$labels['messagecount'] = 'הודעות';\r
+$labels['create'] = 'יצירה';\r
+$labels['createfolder'] = 'יצירת תיק חדש';\r
+$labels['rename'] = 'שינוי שם';\r
+$labels['renamefolder'] = 'שינוי שם תיק';\r
+$labels['deletefolder'] = 'מחיקת תיק';\r
+$labels['managefolders'] = 'ניהול תיקים';\r
+$labels['sortby'] = 'מיון לפי';\r
+$labels['sortasc'] = 'מיון בסדר עולה';\r
+$labels['sortdesc'] = 'מיון בסדר יורד';\r
+\r
+?>
\ No newline at end of file
diff --git a/program/localization/he/messages.inc b/program/localization/he/messages.inc
new file mode 100644 (file)
index 0000000..b25ffdc
--- /dev/null
@@ -0,0 +1,79 @@
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | language/he/messages.inc                                              |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Moshe Leibovitch    <moish@mln.co.il>                         |\r
+ +-----------------------------------------------------------------------+\r
+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed'] = 'הכניסה נכשלה';\r
+$messages['cookiesdisabled'] = 'הדפדפן אינו מקבל עוגיות';\r
+$messages['sessionerror'] = 'הקשר שלך אינו חוקי או שפג תוקפו';\r
+$messages['imaperror'] = 'הקשר לשרת נכשל';\r
+$messages['nomessagesfound'] = 'לא נמצאו מכתבים בתיבה זו';\r
+$messages['loggedout'] = 'הקשר הסתיים. להתראות!';\r
+$messages['mailboxempty'] = 'התיבה ריקה';\r
+$messages['loading'] = 'טעינה...';\r
+$messages['loadingdata'] = 'טעינת מידע..';\r
+$messages['checkingmail'] = 'בדיקת קיום מכתבים חדשים...';\r
+$messages['sendingmessage'] = 'משלוח מכתבים';\r
+$messages['messagesent'] = 'מכתב נשלח בהצלחה';\r
+$messages['savingmessage'] = 'שמירת מכתב...';\r
+$messages['messagesaved'] = 'המכתב נשמר כטיוטה';\r
+$messages['successfullysaved'] = 'נשמר בהצלחה';\r
+$messages['addedsuccessfully'] = 'איש הקשר נוסף לפנקס בהצלחה';\r
+$messages['contactexists'] = 'קיים כבר איש קשר עם כתובת דוא"ל זו';\r
+$messages['blockedimages'] = 'תמונות משרת אחר נחסמו כדי לשמור על הפרטיות';\r
+$messages['encryptedmessage'] = 'זו הודעת מוצפנת ולכן לא ניתן להציגה';\r
+$messages['nocontactsfound'] = 'לא נמצאו אנשי קשר';\r
+$messages['contactnotfound'] = 'איש הקשר המבוקש לא נמצא';\r
+$messages['sendingfailed'] = 'שליחת המכתב נכשלה';\r
+$messages['errorsaving'] = 'נגרמה שגיאה במהלך השמירה';\r
+$messages['errormoving'] = 'לא ניתן לתייק את המכתב';\r
+$messages['errordeleting'] = 'לא ניתן למחוק את המכתב';\r
+$messages['deletecontactconfirm'] = 'האם למחוק את איש הקשר?';\r
+$messages['deletemessagesconfirm'] = 'האם למחוק את המכתבים נמסומנים?';\r
+$messages['deletefolderconfirm'] = 'האם למחוק תיק זה?';\r
+$messages['purgefolderconfirm'] = 'האם למחוק את כל ההודעות בתיק זה?';\r
+$messages['formincomplete'] = 'לא הושלמו כל הפרטים בטופס זה';\r
+$messages['noemailwarning'] = 'נא להוסיף כתובת דוא"ל חוקית';\r
+$messages['nonamewarning'] = 'נא להוסיף שם';\r
+$messages['nopagesizewarning'] = 'נא להוסיף גודל דף';\r
+$messages['norecipientwarning'] = 'נא להוסיף לפחות נמען אחד';\r
+$messages['nosubjectwarning'] = 'שורת הנושא ריקה. האם ברצונך להוסיף נושא כעת?';\r
+$messages['nobodywarning'] = 'האם לשלוח מכתב ללא תוכן?';\r
+$messages['notsentwarning'] = 'המכתב לא נשלח. האם לבטלו?';\r
+$messages['noldapserver'] = 'נא לבחור שרת כתובות לחיפוש';\r
+$messages['nocontactsreturned'] = 'לא נמצאו אנשי קשר';\r
+$messages['nosearchname'] = 'נא להוסיף איש קשר או כתובת דוא"ל';\r
+$messages['searchsuccessful'] = 'נמצאו  $nr  מכתבים';\r
+$messages['searchnomatch'] = 'החיפוש לא מצא דבר';\r
+$messages['searching'] = 'חיפוש...';\r
+$messages['checking'] = 'בדיקה...';\r
+$messages['nospellerrors'] = 'לא נמצאו שגיאות כתיב';\r
+$messages['folderdeleted'] = 'התיק נמחק בהצלחה';\r
+$messages['deletedsuccessfully'] = 'המחיקה הסתימה בהצלחה';\r
+$messages['converting'] = 'הסרת העיצוב מהמכתב';\r
+$messages['messageopenerror'] = 'לא ניתן לטעון המכתב מהשרת';\r
+$messages['fileuploaderror'] = 'העלאת הקובץ נכשלה';\r
+$messages['filesizeerror'] = 'הקובץ לטעינה גדול מהגודל המקסימלי שהוא  $size';\r
+$messages['copysuccess'] = '$nr  כתובות הועתקו בהצלחה';\r
+$messages['copyerror'] = 'לא ניתן היה להעתיק כתובת כלשהי';\r
+$messages['sourceisreadonly'] = 'המקור לכתובת הוא לקריאה בלבד';\r
+$messages['errorsavingcontact'] = 'לא ניתן לשמור את כתובת איש הקשר';\r
+$messages['movingmessage'] = 'תיוק המכתב..';\r
+$messages['receiptsent'] = 'אישור הקבלה נשלח בהצלחה';\r
+$messages['errorsendingreceipt'] = 'לא ניתן לשלוח אישור קבלה';\r
+$messages['nodeletelastidentity'] = 'זו הזהות האחרונה ולכן לא ניתן לבטלה';\r
+$messages['addsubfolderhint'] = 'תיקיה זו תוקם תחת התיקיה שנבחרה';\r
+\r
+?>
\ No newline at end of file
diff --git a/program/localization/hi/labels.inc b/program/localization/hi/labels.inc
new file mode 100644 (file)
index 0000000..d286659
--- /dev/null
@@ -0,0 +1,239 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | localization/hi/labels.inc                                            |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aniruddha "Karim" Shankar <karim@sarai.net>                   |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$labels = array();
+
+// login page
+$labels['welcome']   = '$product में स्वागत है';
+$labels['username']  = 'यूसरनाम';
+$labels['password']  = 'पासवर्ड';
+$labels['server']    = 'सर्वर';
+$labels['login']     = 'लॉगिन';
+
+// taskbar
+$labels['logout']   = 'लॉगआऊट';
+$labels['mail']     = 'ई-मेल';
+$labels['settings'] = 'निजी सैटिंग';
+$labels['addressbook'] = 'पता खाता';
+
+// mailbox names
+$labels['inbox']  = 'इनबॉक्स';
+$labels['drafts'] = 'ड्राफ़ट';
+$labels['sent']   = 'भेजा गया';
+$labels['trash']  = 'रद्दी';
+$labels['junk']   = 'स्पैम';
+
+// message listing
+$labels['subject'] = 'विशय';
+$labels['from']    = 'भेजने वाला';
+$labels['to']      = 'पाने वाला';
+$labels['cc']      = 'कार्बन';
+$labels['bcc']     = 'अंधा कार्बन';
+$labels['replyto'] = 'जवाब यहाँ';
+$labels['date']    = 'तारीख';
+$labels['size']    = 'माप';
+$labels['priority'] = 'मेल की महत्वपूर्णता';
+$labels['organization'] = 'संस्था';
+
+// aliases
+$labels['reply-to'] = $labels['replyto'];
+
+$labels['mailboxlist'] = 'फ़ोलडर';
+$labels['messagesfromto'] = '$from से ले कर $to, $count मेल में से';
+$labels['messagenrof'] = '$nr नम्बर मेल, $count में से';
+
+$labels['moveto']   = 'खीस्काऐं...';
+$labels['download'] = 'डाऊनलोड';
+
+$labels['filename'] = 'फ़ाईल नाम';
+$labels['filesize'] = 'फ़ाईल माप';
+
+$labels['preferhtml'] = 'ऐच-टी-ऐम-ऐल(HTML) दिखाऐं';
+$labels['htmlmessage'] = 'ऐच-टी-ऐम-ऐल (HTML) रूप मेल करें';
+$labels['prettydate'] = 'सुनदर तारीखें';
+
+$labels['addtoaddressbook'] = 'पता खाते में जोडें';
+
+// weekdays short
+$labels['sun'] = 'रवि';
+$labels['mon'] = 'सोम';
+$labels['tue'] = 'मंग';
+$labels['wed'] = 'बुध';
+$labels['thu'] = 'गुरु';
+$labels['fri'] = 'शुक्र';
+$labels['sat'] = 'शनि';
+
+// weekdays long
+$labels['sunday']    = 'रविवार';
+$labels['monday']    = 'सोमवार';
+$labels['tuesday']   = 'मंगलवार';
+$labels['wednesday'] = 'बुधवार';
+$labels['thursday']  = 'गुरुवार';
+$labels['friday']    = 'शुक्रवार';
+$labels['saturday']  = 'शनिवार';
+
+$labels['today'] = 'आज';
+
+// toolbar buttons
+$labels['checkmail']        = 'नये मेल लाऐं';
+$labels['writenewmessage']  = 'मेल लिखें';
+$labels['replytomessage']   = 'मेल का जवाब दें';
+$labels['replytoallmessage'] = 'सभी को जवाब लिखें';
+$labels['forwardmessage']   = 'आगे भेजें';
+$labels['deletemessage']    = 'रद्द करें';
+$labels['printmessage']     = 'मेल छापें';
+$labels['previousmessage']     = 'पीछे के मेल दिखाऐं';
+$labels['previousmessages']    = 'पीछे के मेल का बन्डल दिखाऐं';
+$labels['firstmessage']                = 'पहला मेल दिखाऐं';
+$labels['firstmessages']       = 'पहला मेल का बन्डल दिखाऐं';
+$labels['nextmessage']         = 'अगला मेल दिखाऐं';
+$labels['nextmessages']                = 'अगले मेल का बन्डल दिखाऐं';
+$labels['lastmessage']         = 'आखीरी मेल दिखाऐं';
+$labels['lastmessages']                = 'आखिरी मेल का बन्डल दिखाऐं';
+$labels['backtolist']          = 'मेल सूची देखें';
+$labels['viewsource']          = 'सोर्स दिखाऐं';
+
+$labels['select']              = 'चुनें';
+$labels['all']                 = 'सभी';
+$labels['none']                        = 'कोई नहीं';
+$labels['unread']              = 'अनदेखी';
+
+$labels['compact']             = 'छोटा करें';
+$labels['empty']               = 'मेल रद्दी में डालें';
+$labels['purge']               = 'मिटाऐं';
+
+$labels['quota']               = 'डिस्क उपयोग';
+$labels['unknown']             = 'अज्ञात';
+$labels['unlimited']           = 'असीम';
+
+$labels['quicksearch']         = 'तेज़ खोज';
+$labels['resetsearch']         = 'खोज खाली करें';
+
+
+// message compose
+$labels['compose']             = 'मेल लिखें';
+$labels['sendmessage']         = 'मेल भेजें';
+$labels['savemessage']         = 'ड्राफ़ट सहेजें';
+$labels['addattachment']       = 'फ़ाईल जोडें';
+$labels['charset']             = 'कैरेक्टर सैट';
+$labels['editortype']          = 'सम्पादक प्राकार';
+$labels['returnreceipt']       = 'मेल रसीद';
+
+$labels['checkspelling']       = 'स्पैलिंग जाँचें';
+$labels['resumeediting']       = 'सम्पादन फिर शुरू करें';
+$labels['revertto']            = 'पहले की स्थिती पर जाऐं';
+
+$labels['attachments']         = 'जुडे फाईल';
+$labels['upload']              = 'अपलोड';
+$labels['close']               = 'बंद';
+
+$labels['low']                 = 'कम';
+$labels['lowest']              = 'सबसे कम';
+$labels['normal']              = 'साधारण';
+$labels['high']                        = 'उच्च';
+$labels['highest']             = 'उच्चतम';
+
+$labels['nosubject']           = '(कोई विशय नहीं)';
+$labels['showimages']          = 'चित्र दिखाऐं';
+
+$labels['htmltoggle']          = 'ऐच-टी-ऐम-एल (HTML)';
+$labels['plaintoggle']         = 'सादा पाठ';
+
+
+// address boook
+$labels['name']                        = 'दिखने वाला नाम';
+$labels['firstname']           = 'पहला नाम';
+$labels['surname']             = 'उपनाम';
+$labels['email']               = 'मेल';
+
+$labels['addcontact']          = 'नया पता जोडें';
+$labels['editcontact']         = 'पता सम्पाद';
+
+$labels['edit']                        = 'सम्पाद';
+$labels['cancel']              = 'रद्द';
+$labels['save']                        = 'सहेज';
+$labels['delete']              = 'मिटा';
+
+$labels['newcontact']          = 'नया पता कार्ड बनाऐं';
+$labels['deletecontact']       = 'चुने पते मिटाऐं';
+$labels['composeto']           = 'को मेल भेजें';
+$labels['contactsfromto']      = '$from से ले कर $to, $count पते में से';
+$labels['print']               = 'छापें';
+$labels['export']              = 'ऐक्स्पोर्ट';
+
+$labels['previouspage']                = 'इससे पहले के बन्डल को दिखाऐं';
+$labels['firstpage']           = 'पहला बन्डल दिखाऐं';
+$labels['nextpage']            = 'अगला बन्डल दिखाऐं';
+$labels['lastpage']            = 'आखिरी बन्डल दिखाऐं';
+
+
+// LDAP search
+$labels['ldapsearch']          = 'ऐलडैप (LDAP) डाईरेक्टरी खोजें';
+
+$labels['ldappublicsearchname']        = 'पता का नाम';
+$labels['ldappublicsearchtype']        = 'सख़त मैच?';
+$labels['ldappublicserverselect']      = 'सर्वर चुनें';
+$labels['ldappublicsearchfield']       = 'यहाँ खोजें';
+$labels['ldappublicsearchform']        = 'पता के लिये खोजें';
+$labels['ldappublicsearch']    = 'खोज';
+
+
+// settings
+$labels['settingsfor']         = 'इनके विन्यास:';
+
+$labels['preferences']         = 'पसंद';
+$labels['userpreferences']     = 'यूसर पसंद';
+$labels['editpreferences']     = 'यूसर पसंद सम्पादें';
+
+$labels['identities']          = 'पहचान';
+$labels['manageidentities']    = 'इस खाते के पहचान व्यवस्थित करें';
+$labels['newidentity']         = 'नया पहचान';
+
+$labels['newitem']             = 'नया चीज़';
+$labels['edititem']            = 'चीज़ सम्पादें';
+
+$labels['setdefault']          = 'तयशुदा चुनें';
+$labels['language']            = 'भाषा';
+$labels['timezone']            = 'समय क्षेत्र';
+$labels['pagesize']            = 'हर पन्ने पर इतने';
+$labels['signature']           = 'दस्तखत';
+$labels['dstactive']           = 'रौशनी बचाव';
+$labels['htmleditor']          = 'मेल ऐच-टी-ऐम-एल (HTML) मे लिखें';
+$labels['htmlsignature']       = 'ऐच-टी-ऐम-एल (HTML) दस्तखत';
+$labels['previewpane']         = 'झलक पट्टी दिखाऐं';
+
+$labels['autosavedraft']       = 'ड्राफ़ट अपने आप सहेजते जाऐं';
+$labels['everynminutes']       = 'हर $n मिनट';
+$labels['never']               = 'कभी नहाीं';
+
+$labels['folder']              = 'फ़ोल्डर';
+$labels['folders']             = 'फ़ोल्डर';
+$labels['foldername']          = 'फ़ोल्डर नाम';
+$labels['subscribed']          = 'सबस्क्राईब किया गया';
+$labels['create']              = 'बनाऐं';
+$labels['createfolder']                = 'फ़ोलडर बनाऐं';
+$labels['rename']              = 'नाम बदलें';
+$labels['renamefolder']                = 'फ़ोलडर का नाम बदलें';
+$labels['deletefolder']                = 'फ़ोलडर मिटाऐं';
+$labels['managefolders']       = 'फ़ोलडर को व्यवस्थित करें';
+
+$labels['sortby']              = 'ऐसे तय करें';
+$labels['sortasc']             = 'पहले से आखीरी तय करें';
+$labels['sortdesc']            = 'आखीरी से पहले तय करें';
+
+?>
\ No newline at end of file
diff --git a/program/localization/hi/messages.inc b/program/localization/hi/messages.inc
new file mode 100644 (file)
index 0000000..a32a524
--- /dev/null
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | localization/hi/messages.inc                                          |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Aniruddha "Karim" Shankar <karim@sarai.net>                   |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$messages = array();
+
+$messages['loginfailed']       = 'लॉगिन नहीं हो पाया';
+$messages['cookiesdisabled']   = 'आपका ब्राऊसर कुकी स्वीकार नहीं कर रहा है';
+$messages['sessionerror']      = 'सत्र समाप्त या अवैद्य';
+$messages['imaperror']         = 'आईमैप (IMAP) सर्वर से सम्पर्क नहीं हो पाया';
+$messages['nomessagesfound']   = 'इस मेलबॉक्स में कोई मेल नहीं है';
+$messages['loggedout']         = 'सत्र समाप्त. टा टा!';
+$messages['mailboxempty']      = 'मेलबॉक्स खाली है';
+$messages['loading']           = 'लोड हो रहा है';
+$messages['loadingdata']       = 'डाटा लोड हो रहा है...';
+$messages['checkingmail']      = 'क्या नया मेल है?...';
+$messages['sendingmessage']    = 'मेल भेजा जा रहा है...';
+$messages['messagesent']       = 'मेल भेजा गया है';
+$messages['savingmessage']     = 'मेल सहेजा जा रहा है...';
+$messages['messagesaved']      = 'मेल ड्राफ़्ट फोल्डर में जमा हो रहा है';
+$messages['successfullysaved'] = 'सहेजा गया है';
+$messages['addedsuccessfully'] = 'पता खाते में पता जोडा गया है';
+$messages['contactexists']     = 'इस ई-मेल पता से एक पता पेहले से है';
+$messages['blockedimages']     = 'आप के प्राईवेसी के लिये और स्पैम से बचने के लिये इस मेल में सदूर चित्र नहीं दिखाये गये हैं।';
+$messages['encryptedmessage']  = 'माफ़ कीजिये, यह मेल कूट रूप में है, इस कारण दिखाया नहीं जा सकता।';
+$messages['nocontactsfound']   = 'कोई पता नहीं मिला';
+$messages['sendingfailed']     = 'मेल नहीं भिज पाया';
+$messages['errorsaving']       = 'सहेजते-सहेजते गडबड हो गया';
+$messages['errormoving']       = 'मेल खिस्का नहीं';
+$messages['errordeleting']     = 'मेल मिटा नहीं';
+$messages['deletecontactconfirm']      = 'चुने गये पते को सचमुच मिटाना है ?';
+$messages['deletemessagesconfirm']     = 'चुने गये मेल को सचमुच मिटाना है ?';
+$messages['deletefolderconfirm']       = 'फ़ोल्डर को सचमुच मिटाऐं ?';
+$messages['purgefolderconfirm']        = 'फ़ोल्डर में पडे सारे मेल को सचमुच मिटाना है?';
+$messages['formincomplete']    = 'फ़ॉर्म पूरी तरह से भरा नहीं';
+$messages['noemailwarning']    = 'वैद्य मेल पता भरें';
+$messages['nonamewarning']     = 'नाम भरें';
+$messages['nopagesizewarning'] = 'पन्ना माप भरें';
+$messages['norecipientwarning']        = 'कम-से-कम एक पाने वाले का पता भरें';
+$messages['nosubjectwarning']  = 'मेल का कोई विशय नहीं बताया गया है। क्या आप विशय डालना चाहते हैं ?';
+$messages['nobodywarning']     = 'बिना कुछ लिखे मेल भेजें?';
+$messages['notsentwarning']    = 'मेल भिजा नहीं. मेल रद्द करें ?';
+$messages['noldapserver']      = 'खोज के लिये एक ऐलडैप सर्वर चुनें';
+$messages['nocontactsreturned']        = 'कोई पते नहीं मिले';
+$messages['nosearchname']      = 'पता या पते का नाम भरें';
+$messages['searchsuccessful']  = '$nr मेल मिले';
+$messages['searchnomatch']     = 'खोज असफ़ल';
+$messages['searching']         = 'खोजा रहे हैं...';
+$messages['checking']          = 'चाँचा चा रहा है...';
+$messages['nospellerrors']     = 'कोई स्पैलिंग गलती नहीं मिली';
+$messages['folderdeleted']     = 'फ़ोल्डर मिट गया';
+$messages['deletedsuccessfully']       = "मिट गया";
+$messages['converting']                = 'मेल से फ़ॉर्मैटिंग निकाला जा रहा है...';
+$messages['messageopenerror']  = 'सर्वर से मेल लोड नहीं हो पाया';
+$messages['fileuploaderror']   = 'फ़ाईल अपलोड नहीं हो पाया';
+$messages['filesizeerror']     = 'अपलोड के लिये फ़ाईल हद $size से बड़ा है';
+
+?>
\ No newline at end of file
index b3760828d684f4eea5290b6e525010400147ca94..56bf1cc1bb23dd8b24e4c140a27503251a43f37c 100644 (file)
@@ -6,14 +6,14 @@
  | language/hr/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Edi Budimilic <edifreak@gmail.com>                            |
+ | Author: Edi Budimilic <edi@gemstudio.hr>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 627 2007-06-27 07:07:02Z tomekp $
+ @version $Id: labels.inc 1143 2008-02-26 20:50:10Z yllar $
 
 */
 
@@ -37,13 +37,13 @@ $labels['from'] = 'Od';
 $labels['to'] = 'Za';
 $labels['cc'] = 'Cc';
 $labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Reply-To';
+$labels['replyto'] = 'Odgovor-na';
 $labels['date'] = 'Datum';
 $labels['size'] = 'Veličina';
 $labels['priority'] = 'Prioritet';
 $labels['organization'] = 'Organizacija';
-$labels['reply-to'] = 'Reply-To';
-$labels['mailboxlist'] = 'Folderi';
+$labels['reply-to'] = 'Odgovor-na';
+$labels['mailboxlist'] = 'Mape';
 $labels['messagesfromto'] = 'Poruke od $from do $to od ukupno $count';
 $labels['messagenrof'] = 'Poruka broj $nr od $count';
 $labels['moveto'] = 'prebaci u...';
@@ -74,8 +74,9 @@ $labels['writenewmessage'] = 'Nova poruka';
 $labels['replytomessage'] = 'Odgovori na poruku';
 $labels['replytoallmessage'] = 'Odgovori pošiljaocu i svim primateljima';
 $labels['forwardmessage'] = 'Prosljedi poruku';
-$labels['deletemessage'] = 'Prebaci poruku u folder (Smeće)';
-$labels['printmessage'] = 'Isprintajte poruku';
+$labels['deletemessage'] = 'Prebaci poruku u mapu smeće';
+$labels['movemessagetotrash'] = 'Preseli poruke u smeće';
+$labels['printmessage'] = 'Print poruke';
 $labels['previousmessage'] = 'Prikaži prethodnu poruku';
 $labels['previousmessages'] = 'Prijašnje poruke';
 $labels['firstmessage'] = 'Prikaži prvu poruku';
@@ -86,6 +87,9 @@ $labels['lastmessage'] = 'Prikaži zadnju poruku';
 $labels['lastmessages'] = 'Prikaži zadnju skupinu poruka';
 $labels['backtolist'] = 'Povratak na listu poruka';
 $labels['viewsource'] = 'Prikaži poruku u izvornom obliku';
+$labels['markmessages'] = 'Označi poruke';
+$labels['markread'] = 'Kao pročitano';
+$labels['markunread'] = 'Kao nepročitano';
 $labels['select'] = 'Oznaći';
 $labels['all'] = 'Sve';
 $labels['none'] = 'Nijednu';
@@ -99,15 +103,15 @@ $labels['unlimited'] = 'beskonačna';
 $labels['quicksearch'] = 'Brza pretraga';
 $labels['resetsearch'] = 'Prikaži sve poruke';
 $labels['compose'] = 'Nova poruka';
-$labels['sendmessage'] = 'Pošalji poruku';
 $labels['savemessage'] = 'Spremi u \'Predlošci\'';
+$labels['sendmessage'] = 'Pošalji poruku';
 $labels['addattachment'] = 'Priloži datoteku';
 $labels['charset'] = 'Charset';
 $labels['editortype'] = 'Tip editora';
 $labels['returnreceipt'] = 'Potvrda o primitku poruke';
 $labels['checkspelling'] = 'Provjera pravopisa';
 $labels['resumeediting'] = 'Povratak u pisanje';
-$labels['revertto'] = 'Revert to';
+$labels['revertto'] = 'Vrati na';
 $labels['attachments'] = 'Privitci (Attachments)';
 $labels['upload'] = 'Dodaj';
 $labels['close'] = 'Zatvori';
@@ -120,6 +124,13 @@ $labels['nosubject'] = '(bez naslova)';
 $labels['showimages'] = 'Prikaži slike';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Samo teks';
+$labels['addcc'] = 'Dodaj Cc';
+$labels['addbcc'] = 'Dodaj Bcc';
+$labels['addreplyto'] = 'Dodaj Odgovori-na';
+$labels['mdnrequest'] = 'Pošiljaoc ove poruke je tražio da bude obaviješten po primitku ove poruke. Želite li obavijestiti pošiljaoca?';
+$labels['receiptread'] = 'Vrati potvrdu (pročitano)';
+$labels['yourmessage'] = 'Ovo je vraćena potvrda vaše poruke';
+$labels['receiptnote'] = 'Info: Ova potvrda samo potvrđuje da se poruka prikazala na računalu primaoca. Nema garancije da je primaoc pročitao ili razumio sadržaj poruke.';
 $labels['name'] = 'Puno ime';
 $labels['firstname'] = 'Ime';
 $labels['surname'] = 'Prezime';
@@ -144,7 +155,7 @@ $labels['groups'] = 'Grupe';
 $labels['personaladrbook'] = 'Privatna adresa';
 $labels['settingsfor'] = 'Postavke za';
 $labels['preferences'] = 'Postavke';
-$labels['userpreferences'] = 'KorisniÄ\87ke postavke';
+$labels['userpreferences'] = 'KorisniÄ\8dke postavke';
 $labels['editpreferences'] = 'Izmjena postavki';
 $labels['identities'] = 'Identiteti';
 $labels['manageidentities'] = 'Podesi identitete za ovaj nalog';
@@ -167,6 +178,7 @@ $labels['folder'] = 'Folder';
 $labels['folders'] = 'Folderi';
 $labels['foldername'] = 'Ime foldera';
 $labels['subscribed'] = 'Pretplata';
+$labels['messagecount'] = 'Poruke';
 $labels['create'] = 'Napravi';
 $labels['createfolder'] = 'Napravi novi folder';
 $labels['rename'] = 'Preimenuj';
index 4a4b95cbc063edca2f98a69f129fa156ac1ca7d8..5d91898a059307d5b0ba00b87f21b406468ef053 100644 (file)
@@ -6,14 +6,14 @@
  | language/hr/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Edi Budimilic <edifreak@gmail.com>                            |
+ | Author: Edi Budimilic <edi@gemstudio.hr>                              |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 627 2007-06-27 07:07:02Z tomekp $
+ @version $Id: messages.inc 1143 2008-02-26 20:50:10Z yllar $
 
 */
 
@@ -23,14 +23,14 @@ $messages['cookiesdisabled'] = 'Vaš pretraživač ne podržava kolačiće (cook
 $messages['sessionerror'] = 'Morate se ponovno ulogirati';
 $messages['imaperror'] = 'Neuspješna konekcija na IMAP server';
 $messages['nomessagesfound'] = 'Nema poruka u sandučiću';
-$messages['loggedout'] = 'Uspješno ste se odjavili.';
+$messages['loggedout'] = 'Uspješna odjava.';
 $messages['mailboxempty'] = 'Sandučuć je prazan';
 $messages['loading'] = 'Učitavanje...';
 $messages['loadingdata'] = 'Učitavanje podataka...';
 $messages['checkingmail'] = 'Provjera novih poruka u tijeku...';
 $messages['sendingmessage'] = 'Poruka se šalje...';
 $messages['messagesent'] = 'Poruka je uspješno poslana';
-$messages['savingmessage'] = 'Poruka se snima...';
+$messages['savingmessage'] = 'Poruka se sprema...';
 $messages['messagesaved'] = 'Poruka uspješno spremljena u \'Predlošci\'';
 $messages['successfullysaved'] = 'Spremanje uspješno obavljeno';
 $messages['addedsuccessfully'] = 'Kontakt uspješno dodan u imenik';
@@ -38,15 +38,15 @@ $messages['contactexists'] = 'Kontakt sa ovom e-mail adresom već postoji u imen
 $messages['blockedimages'] = 'Zbog zaštite privatnosti, slike sa udaljenih servera su blokirane.';
 $messages['encryptedmessage'] = 'Ova poruka je zaštićena pa se ne može prikazati';
 $messages['nocontactsfound'] = 'Imenik je prazan';
-$messages['contactnotfound'] = 'Traženi kontak nije pronađen';
+$messages['contactnotfound'] = 'Traženi kontakt nije pronađen';
 $messages['sendingfailed'] = 'Greška pri slanju poruke';
 $messages['errorsaving'] = 'Greška pri spremanju';
 $messages['errormoving'] = 'Greška pri premještanju poruke';
 $messages['errordeleting'] = 'Greška pri brisanju poruke';
 $messages['deletecontactconfirm'] = 'Želite li obrisati izabrane kontakte?';
 $messages['deletemessagesconfirm'] = 'Sigurno želite obrisati odabrane poruke?';
-$messages['deletefolderconfirm'] = 'Želite li obrisati ovaj folder?';
-$messages['purgefolderconfirm'] = 'Želite li obrisati sve poruke u folderu?';
+$messages['deletefolderconfirm'] = 'Želite li obrisati ovu mapu?';
+$messages['purgefolderconfirm'] = 'Želite li obrisati sve poruke u mapi?';
 $messages['formincomplete'] = 'Forma nije u cjelosti popunjena';
 $messages['noemailwarning'] = 'Unesite valjanu e-mail adresu';
 $messages['nonamewarning'] = 'Unesite ime';
@@ -63,15 +63,20 @@ $messages['searchnomatch'] = 'Traženi termin nije pronađen ni u jednoj poruci'
 $messages['searching'] = 'Pretraga u tijeku...';
 $messages['checking'] = 'Provjera u tijeku...';
 $messages['nospellerrors'] = 'Nije pronađena niti jedna pravopisna greška';
-$messages['folderdeleted'] = 'Folder uspješno obrisan';
+$messages['folderdeleted'] = 'Mapa uspješno obrisana';
 $messages['deletedsuccessfully'] = 'Uspješno obrisano';
-$messages['converting'] = 'Mičem formatiranje poruke';
+$messages['converting'] = 'Formatiranje poruke';
 $messages['messageopenerror'] = 'Nije moguće ';
 $messages['fileuploaderror'] = 'Prijenos datoteke nije uspio';
-$messages['filesizeerror'] = 'Datoteka je prevelika. Dopuštena maksimalna je $size';
+$messages['filesizeerror'] = 'Datoteka je prevelika. Maksimalna veličina je $size';
 $messages['copysuccess'] = 'Uspješno kopirano $n adresa';
 $messages['copyerror'] = 'Nije uspjelo kopiranje adresa';
 $messages['sourceisreadonly'] = 'Ovaj resurs adresa je samo za čitanje';
 $messages['errorsavingcontact'] = 'Nije uspjelo spremanje adrese kontakta';
+$messages['movingmessage'] = 'Premještanje poruke...';
+$messages['receiptsent'] = 'Uspješno poslana potvrda (pročitano)';
+$messages['errorsendingreceipt'] = 'Ne može poslati potvrdu';
+$messages['nodeletelastidentity'] = 'Ne možete izbrisati zadnji identitet.';
+$messages['addsubfolderhint'] = 'Ova mapa će biti stvorena kao podmapa na trenutno označenoj';
 
 ?>
\ No newline at end of file
index 89a127d7b2688d237146fa60de588e42e9474740..06f2d4f70c1cd97d4bc02d72ae1d9ef46990109a 100644 (file)
@@ -6,7 +6,7 @@
  | language/hu/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Ervin Hegedüs <airween@damson.hu>                             |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 890 2007-10-20 18:01:01Z thomasb $
+ @version $Id: labels.inc 1069 2008-02-13 19:33:10Z yllar $
 
 */
 
@@ -76,6 +76,7 @@ $labels['replytomessage'] = 'Válasz';
 $labels['replytoallmessage'] = 'Válasz a feladónak és az összes címzettnek';
 $labels['forwardmessage'] = 'Továbbítás';
 $labels['deletemessage'] = 'Törlés';
+$labels['movemessagetotrash'] = 'Üzenet törlése';
 $labels['printmessage'] = 'Nyomtatás';
 $labels['previousmessage'] = 'Előző levél mutatása';
 $labels['previousmessages'] = 'Előző rész mutatása';
@@ -87,6 +88,9 @@ $labels['lastmessage'] = 'Utolsó levél mutatása';
 $labels['lastmessages'] = 'Utolsó rész mutatása';
 $labels['backtolist'] = 'Vissza az üzenetekhez';
 $labels['viewsource'] = 'Forrás megtekintése';
+$labels['markmessages'] = 'Üzenetek megjelölése';
+$labels['markread'] = 'Olvasottként';
+$labels['markunread'] = 'Olvasatlanként';
 $labels['select'] = 'Kijelölés';
 $labels['all'] = 'Összes';
 $labels['none'] = 'Nincs';
@@ -100,8 +104,8 @@ $labels['unlimited'] = 'korlátlan';
 $labels['quicksearch'] = 'Gyorskeresés';
 $labels['resetsearch'] = 'Alapállapot';
 $labels['compose'] = 'Üzenet létrehozása';
-$labels['sendmessage'] = 'Üzenet azonnali küldése';
 $labels['savemessage'] = 'Vázlat mentése';
+$labels['sendmessage'] = 'Üzenet azonnali küldése';
 $labels['addattachment'] = 'File csatolása';
 $labels['charset'] = 'Karakterkészlet';
 $labels['editortype'] = 'Szerkesztő típusa';
@@ -121,6 +125,13 @@ $labels['nosubject'] = '(nincs tárgy)';
 $labels['showimages'] = 'Képek megjelenítése';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Egyszerű szöveg';
+$labels['addcc'] = 'Cc (Másolati cím) hozzáadása';
+$labels['addbcc'] = 'Bcc (Titkos másolati cím) hozzáadása';
+$labels['addreplyto'] = 'Válaszcím hozzáadása';
+$labels['mdnrequest'] = 'Az üzenet küldője értesítést kér arról hogy elolvastad a levelet. Elküdjük az Olvasási Értesítést?';
+$labels['receiptread'] = 'Olvasási Értesítés (olvasott)';
+$labels['yourmessage'] = 'Ez az üzeneted Olvasási Értesítése';
+$labels['receiptnote'] = 'Megjegyzés: Ez az Olvasási Értesítés csak azt igazolja, hogy az üzenet megjelenítésre került a címzett számítógépén. Nincs rá garancia, hogy a címzett elolvasta volna az üzenetet illetve megértette volna annak tartalmát.';
 $labels['name'] = 'Megjelenített név';
 $labels['firstname'] = 'Keresztnév';
 $labels['surname'] = 'Vezetéknév';
@@ -168,6 +179,7 @@ $labels['folder'] = 'Mappa';
 $labels['folders'] = 'Mappák';
 $labels['foldername'] = 'Mappa neve';
 $labels['subscribed'] = 'Feliratkozás';
+$labels['messagecount'] = 'Üzenet';
 $labels['create'] = 'Létrehozás';
 $labels['createfolder'] = 'Új mappa létrehozása';
 $labels['rename'] = 'Átnevezés';
index 413ee66745836c784db14b06ebaf0818fe03890e..fd6e2edec2d34e38aa6cf3185efb0c58a71d0d59 100644 (file)
@@ -6,73 +6,78 @@
  | language/hu/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Levente Farkas <lfarkas at lfarkas dot org>                    |
- |         Ervin Hegedüs <airween@damson.hu>                             |
+ | Author: Levente Farkas <lfarkas at lfarkas dot org>                   |
+ |         Ervin Hegedüs <airween@damson.hu>                             |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 890 2007-10-20 18:01:01Z thomasb $
+ @version $Id: messages.inc 1069 2008-02-13 19:33:10Z yllar $
 
 */
 
 $messages = array();
-$messages['loginfailed'] = 'Sikertelen belépés';
-$messages['cookiesdisabled'] = 'A böngésző nem támogatja a sütik használatát';
-$messages['sessionerror'] = 'Érvénytelen vagy lejárt munkamenet';
-$messages['imaperror'] = 'Nem sikerült a kapcsolódás az IMAP szerverhez';
-$messages['nomessagesfound'] = 'A fiók nem tartalmaz leveleket';
-$messages['loggedout'] = 'Sikeres kijelentkezés. Viszont látásra!';
-$messages['mailboxempty'] = 'A fiók üres';
-$messages['loading'] = 'Betöltés...';
-$messages['loadingdata'] = 'Az adatok betöltése...';
-$messages['checkingmail'] = 'Új üzenetek keresése...';
-$messages['sendingmessage'] = 'Az üzenet küldése...';
-$messages['messagesent'] = 'Az üzenet elküldve';
-$messages['savingmessage'] = 'Az üzenet mentése...';
-$messages['messagesaved'] = 'Az üzenet elmentve a Sablonokhoz';
-$messages['successfullysaved'] = 'A mentés sikerült';
-$messages['addedsuccessfully'] = 'A cím hozzáadása a címjegyzékhez megtörtént';
-$messages['contactexists'] = 'A kapcsolat már létezik ezzel az e-mail címmel';
-$messages['blockedimages'] = 'Biztonsági okokból a távoli képek letöltése tiltott.';
-$messages['encryptedmessage'] = 'Az üzenet titkosított, emiatt nem tudom megjeleníteni.';
+$messages['loginfailed'] = 'Sikertelen belépés';
+$messages['cookiesdisabled'] = 'A böngészõ nem támogatja a sütik használatát';
+$messages['sessionerror'] = 'Érvénytelen vagy lejárt munkamenet';
+$messages['imaperror'] = 'Nem sikerült a kapcsolódás az IMAP szerverhez';
+$messages['nomessagesfound'] = 'A fiók nem tartalmaz leveleket';
+$messages['loggedout'] = 'Sikeres kijelentkezés. Viszont látásra!';
+$messages['mailboxempty'] = 'A fiók üres';
+$messages['loading'] = 'Betöltés...';
+$messages['loadingdata'] = 'Az adatok betöltése...';
+$messages['checkingmail'] = 'Új üzenetek keresése...';
+$messages['sendingmessage'] = 'Az üzenet küldése...';
+$messages['messagesent'] = 'Az üzenet elküldve';
+$messages['savingmessage'] = 'Az üzenet mentése...';
+$messages['messagesaved'] = 'Az üzenet elmentve a Sablonokhoz';
+$messages['successfullysaved'] = 'A mentés sikerült';
+$messages['addedsuccessfully'] = 'A cím hozzáadása a címjegyzékhez megtörtént';
+$messages['contactexists'] = 'A kapcsolat már létezik ezzel az e-mail címmel';
+$messages['blockedimages'] = 'Biztonsági okokból a távoli képek letöltése tiltott.';
+$messages['encryptedmessage'] = 'Az üzenet titkosított, emiatt nem tudom megjeleníteni.';
 $messages['nocontactsfound'] = 'Nincs kapcsolat';
-$messages['contactnotfound'] = 'A kiválasztott kapcsolat nem található';
-$messages['sendingfailed'] = 'Az üzenet elküldése nem sikerült';
-$messages['errorsaving'] = 'A mentés során hiba lépett fel';
-$messages['errormoving'] = 'Az üzenetet nem sikerült áthelyezni';
-$messages['errordeleting'] = 'Az üzenetet nem sikerült törölni';
-$messages['deletecontactconfirm'] = 'Biztos, hogy törölni szeretnéd a kijelölt címe(ke)t?';
-$messages['deletemessagesconfirm'] = 'Biztos, hogy törölni szeretnéd a kijelölt üzenete(ke)t?';
-$messages['deletefolderconfirm'] = 'Biztos, hogy törölni szeretnéd ezt a mappát?';
-$messages['purgefolderconfirm'] = 'Biztos vagy benne, hogy az összes üzenet törölhető?';
-$messages['formincomplete'] = 'Az űrlap hiányosan lett kitöltve';
-$messages['noemailwarning'] = 'Adj meg egy valós e-mail címet';
+$messages['contactnotfound'] = 'A kiválasztott kapcsolat nem található';
+$messages['sendingfailed'] = 'Az üzenet elküldése nem sikerült';
+$messages['errorsaving'] = 'A mentés során hiba lépett fel';
+$messages['errormoving'] = 'Az üzenetet nem sikerült áthelyezni';
+$messages['errordeleting'] = 'Az üzenetet nem sikerült törölni';
+$messages['deletecontactconfirm'] = 'Biztos, hogy törölni szeretnéd a kijelölt címe(ke)t?';
+$messages['deletemessagesconfirm'] = 'Biztos, hogy törölni szeretnéd a kijelölt üzenete(ke)t?';
+$messages['deletefolderconfirm'] = 'Biztos, hogy törölni szeretnéd ezt a mappát?';
+$messages['purgefolderconfirm'] = 'Biztos vagy benne, hogy az összes üzenet törölhetõ?';
+$messages['formincomplete'] = 'Az ûrlap hiányosan lett kitöltve';
+$messages['noemailwarning'] = 'Adj meg egy valós e-mail címet';
 $messages['nonamewarning'] = 'Adj meg egy nevet';
-$messages['nopagesizewarning'] = 'Add meg a papír méretét';
-$messages['norecipientwarning'] = 'Legalább egy címzettet adj meg';
-$messages['nosubjectwarning'] = 'A "Tárgy" mező üres. Szeretnéd most kitölteni?';
-$messages['nobodywarning'] = 'Elküldöd az üzenetet tárgy nélkül?';
-$messages['notsentwarning'] = 'Az üzenet még nem küldtem el. Eldobod az üzenetet?';
-$messages['noldapserver'] = 'Adj meg egy LDAP szervert a kereséshez';
-$messages['nocontactsreturned'] = 'Nem találtam kapcsolatot';
-$messages['nosearchname'] = 'Add meg a kapcsolat nevét vagy e-mail címét';
-$messages['searchsuccessful'] = '$nr üzenetet találtam';
-$messages['searchnomatch'] = 'Nincs találat';
-$messages['searching'] = 'Keresés...';
-$messages['checking'] = 'Ellenőrzés...';
-$messages['nospellerrors'] = 'Nem találtam helyesírási hibát';
-$messages['folderdeleted'] = 'A mappa sikeresen törölve';
-$messages['deletedsuccessfully'] = 'Törölve';
-$messages['converting'] = 'Formázás eltávolítása az üzenetből...';
-$messages['messageopenerror'] = 'Nem tudom letölteni a leveleket a szerverről';
-$messages['fileuploaderror'] = 'Feltöltés sikertelen';
-$messages['filesizeerror'] = 'A feltöltött file mérete meghaladja a maximális méretet $size';
-$messages['copysuccess'] = 'Sikeresen másoltunk $nr címet';
-$messages['copyerror'] = 'Nem tudtunk másolni egyetlen címet sem';
-$messages['sourceisreadonly'] = 'Ez a címforrás csak olvasható';
-$messages['errorsavingcontact'] = 'Nem tudtuk menteni a kapcsolat címét';
+$messages['nopagesizewarning'] = 'Add meg a papír méretét';
+$messages['norecipientwarning'] = 'Legalább egy címzettet adj meg';
+$messages['nosubjectwarning'] = 'A "Tárgy" mezõ üres. Szeretnéd most kitölteni?';
+$messages['nobodywarning'] = 'Elküldöd az üzenetet tárgy nélkül?';
+$messages['notsentwarning'] = 'Az üzenet még nem küldtem el. Eldobod az üzenetet?';
+$messages['noldapserver'] = 'Adj meg egy LDAP szervert a kereséshez';
+$messages['nocontactsreturned'] = 'Nem találtam kapcsolatot';
+$messages['nosearchname'] = 'Add meg a kapcsolat nevét vagy e-mail címét';
+$messages['searchsuccessful'] = '$nr üzenetet találtam';
+$messages['searchnomatch'] = 'Nincs találat';
+$messages['searching'] = 'Keresés...';
+$messages['checking'] = 'Ellenõrzés...';
+$messages['nospellerrors'] = 'Nem találtam helyesírási hibát';
+$messages['folderdeleted'] = 'A mappa sikeresen törölve';
+$messages['deletedsuccessfully'] = 'Törölve';
+$messages['converting'] = 'Formázás eltávolítása az üzenetbõl...';
+$messages['messageopenerror'] = 'Nem tudom letölteni a leveleket a szerverrõl';
+$messages['fileuploaderror'] = 'Feltöltés sikertelen';
+$messages['filesizeerror'] = 'A feltöltött file mérete meghaladja a maximális méretet $size';
+$messages['copysuccess'] = 'Sikeresen másoltunk $nr címet';
+$messages['copyerror'] = 'Nem tudtunk másolni egyetlen címet sem';
+$messages['sourceisreadonly'] = 'Ez a címforrás csak olvasható';
+$messages['errorsavingcontact'] = 'Nem tudtuk menteni a kapcsolat címét';
+$messages['movingmessage'] = 'Üzenet mozgatása...';
+$messages['receiptsent'] = 'Az Olvasási Értesítést elküldtük';
+$messages['errorsendingreceipt'] = 'Az Olvasási Értesítést nem sikerült elküldeni';
+$messages['nodeletelastidentity'] = 'Nem törölheti ezt a profilt, ez az egyetlen';
+$messages['addsubfolderhint'] = 'Az új könyvtárat az aktuálisan kiválasztott alkönyvtáraként fogjuk létrehozni';
 
 ?>
\ No newline at end of file
diff --git a/program/localization/id_ID/labels.inc b/program/localization/id_ID/labels.inc
new file mode 100644 (file)
index 0000000..1cf1a72
--- /dev/null
@@ -0,0 +1,192 @@
+<?php\r
+\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/id_ID/labels.inc                                             |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Putu Arya Sabda Wijaya <klunxer@gmail.com>                    |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$labels = array();\r
+$labels['welcome'] = 'Selamat datang di $product';\r
+$labels['username'] = 'Username';\r
+$labels['password'] = 'Password';\r
+$labels['server'] = 'Server';\r
+$labels['login'] = 'Masuk';\r
+$labels['logout'] = 'Keluar';\r
+$labels['mail'] = 'E-Mail';\r
+$labels['settings'] = 'Pengaturan Pribadi';\r
+$labels['addressbook'] = 'Buku Alamat';\r
+$labels['inbox'] = 'Kotak Masuk';\r
+$labels['drafts'] = 'Daftar tunggu';\r
+$labels['sent'] = 'Terkirim';\r
+$labels['trash'] = 'Item-itenm tergapus';\r
+$labels['junk'] = 'Sampah';\r
+$labels['subject'] = 'Judul';\r
+$labels['from'] = 'Pengirim';\r
+$labels['to'] = 'Penerima';\r
+$labels['cc'] = 'Lampiran';\r
+$labels['bcc'] = 'Lampiran tersembunyi';\r
+$labels['replyto'] = 'Balas kepada';\r
+$labels['date'] = 'Tangal';\r
+$labels['size'] = 'Ukuran';\r
+$labels['priority'] = 'Prioritas';\r
+$labels['organization'] = 'Organisasi';\r
+$labels['reply-to'] = 'Balas kepada';\r
+$labels['mailboxlist'] = 'Map-map';\r
+$labels['messagesfromto'] = 'Pesan $from kepada $to sebanyak $count';\r
+$labels['messagenrof'] = 'Pesan $nr sebanyak $count';\r
+$labels['moveto'] = 'dipindahkan...';\r
+$labels['download'] = 'unduh';\r
+$labels['filename'] = 'Nama berkas';\r
+$labels['filesize'] = 'Ukuran berkas';\r
+$labels['preferhtml'] = 'Lebih suka HTML';\r
+$labels['htmlmessage'] = 'Pesan HTML';\r
+$labels['prettydate'] = 'Tanggal cantik';\r
+$labels['addtoaddressbook'] = 'Tambahkan ke buku tamu';\r
+$labels['sun'] = 'Min';\r
+$labels['mon'] = 'Sen';\r
+$labels['tue'] = 'Sel';\r
+$labels['wed'] = 'Rab';\r
+$labels['thu'] = 'Kam';\r
+$labels['fri'] = 'Jum';\r
+$labels['sat'] = 'Sab';\r
+$labels['sunday'] = 'Minggu';\r
+$labels['monday'] = 'Senin';\r
+$labels['tuesday'] = 'Selasa';\r
+$labels['wednesday'] = 'Rabu';\r
+$labels['thursday'] = 'Kamis';\r
+$labels['friday'] = 'Jumat';\r
+$labels['saturday'] = 'Sabtu';\r
+$labels['today'] = 'Hari ini';\r
+$labels['checkmail'] = 'Periksa pesan baru';\r
+$labels['writenewmessage'] = 'Buat pesan baru';\r
+$labels['replytomessage'] = 'Balas pesan';\r
+$labels['replytoallmessage'] = 'balas ke pengirim dan semua penerima';\r
+$labels['forwardmessage'] = 'Teruskan pesan';\r
+$labels['deletemessage'] = 'Pindahkan pesan ke tong sampah';\r
+$labels['movemessagetotrash'] = 'Pindahkan pesan ke tong sampah';\r
+$labels['printmessage'] = 'cetak pesan ini';\r
+$labels['previousmessage'] = 'Perlihatkan pesan sebelumnya';\r
+$labels['previousmessages'] = 'Perlihatkan kumpulan pesan-pesan sebelumnya';\r
+$labels['firstmessage'] = 'Perlihatkan pesan pertama';\r
+$labels['firstmessages'] = 'Perlihatkan kumpulan pesan pertama';\r
+$labels['nextmessage'] = 'Perlihatkan pesan berikutnya';\r
+$labels['nextmessages'] = 'Perlihatkan kumpulan pesan-pesan berikutnya';\r
+$labels['lastmessage'] = 'Perlihatkan pesan terakhir';\r
+$labels['lastmessages'] = 'Perlihatkan kumpulan pesan terkahir';\r
+$labels['backtolist'] = 'Kembali ke daftar pesan';\r
+$labels['viewsource'] = 'Perlihatkan kode sumber';\r
+$labels['markmessages'] = 'Tandai Pesan';\r
+$labels['markread'] = 'Terbaca';\r
+$labels['markunread'] = 'Belum Terbaca';\r
+$labels['select'] = 'Pilih';\r
+$labels['all'] = 'Semua';\r
+$labels['none'] = 'Tidak satupun';\r
+$labels['unread'] = 'Belum terbaca';\r
+$labels['compact'] = 'Ramping';\r
+$labels['empty'] = 'Kosong';\r
+$labels['purge'] = 'Kosongkan';\r
+$labels['quota'] = 'Penggunaan kandar';\r
+$labels['unknown'] = 'Tidak dikenal';\r
+$labels['unlimited'] = 'Tidak terbatas';\r
+$labels['quicksearch'] = 'Pencarian cepat';\r
+$labels['resetsearch'] = 'Atur ulang pencarian';\r
+$labels['compose'] = 'Tulis sebuah pesan';\r
+$labels['savemessage'] = 'Simpan daftar tunggu ini';\r
+$labels['sendmessage'] = 'Kirim pesan sekarang';\r
+$labels['addattachment'] = 'Sisipkan sebuah berkas';\r
+$labels['charset'] = 'set karakter';\r
+$labels['editortype'] = 'Tipe editor';\r
+$labels['returnreceipt'] = 'Kembalikan penerima';\r
+$labels['checkspelling'] = 'Pemeriksaan ejaan';\r
+$labels['resumeediting'] = 'Lanjutkan mengedit';\r
+$labels['revertto'] = 'Balik ke';\r
+$labels['attachments'] = 'Sisispan';\r
+$labels['upload'] = 'unggah';\r
+$labels['close'] = 'Tutup';\r
+$labels['low'] = 'Rendah';\r
+$labels['lowest'] = 'Terrendah';\r
+$labels['normal'] = 'Normal';\r
+$labels['high'] = 'Tinggi';\r
+$labels['highest'] = 'tertinggi';\r
+$labels['nosubject'] = '(tanpa judul)';\r
+$labels['showimages'] = 'Tampilkan gambar';\r
+$labels['htmltoggle'] = 'HTML';\r
+$labels['plaintoggle'] = 'Text murni';\r
+$labels['addcc'] = 'Tambah Cc';\r
+$labels['addbcc'] = 'Tambah Bcc';\r
+$labels['addreplyto'] = 'Tambah Balas Ke';\r
+$labels['mdnrequest'] = 'Pengirim pesan ini telah meminta untuk diberitahu ketika Anda membaca pesan ini. Apakah anda ingin memberitahu pengirim?';\r
+$labels['receiptread'] = 'Tanda Terima (baca)';\r
+$labels['yourmessage'] = 'Ini adalah Tanda Terima untuk pesan Anda';\r
+$labels['receiptnote'] = 'Catatan: Tanda Terima ini hanya mengesahkan bahwa pesan telah diperlihatkan pada komputer penerima. Tidak ada jaminan bahwa penerima telah membaca atau mengerti isi pesan.';\r
+$labels['name'] = 'Tampilkan nama';\r
+$labels['firstname'] = 'Nama depan';\r
+$labels['surname'] = 'Nama belakang';\r
+$labels['email'] = 'E-Mail';\r
+$labels['addcontact'] = 'Tambah kontak baru';\r
+$labels['editcontact'] = 'Ubah kontak';\r
+$labels['edit'] = 'Ubah';\r
+$labels['cancel'] = 'Batal';\r
+$labels['save'] = 'Simpan';\r
+$labels['delete'] = 'Hapus';\r
+$labels['newcontact'] = 'Buat kartu kontak baru';\r
+$labels['deletecontact'] = 'Hapus kontak terpilih';\r
+$labels['composeto'] = 'Tulis surat kepada';\r
+$labels['contactsfromto'] = 'Kontak $from kepada $to sebanyak $count';\r
+$labels['print'] = 'Cetak';\r
+$labels['export'] = 'Ekspor';\r
+$labels['previouspage'] = 'Perlihatkan kumpulan sebelumnya';\r
+$labels['firstpage'] = 'Perlihatkan kumpulan pertama';\r
+$labels['nextpage'] = 'Perlihatkan kumpulan selanjutnya';\r
+$labels['lastpage'] = 'Perlihatkan kumpulan terakhir';\r
+$labels['groups'] = 'Kelompok';\r
+$labels['personaladrbook'] = 'Alamat personal';\r
+$labels['settingsfor'] = 'Pengaturan untuk';\r
+$labels['preferences'] = 'Pilihan';\r
+$labels['userpreferences'] = 'Pilihan pengguna';\r
+$labels['editpreferences'] = 'Ubah pilihan pengguna';\r
+$labels['identities'] = 'Identitas';\r
+$labels['manageidentities'] = 'Atur identitas untuk akun ini';\r
+$labels['newidentity'] = 'Identitas baru';\r
+$labels['newitem'] = 'Item baru';\r
+$labels['edititem'] = 'Ubah item';\r
+$labels['setdefault'] = 'Pengaturan Awal';\r
+$labels['language'] = 'Bahasa';\r
+$labels['timezone'] = 'Daerah Waktu';\r
+$labels['pagesize'] = 'Baris per halaman';\r
+$labels['signature'] = 'Tanda tangan';\r
+$labels['dstactive'] = 'Waktu Musim Panas';\r
+$labels['htmleditor'] = 'Tulis pesan HTML';\r
+$labels['htmlsignature'] = 'Tandatangan HTML';\r
+$labels['previewpane'] = 'Perlihatkan tempat melihat';\r
+$labels['autosavedraft'] = 'Otomatis menyimpan pesan tertunda';\r
+$labels['everynminutes'] = 'setiap $n menit';\r
+$labels['never'] = 'tidak pernah';\r
+$labels['folder'] = 'Map';\r
+$labels['folders'] = 'Map-map';\r
+$labels['foldername'] = 'Nama map';\r
+$labels['subscribed'] = 'Subscribed';\r
+$labels['messagecount'] = 'Pesan-pesan';\r
+$labels['create'] = 'Buat';\r
+$labels['createfolder'] = 'Buat map baru';\r
+$labels['rename'] = 'Namai ulang';\r
+$labels['renamefolder'] = 'Namai ulang map';\r
+$labels['deletefolder'] = 'Hapus map';\r
+$labels['managefolders'] = 'Atur map';\r
+$labels['sortby'] = 'Urut berdasarkan';\r
+$labels['sortasc'] = 'Urut menaik';\r
+$labels['sortdesc'] = 'Urut menurun';\r
+\r
+?>\r
diff --git a/program/localization/id_ID/messages.inc b/program/localization/id_ID/messages.inc
new file mode 100644 (file)
index 0000000..f4d62f8
--- /dev/null
@@ -0,0 +1,82 @@
+<?php\r
+\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/id_ID/messages.inc                                           |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Putu Arya Sabda Wijaya <klunxer@gmail.com>                    |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed'] = 'Gagal masuk';\r
+$messages['cookiesdisabled'] = 'Browser Anda tidak menerima cookies';\r
+$messages['sessionerror'] = 'Session Anda invalid atau kadaluwarsa';\r
+$messages['imaperror'] = 'Koneksi ke IMAP server gagal';\r
+$messages['nomessagesfound'] = 'Surat tidak ditemukan di kotak masuk ini';\r
+$messages['loggedout'] = 'Anda berhasil mengakhiri session. Selamat Tinggal!';\r
+$messages['mailboxempty'] = 'Kotak masuk kosong';\r
+$messages['loading'] = 'Loading...';\r
+$messages['loadingdata'] = 'Loading data...';\r
+$messages['checkingmail'] = 'Memeriksa pesan baru...';\r
+$messages['sendingmessage'] = 'Mengirim pesan...';\r
+$messages['messagesent'] = 'Pesan terkirim';\r
+$messages['savingmessage'] = 'Menyimpan pesan...';\r
+$messages['messagesaved'] = 'MMenyimpan pesan ke daftar tunggu';\r
+$messages['successfullysaved'] = 'Berhasil disimpan';\r
+$messages['addedsuccessfully'] = 'Kontak berhasil ditambahkan ke buku alamat';\r
+$messages['contactexists'] = 'Konatk dengan alamat e-mail ini sudah ada';\r
+$messages['blockedimages'] = 'Untuk melindungi privasi Anda, gambar-gambar diluar server diblok pada pesan ini.';\r
+$messages['encryptedmessage'] = 'Pesan ini terenkripsi dan tidak bisa ditampilkan. Maaf!';\r
+$messages['nocontactsfound'] = 'Kontak tidak ditemukan';\r
+$messages['contactnotfound'] = 'Kontak yang diminta tidak ditemukan';\r
+$messages['sendingfailed'] = 'Pengiriman pesan gagal';\r
+$messages['errorsaving'] = 'Error ketika menyimpan';\r
+$messages['errormoving'] = 'Pesan tidak bisa dipindahkan';\r
+$messages['errordeleting'] = 'Pesan tidak bisa dihapus';\r
+$messages['deletecontactconfirm'] = 'Apakah anda yakin untuk menghapus kontak terpilih?';\r
+$messages['deletemessagesconfirm'] = 'Yakin menghapus pesan terpilih?';\r
+$messages['deletefolderconfirm'] = 'Apakah anda benar-benar ingin menghapus map ini?';\r
+$messages['purgefolderconfirm'] = 'Yakin menghapus semua pesan pada map ini?';\r
+$messages['formincomplete'] = 'Blangko tidak terisi semua';\r
+$messages['noemailwarning'] = 'Tolong masukkan alamat email yang valid';\r
+$messages['nonamewarning'] = 'Tolong masukkan nama';\r
+$messages['nopagesizewarning'] = 'Tolong masukkan ukuran halaman';\r
+$messages['norecipientwarning'] = 'Tolong masukkan sedikitnya satu penerima';\r
+$messages['nosubjectwarning'] = '\\"Judul\\" kosong. Isi judul sekarang?';\r
+$messages['nobodywarning'] = 'Kirim pesan ini tanpa teks?';\r
+$messages['notsentwarning'] = 'Pesan belum terkirim. Buang pesan Anda?';\r
+$messages['noldapserver'] = 'Tolong pilih server LDAP untuk pencarian';\r
+$messages['nocontactsreturned'] = 'Kontak kosong';\r
+$messages['nosearchname'] = 'Tolong masukkan nama kontak atau alamat email';\r
+$messages['searchsuccessful'] = '$nr pesan ditemukan';\r
+$messages['searchnomatch'] = 'Pencarian kosong';\r
+$messages['searching'] = 'Mencari...';\r
+$messages['checking'] = 'Memeriksa...';\r
+$messages['nospellerrors'] = 'Tidak ditemkan kesalahan ejaan';\r
+$messages['folderdeleted'] = 'Map berhasil dihapus';\r
+$messages['deletedsuccessfully'] = 'Berhasil dihapus';\r
+$messages['converting'] = 'Mengembalikan pesan ke format awal...';\r
+$messages['messageopenerror'] = 'Tidak dapat mengambil pesan dari server';\r
+$messages['fileuploaderror'] = 'Gagal mengunggah berkas';\r
+$messages['filesizeerror'] = 'Berkas terunggah mencapai ukuran maksimal dari $size';\r
+$messages['copysuccess'] = 'Berhasil menyalin $nr alamat';\r
+$messages['copyerror'] = 'Tidak bisa menyalin alamat manapun';\r
+$messages['sourceisreadonly'] = 'Sumber dari alamat ini hanya dapat dibaca';\r
+$messages['errorsavingcontact'] = 'Tidak bisa menyimpan alamat kontak';\r
+$messages['movingmessage'] = 'Memindahkan pesan...';\r
+$messages['receiptsent'] = 'Berhasil mengirim pemberitahuan tanda terima telah terbaca';\r
+$messages['errorsendingreceipt'] = 'Tidak dapat mengirim tanda terima';\r
+$messages['nodeletelastidentity'] = 'Anda tidak bida mengapus identitas ini, ini identitas yang terakhir';\r
+$messages['addsubfolderhint'] = 'Folder ini akan dibuat sebagai subfolder pada folder yang terpilih';\r
+\r
+?>\r
index cf6ee4e4a6d50e03a6a902d0d805e0750245055e..782b8489b7324cd53a63868c000666a51c0d220f 100644 (file)
@@ -5,7 +5,7 @@
  | program/localization/index.inc                                        |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: index.inc 886 2007-10-19 07:24:53Z yllar $
- */
+ $Id: index.inc 1160 2008-03-01 15:32:44Z yllar $
+
+*/
  
  $rcube_languages = array(
-       'en_US' => 'English (US)',
-       'en_GB' => 'English (GB)',
-       'ar'    => 'Arabic',
-       'am'    => 'Armenian',
-       'bg'    => 'Bulgarian',
-       'bs_BA' => 'Bosnian (Bosanski)',
-       'zh_TW' => 'Chinese (Traditional)',
-       'zh_CN' => 'Chinese (Simplified)',
-       'ca'    => 'Català',
-       'cz'    => 'Czech',
-       'da'    => 'Dansk',
-       'de_DE' => 'Deutsch (Deutsch)',
-       'de_CH' => 'Deutsch (Schweiz)',
-       'eo'    => 'Esperanto',
-       'es'    => 'Español',
-       'et_EE' => 'Estonian',
-       'eu'    => 'Euskara',
-       'fr'    => 'Français', 
-       'gl'    => 'Galego',
-       'ga_IE' => 'Irish',
-       'el'    => 'Greek',
-       'hi'    => 'Hindi',
-       'hr'    => 'Hrvatski',
-       'hu'    => 'Hungarian',
-       'id_ID' => 'Indonesian',
-       'it'    => 'Italiano',
-       'ja'    => 'Japanese (日本語)',
-       'kr'    => 'Korean',
-       'kur_KU' => 'Kurdish (Kurmancî)',
-       'lv'    => 'Latvian',
-       'lt'    => 'Lithuanian',
-       'mk'    => 'Macedonian (Slavic FYROM)',
-       'ms_MY' => 'Malay',
-       'nl_NL' => 'Nederlands',
-       'nl_BE' => 'Flemish',
-       'nb_NO' => 'Norsk (bokmål)',
-       'nn_NO' => 'Norsk (nynorsk)',
-       'fa'    => 'Persian',
-       'pl'    => 'Polski',
-       'pt_PT' => 'Portuguese (Standard)',
-       'pt_BR' => 'Portuguese (Brazilian)',
-       'ro'    => 'Romanian',
-       'ru'    => 'Russian',
-       'fi'    => 'Suomi',
-       'se'    => 'Svenska',
-       'si'    => 'Sinhala',
-       'sl'    => 'Slovenian',
-       'sk'    => 'Slovak',
-       'sr_latin' => 'Serbian Latin',
-       'sr_cyrillic' => 'Serbian Cyrillic',
-       'tr'    => 'Turkish',
-       'th_TH' => 'Thai',
-       'uk'    => 'Ukrainian',
-       'vn'    => 'Vietnamese'
+     'sq_AL' => 'Albanian',
+     'ar'    => 'Arabic',
+     'am'    => 'Armenian',
+     'bs_BA' => 'Bosnian (Bosanski)',
+     'bg'    => 'Bulgarian',
+     'ca'    => 'Català',
+     'zh_CN' => 'Chinese (Simplified)',
+     'zh_TW' => 'Chinese (Traditional)',
+     'hr'    => 'Croatian (Hrvatski)',
+     'cz'    => 'Czech',
+     'da'    => 'Dansk',
+     'de_DE' => 'Deutsch (Deutsch)',
+     'de_CH' => 'Deutsch (Schweiz)',
+     'en_GB' => 'English (GB)',
+     'en_US' => 'English (US)',
+     'es'    => 'Español',
+     'eo'    => 'Esperanto',
+     'et_EE' => 'Estonian',
+     'eu'    => 'Euskara',
+     'nl_BE' => 'Flemish',
+     'fr'    => 'Français',
+     'gl'    => 'Galego',
+     'ge'    => 'Georgian',
+     'el'    => 'Greek',
+     'he'    => 'Hebrew',
+     'hi'    => 'Hindi',
+     'hu'    => 'Hungarian',
+     'is'    => 'Icelandic',
+     'id_ID' => 'Indonesian',
+     'ga_IE' => 'Irish',
+     'it'    => 'Italiano',
+     'ja'    => 'Japanese (日本語)',
+     'kr'    => 'Korean',
+     'lv'    => 'Latvian',
+     'lt'    => 'Lithuanian',
+     'mk'    => 'Macedonian',
+     'ms_MY' => 'Malay',
+     'nl_NL' => 'Nederlands',
+     'ne'    => 'Nepali',
+     'nb_NO' => 'Norsk (bokmål)',
+     'nn_NO' => 'Norsk (nynorsk)',
+     'fa'    => 'Persian',
+     'pl'    => 'Polski',
+     'pt_BR' => 'Portuguese (Brazilian)',
+     'pt_PT' => 'Portuguese (Standard)',
+     'ro'    => 'Romanian',
+     'ru'    => 'Russian',
+     'sr_cyrillic'   => 'Serbian Cyrillic',
+     'sr_latin'      => 'Serbian Latin',
+     'si'    => 'Sinhala',
+     'sk'    => 'Slovak',
+     'sl'    => 'Slovenian',
+     'fi'    => 'Suomi',
+     'se'    => 'Svenska',
+     'th_TH' => 'Thai',
+     'tr'    => 'Turkish',
+     'uk'    => 'Ukrainian',
+     'vn'    => 'Vietnamese'
 );
 
 $rcube_language_aliases = array(
-       'ee' => 'et_EE',
-       'bs' => 'bs_BA',
-       'cn' => 'zh_CN',
-       'de' => 'de_DE',
-       'en' => 'en_US',
-       'ga' => 'ga_IE',
-       'nl' => 'nl_NL',
-       'no' => 'nn_NO',
-       'pt' => 'pt_PT',
-       'th' => 'th_TH',
-       'tw' => 'zh_TW'
+    'ee' => 'et_EE',
+    'bs' => 'bs_BA',
+    'cn' => 'zh_CN',
+    'de' => 'de_DE',
+    'en' => 'en_US',
+    'ga' => 'ga_IE',
+    'nl' => 'nl_NL',
+    'no' => 'nn_NO',
+    'pt' => 'pt_PT',
+    'th' => 'th_TH',
+    'tw' => 'zh_TW'
 );
 
 $rcube_charsets = array();
 
-
 ?>
diff --git a/program/localization/is/labels.inc b/program/localization/is/labels.inc
new file mode 100644 (file)
index 0000000..c6b8b0a
--- /dev/null
@@ -0,0 +1,220 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/en_GB/labels.inc                                             |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 543 2007-04-28 18:07:12Z thomasb $
+
+*/
+
+$labels = array();
+
+// login page
+$labels['welcome']   = 'Vefpóstur Vodafone';
+$labels['username']  = 'Netfang';
+$labels['password']  = 'Lykilorð';
+$labels['server']    = 'Server';
+$labels['login']     = 'Innskrá';
+
+// taskbar
+$labels['logout']   = 'Útskrá';
+$labels['mail']     = 'Tölvupóstur';
+$labels['settings'] = 'Stillingar';
+$labels['addressbook'] = 'Netfangaskrá';
+
+// mailbox names
+$labels['inbox']  = 'Innhólf';
+$labels['drafts'] = 'Drög';
+$labels['sent']   = 'Sent';
+$labels['trash']  = 'Eyddir hlutir';
+$labels['junk']   = 'Ruslpóstur';
+
+// message listing
+$labels['subject'] = 'Efni';
+$labels['from']    = 'Sendandi';
+$labels['to']      = 'Viðtakandi';
+$labels['cc']      = 'Afrit';
+$labels['bcc']     = 'Blint afrit';
+$labels['replyto'] = 'Reply-To';
+$labels['date']    = 'Dags';
+$labels['size']    = 'Stærð';
+$labels['priority'] = 'Forgangur';
+$labels['organization'] = 'Stofnun';
+
+// aliases
+$labels['reply-to'] = $labels['replyto'];
+
+$labels['mailboxlist'] = 'Möppur';
+$labels['messagesfromto'] = 'Skeyti $from til $to af $count';
+$labels['messagenrof'] = 'Skeyti $nr af $count';
+
+$labels['moveto']   = 'færa í...';
+$labels['download'] = 'sækja';
+
+$labels['filename'] = 'Skrárnafn';
+$labels['filesize'] = 'Skrárstærð';
+
+$labels['preferhtml'] = 'Vil HTML';
+$labels['htmlmessage'] = 'HTML skeyti';
+$labels['prettydate'] = 'Fallegar dagsetningar';
+
+$labels['addtoaddressbook'] = 'Bæta í netfangaskrá';
+
+// weekdays short
+$labels['sun'] = 'sun';
+$labels['mon'] = 'mán';
+$labels['tue'] = 'þri';
+$labels['wed'] = 'mið';
+$labels['thu'] = 'fim';
+$labels['fri'] = 'fös';
+$labels['sat'] = 'lau';
+
+// weekdays long
+$labels['sunday']    = 'sunnudagur';
+$labels['monday']    = 'mánudagur';
+$labels['tuesday']   = 'þriðjudagur';
+$labels['wednesday'] = 'miðvikudagur';
+$labels['thursday']  = 'fimmtudagur';
+$labels['friday']    = 'föstudagur';
+$labels['saturday']  = 'laugardagur';
+
+$labels['today'] = 'í dag';
+
+// toolbar buttons
+$labels['checkmail']        = 'Gá að nýjum skeytum';
+$labels['writenewmessage']  = 'Búa til nýtt skeyti';
+$labels['replytomessage']   = 'Svara skeyti';
+$labels['replytoallmessage'] = 'Svara sendanda og öllum viðtakendum';
+$labels['forwardmessage']   = 'Framsenda skeyti';
+$labels['deletemessage']    = 'Færa skeyti í rusl';
+$labels['printmessage']     = 'Prenta skeyti';
+$labels['previousmessages'] = 'Sýna fyrri skammt af skeytum';
+$labels['nextmessages']     = 'Sýna næsta skammt af skeytum';
+$labels['backtolist']       = 'Til baka í skeytalista';
+$labels['viewsource']       = 'Skoða kóða';
+
+$labels['select'] = 'Velja';
+$labels['all'] = 'Allt';
+$labels['none'] = 'Ekkert';
+$labels['unread'] = 'Ólesið';
+
+$labels['compact'] = 'Pakka';
+$labels['empty'] = 'Tæma';
+$labels['purge'] = 'Hreinsa';
+
+$labels['quota'] = 'Gagnamagn';
+
+
+// message compose
+$labels['compose']  = 'Semja skeyti';
+$labels['savemessage']  = 'Vista drög';
+$labels['sendmessage']  = 'Senda skeytið núna';
+$labels['addattachment']  = 'Hengja við';
+$labels['charset']  = 'Stafasett';
+
+$labels['returnreceipt']  = 'Kvittun við lestur';
+
+$labels['attachments'] = 'Viðhengi';
+$labels['upload'] = 'Senda';
+$labels['close']  = 'Loka';
+
+$labels['low']     = 'Lágt';
+$labels['lowest']  = 'Lægst';
+$labels['normal']  = 'Venjulegt';
+$labels['high']    = 'Hátt';
+$labels['highest'] = 'Hæst';
+
+$labels['nosubject']  = '(ekkert efni)';
+$labels['showimages'] = 'Birta myndir';
+
+$labels['editortype'] = 'Gerð ritils';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Einfaldur';
+
+$labels['checkspelling'] = 'Villuleita';
+$labels['resumeediting'] = 'Aftur í ritham';
+$labels['revertto']      = 'Hverfa til';
+
+$labels['addcc'] = 'Bæta við Cc';
+$labels['addbcc'] = 'Bæta við Bcc';
+$labels['addreplyto'] = 'Bæta við Reply-To';
+
+
+// address boook
+$labels['name']      = 'Nafn til birtingar';
+$labels['firstname'] = 'Fornafn';
+$labels['surname']   = 'Eftirnafn';
+$labels['email']     = 'Netfang';
+$labels['mobile']    = 'Farsími';
+
+$labels['addcontact'] = 'Bæta við nýju';
+$labels['editcontact'] = 'Lagfæra';
+
+$labels['edit']   = 'Laga';
+$labels['cancel'] = 'Hætta við';
+$labels['save']   = 'Vista';
+$labels['delete'] = 'Eyða';
+
+$labels['newcontact']     = 'Búa til nýtt nafnspjald';
+$labels['deletecontact']  = 'Eyða völdum netföngum';
+$labels['composeto']      = 'Skrifa skeyti til';
+$labels['contactsfromto'] = 'Netföng $from til $to af $count';
+$labels['print']          = 'Prenta';
+$labels['export']         = 'Flytja út';
+
+
+// settings
+$labels['settingsfor']  = 'Stillingar fyrir';
+
+$labels['preferences']  = 'Stillingar';
+$labels['userpreferences']  = 'Notendastillingar';
+$labels['editpreferences']  = 'Breyta notendastillingum';
+
+$labels['identities']  = 'Identities';
+$labels['manageidentities']  = 'Manage identities for this account';
+$labels['newidentity']  = 'New identity';
+
+$labels['newitem']  = 'Nýtt';
+$labels['edititem']  = 'Laga';
+
+$labels['setdefault']  = 'Gera sjálfgilt';
+$labels['language']  = 'Tungumál';
+$labels['timezone']  = 'Tímabelti';
+$labels['pagesize']  = 'Línur á síðu';
+$labels['signature'] = 'Undirskrift';
+$labels['dstactive']  = 'Sumar-/vetratími';
+$labels['htmleditor'] = 'Skrifa HTML-skeyti';
+$labels['htmlsignature'] = 'HTML-undirskrift';
+$labels['previewpane'] = 'Sýna forskoðunarglugga';
+
+$labels['autosavedraft']  = 'Vista sjálfkrafa sem drög';
+$labels['everynminutes']  = 'á $n mínútna fresti';
+$labels['never']  = 'aldrei';
+
+$labels['folder']  = 'Mappa';
+$labels['folders']  = 'Möppur';
+$labels['foldername']  = 'Nafn möppu';
+$labels['subscribed']  = 'Valin';
+$labels['create']  = 'Búa til';
+$labels['createfolder']  = 'Búa til nýja möppu';
+$labels['deletefolder']  = 'Eyða möppu';
+$labels['managefolders']  = 'Sýsla með möppum';
+$labels['renamefolder'] = 'Breyta nafni möppu';
+
+
+
+$labels['sortby'] = 'Raða eftir';
+$labels['sortasc']  = 'Raða vaxandi';
+$labels['sortdesc'] = 'Raða minnkandi';
+
+?>
diff --git a/program/localization/is/messages.inc b/program/localization/is/messages.inc
new file mode 100644 (file)
index 0000000..fdc1abb
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/en_GB/messages.inc                                           |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Weiran Zhang (weiran@weiran.co.uk)                            |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 466 2007-02-06 09:17:01Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed']  = 'Innskráning mistókst';
+$messages['cookiesdisabled'] = 'Vafrinn þinn vill ekki taka við kökum (cookies)';
+$messages['sessionerror'] = 'Innskráningin þín ógild eða útrunnin';
+$messages['imaperror'] = 'Tengin við IMAP-miðlara mistókst';
+$messages['nomessagesfound'] = 'Engin skeyti eru í þessu pósthólfi';
+$messages['loggedout'] = 'Þú hefur útskráðst. Bless!';
+$messages['mailboxempty'] = 'Pósthólfið er tómt';
+$messages['loading'] = 'Hleð...';
+$messages['loadingdata'] = 'Hleð gögn...';
+$messages['checkingmail'] = 'Gái að nýjum skeytum...';
+$messages['messagesent'] = 'Skeyti var sent';
+$messages['savingmessage'] = 'Vista skeyti...';
+$messages['messagesaved'] = 'Skeytið vistað í Drög';
+$messages['successfullysaved'] = 'Vistun heppnaðist!';
+$messages['addedsuccessfully'] = 'Netfangi var bætt í netfangaskrá';
+$messages['contactexists'] = 'Þetta netfang er þegar skráð í netfangaskrána';
+$messages['blockedimages'] = 'Til verndar hafa allar myndir í þessu skeyti verið blokkaðar.';
+$messages['encryptedmessage'] = 'Þetta er dulkóðað skeyti og því miður er ekki hægt að birta það';
+$messages['nocontactsfound'] = 'Engin netföng';
+$messages['sendingfailed'] = 'Sending misheppnaðist';
+$messages['errorsaving'] = 'Villa kom upp þegar var verið að vista';
+$messages['errormoving'] = 'Gat ekki fært skeytið';
+$messages['errordeleting'] = 'Gat ekki eytt skeytinu';
+$messages['deletecontactconfirm']  = 'Ertu viss um að þú viljir eyða völdum netföngum?';
+$messages['deletefolderconfirm']  = 'Ertu viss um að vilja eyða þessari möppu?';
+$messages['formincomplete'] = 'Formið var ekki fyllt út að fullu';
+$messages['noemailwarning'] = 'Sláðu inn gildt netfang';
+$messages['nonamewarning']  = 'Sláðu inn nafn';
+$messages['nopagesizewarning'] = 'Sláðu inn síðustærð';
+$messages['norecipientwarning'] = 'Í það minnsta einn viðtakandi verður að vera';
+$messages['nosubjectwarning']  = 'Efnislínan er tóm. Viltu slá eitthvað inn í hana?';
+$messages['nobodywarning'] = 'Viltu senda tómt skeyti?';
+$messages['notsentwarning'] = 'Skeytið hefur ekki verið send. Viltu henda skeytinu?';
+$messages['noldapserver'] = 'Please select an ldap server to search';
+$messages['nocontactsreturned'] = 'Engin netföng fundust';
+$messages['nosearchname'] = 'Sláðu inn nafn eða netfang';
+$messages['searchsuccessful'] = '$nr skeyti fundust';
+$messages['searchnomatch'] = 'Leit skilaði engu';
+$messages['searching'] = 'Leita...';
+$messages['checking'] = 'Gái...';
+$messages['nospellerrors'] = 'Engar innsláttarvillur fundust';
+$messages['folderdeleted'] = 'Möppu var eytt';
+
+?>
\ No newline at end of file
index bfd1016fe2c64880b9d2897c1669d69630fe9c1b..1e29225a8ad348d927a027fae1626b36a61eab36 100644 (file)
@@ -6,7 +6,7 @@
  | language/it/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Yusef Maali <contact@yusefmaali.net>                          |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 869 2007-10-15 13:27:08Z yllar $
+ @version $Id: labels.inc 1068 2008-02-13 19:24:23Z yllar $
 
 */
 
@@ -88,6 +88,9 @@ $labels['lastmessage'] = 'Visualizza l\'ultimo messaggio';
 $labels['lastmessages'] = 'Visualizza l\'ultimo set di messaggi';
 $labels['backtolist'] = 'Torna alla lista messaggi';
 $labels['viewsource'] = 'Visualizza sorgente messaggio';
+$labels['markmessages'] = 'Marca i messaggi';
+$labels['markread'] = 'Letti';
+$labels['markunread'] = 'Non letti';
 $labels['select'] = 'Seleziona';
 $labels['all'] = 'Tutti';
 $labels['none'] = 'Nessuno';
@@ -125,6 +128,10 @@ $labels['plaintoggle'] = 'Testo semplice';
 $labels['addcc'] = 'Aggiungi Cc';
 $labels['addbcc'] = 'Aggiungi Bcc';
 $labels['addreplyto'] = 'Aggiungi Rispondi a';
+$labels['mdnrequest'] = 'Il mittente richiede di ricevere una notifica dell\'avvenuta lettura del messaggio. Si desidera inviare tale notifica?';
+$labels['receiptread'] = 'Ricevuta di ritorno (letto)';
+$labels['yourmessage'] = 'Questa è la ricevuta di ritorno del mesaggio inviato';
+$labels['receiptnote'] = 'Nota: questa Ricevuta di ritorno attesta solamente che il messaggio è stato visualizzato nel computer del destinatario. Non c\'è pertanto alcuna garanzia che il destinatario abbia letto o compreso il suo contenuto.';
 $labels['name'] = 'Nome visualizzato';
 $labels['firstname'] = 'Nome';
 $labels['surname'] = 'Cognome';
@@ -172,6 +179,7 @@ $labels['folder'] = 'Cartella';
 $labels['folders'] = 'Cartelle';
 $labels['foldername'] = 'Nome cartella';
 $labels['subscribed'] = 'Sottoscritta';
+$labels['messagecount'] = 'Messaggi';
 $labels['create'] = 'Crea';
 $labels['createfolder'] = 'Crea nuova cartella';
 $labels['rename'] = 'Rinomina';
index 07fc7f43280e839809b45873a60c17d4603a3efb..6b8cd51eeac3334e7727d72142c7becdfd57541a 100644 (file)
@@ -6,7 +6,7 @@
  | language/it/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Yusef Maali <contact@yusefmaali.net>                          |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 869 2007-10-15 13:27:08Z yllar $
+ @version $Id: messages.inc 1068 2008-02-13 19:24:23Z yllar $
 
 */
 
@@ -75,5 +75,9 @@ $messages['copyerror'] = 'Impossibile copiare gli indirizzi';
 $messages['sourceisreadonly'] = 'La rubrica è in sola lettura';
 $messages['errorsavingcontact'] = 'Impossibile salvare il contatto';
 $messages['movingmessage'] = 'Sposto il messaggio...';
+$messages['receiptsent'] = 'Ricevuta di ritorno inviata con successo';
+$messages['errorsendingreceipt'] = 'Impossibile spedire la ricevuta di ritorno';
+$messages['nodeletelastidentity'] = 'Impossibile eliminare l\'unica identità disponibile';
+$messages['addsubfolderhint'] = 'La cartella verrà creata come sotto cartella della cartella corrente';
 
 ?>
\ No newline at end of file
index 15dc25edd65bcb5acbe0d424f0d08f6c63ce0d4a..142c97f3c999258c88e53836aa0529667a1267bc 100644 (file)
@@ -6,7 +6,7 @@
  | language/ja/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Takashi Takamatsu <taka717@gmail.com>                         |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: labels.inc 1154 2008-02-28 20:05:47Z thomasb $
 
 */
 
@@ -75,7 +75,8 @@ $labels['writenewmessage'] = '新規メールの作成';
 $labels['replytomessage'] = '返信';
 $labels['replytoallmessage'] = '送信者とすべての受信者に返信';
 $labels['forwardmessage'] = '転送';
-$labels['deletemessage'] = 'ごみ箱に移動';
+$labels['deletemessage'] = '削除';
+$labels['movemessagetotrash'] = 'ごみ箱に移動';
 $labels['printmessage'] = '印刷';
 $labels['previousmessage'] = '前のメッセージへ';
 $labels['previousmessages'] = '前の一覧へ';
@@ -87,6 +88,9 @@ $labels['lastmessage'] = '最後のメッセージへ';
 $labels['lastmessages'] = '最後の一覧へ';
 $labels['backtolist'] = '一覧に戻る';
 $labels['viewsource'] = 'ソースの表示';
+$labels['markmessages'] = 'マークを付ける';
+$labels['markread'] = '既読にする';
+$labels['markunread'] = '未読にする';
 $labels['select'] = '選択';
 $labels['all'] = 'すべて';
 $labels['none'] = 'なし';
@@ -100,8 +104,8 @@ $labels['unlimited'] = '無制限';
 $labels['quicksearch'] = 'Quick search';
 $labels['resetsearch'] = 'Reset search';
 $labels['compose'] = 'メッセージの作成';
-$labels['sendmessage'] = '今すぐ送信';
 $labels['savemessage'] = '草稿に保存';
+$labels['sendmessage'] = '今すぐ送信';
 $labels['addattachment'] = 'ファイルの添付';
 $labels['charset'] = '文字エンコード';
 $labels['editortype'] = 'エディターの種類';
@@ -121,6 +125,13 @@ $labels['nosubject'] = '(件名なし)';
 $labels['showimages'] = '画像の表示';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'テキスト';
+$labels['addcc'] = 'Cc 追加';
+$labels['addbcc'] = 'Bcc 追加';
+$labels['addreplyto'] = 'Reply-To 追加';
+$labels['mdnrequest'] = 'メッセージの送信者は開封確認の送付を求めています。開封確認のメッセージを送付しますか?';
+$labels['receiptread'] = '開封確認 (表示済)';
+$labels['yourmessage'] = 'これはあなたが送信したメッセージに対する開封確認です。';
+$labels['receiptnote'] = '注意: この開封確認はメッセージが受信者に表示されたことの通知です。受信者がメッセージを読んだこと、内容を理解したことを保証するものではありません。';
 $labels['name'] = '表示名';
 $labels['firstname'] = '名前';
 $labels['surname'] = '名字';
@@ -168,6 +179,7 @@ $labels['folder'] = 'フォルダ';
 $labels['folders'] = 'フォルダ一覧';
 $labels['foldername'] = 'フォルダ名';
 $labels['subscribed'] = '購読済';
+$labels['messagecount'] = 'メッセージ';
 $labels['create'] = '作成';
 $labels['createfolder'] = 'フォルダの新規作成';
 $labels['rename'] = '名前の変更';
@@ -178,4 +190,4 @@ $labels['sortby'] = '整列の基準にする';
 $labels['sortasc'] = '昇順で整列';
 $labels['sortdesc'] = '降順で整列';
 
-?>
\ No newline at end of file
+?>
index eb19674a7f2d240cbde8ab8b7a10215814e4d4f3..46ea7feb37f541a867a1278643e9924d98a63155 100644 (file)
@@ -6,7 +6,7 @@
  | language/ja/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  |         Takashi Takamatsu <taka717@gmail.com>                         |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: messages.inc 1154 2008-02-28 20:05:47Z thomasb $
 
 */
 
 $messages = array();
 $messages['loginfailed'] = 'ログインに失敗しました。';
-$messages['cookiesdisabled'] = 'ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81§ Cookie ã\81\8cç\84¡å\8a¹ã\81«è¨­å®\9aã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82';
+$messages['cookiesdisabled'] = 'ブラウザで Cookie が無効に設定されています。';
 $messages['sessionerror'] = 'セッションが正しくないか期限切れです。';
-$messages['imaperror'] = 'IMAP ã\82µã\83¼ã\83\90ã\83¼ã\81¸ã\81®æ\8e¥ç¶\9aã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82';
+$messages['imaperror'] = 'IMAP サーバへの接続に失敗しました。';
 $messages['nomessagesfound'] = 'メールはありません。';
 $messages['loggedout'] = 'ログアウトしました。';
 $messages['mailboxempty'] = 'メールボックスは空です。';
@@ -46,7 +46,7 @@ $messages['errormoving'] = 'メールを移動できません。';
 $messages['errordeleting'] = 'メールを削除できません。';
 $messages['deletecontactconfirm'] = '選択した連絡先を本当に削除しますか?';
 $messages['deletemessagesconfirm'] = '選択したメールを本当に削除しますか?';
-$messages['deletefolderconfirm'] = 'ã\81\93ã\81®ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\82\92æ\9c¬å½\93ã\81«å\89\8aé\99¤ã\81\97ã\81¾ã\81\99ã\81\8bï¼\9f';
+$messages['deletefolderconfirm'] = 'このフォルダを本当に削除しますか?';
 $messages['purgefolderconfirm'] = 'このフォルダの全てのメールを本当に削除しますか?';
 $messages['formincomplete'] = 'フォームの項目が完全に入力されていません。';
 $messages['noemailwarning'] = '有効なメールアドレスを入力して下さい。';
@@ -64,7 +64,7 @@ $messages['searchnomatch'] = '一致するメールはありません。';
 $messages['searching'] = '検索中です...';
 $messages['checking'] = '確認中です...';
 $messages['nospellerrors'] = 'スペルミスは見つかりませんでした。';
-$messages['folderdeleted'] = 'ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\82\92å\89\8aé\99¤ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82';
+$messages['folderdeleted'] = 'フォルダを削除しました。';
 $messages['deletedsuccessfully'] = '削除しました。';
 $messages['converting'] = 'メールから書式を削除中です...';
 $messages['messageopenerror'] = 'サーバからメールを取得できません。';
@@ -75,5 +75,9 @@ $messages['copyerror'] = 'アドレスをコピーできません。';
 $messages['sourceisreadonly'] = 'このアドレス情報は読み取り専用です。';
 $messages['errorsavingcontact'] = '連絡先のアドレスを保存できません。';
 $messages['movingmessage'] = '移動中です...';
+$messages['receiptsent'] = '開封確認を送信しました。';
+$messages['errorsendingreceipt'] = '開封確認を送信できません。';
+$messages['nodeletelastidentity'] = '削除できません。少なくとも1つの個人情報が必要です。';
+$messages['addsubfolderhint'] = '現在選択しているフォルダのサブフォルダとして作成されます。';
 
-?>
\ No newline at end of file
+?>
diff --git a/program/localization/kr/labels.inc b/program/localization/kr/labels.inc
new file mode 100644 (file)
index 0000000..4df78c6
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | localization/kr/labels.inc                                            |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: lordmiss <lordmiss@lordmiss.com>                              |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
+
+*/
+
+$labels['welcome'] = '$product에 오신 것을 환영합니다';
+$labels['welcome'] = '$product에 오신 것을 환영합니다';
+$labels['username'] = '사용자명';
+$labels['password'] = '비밀번호';
+$labels['server'] = '서버';
+$labels['login'] = '로그인';
+$labels['logout'] = '로그아웃';
+$labels['mail'] = '이메일';
+$labels['settings'] = '개인 설정';
+$labels['addressbook'] = '주소록';
+$labels['inbox'] = '받은편지함';
+$labels['drafts'] = '임시저장';
+$labels['sent'] = '보낸편지함';
+$labels['trash'] = '휴지통';
+$labels['junk'] = '정크메일';
+$labels['subject'] = '제목';
+$labels['from'] = '보내는 사람';
+$labels['to'] = '받는 사람';
+$labels['cc'] = '참조';
+$labels['bcc'] = '숨은 참조';
+$labels['replyto'] = '회신 주소';
+$labels['date'] = '날짜';
+$labels['size'] = '크기';
+$labels['priority'] = '우선순위';
+$labels['organization'] = '기관';
+$labels['reply-to'] = '회신 주소';
+$labels['mailboxlist'] = '폴더';
+$labels['messagesfromto'] = '$from 이 $to에게 보낸 메시지 $count 개';
+$labels['messagenrof'] = '메시지 $count 개 중 $nr 개';
+$labels['moveto'] = '이동...';
+$labels['download'] = '다운로드';
+$labels['filename'] = '파일 이름';
+$labels['filesize'] = '파일 크기';
+$labels['preferhtml'] = 'HTML 보이기';
+$labels['htmlmessage'] = 'HTML 메시지';
+$labels['prettydate'] = '날짜 형식';
+$labels['addtoaddressbook'] = '주소록에 추가';
+$labels['sun'] = '일';
+$labels['mon'] = '월';
+$labels['tue'] = '화';
+$labels['wed'] = '수';
+$labels['thu'] = '목';
+$labels['fri'] = '금';
+$labels['sat'] = '토';
+$labels['sunday'] = '일요일';
+$labels['monday'] = '월요일';
+$labels['tuesday'] = '화요일';
+$labels['wednesday'] = '수요일';
+$labels['thursday'] = '목요일';
+$labels['friday'] = '금요일';
+$labels['saturday'] = '토요일';
+$labels['today'] = '오늘';
+$labels['checkmail'] = '새 메일 확인';
+$labels['writenewmessage'] = '새 메일 작성';
+$labels['replytomessage'] = '회신 작성';
+$labels['replytoallmessage'] = '보낸이와 모든 수신자에게 회신';
+$labels['forwardmessage'] = '메일 전달';
+$labels['deletemessage'] = '메일 삭제';
+$labels['movemessagetotrash'] = '메일 휴지통으로 이동';
+$labels['printmessage'] = '메일 인쇄';
+$labels['previousmessage'] = '이전 메일 보기';
+$labels['previousmessages'] = '이전 메일 세트 보기';
+$labels['firstmessage'] = '처음 메일 보기';
+$labels['firstmessages'] = '처음 메일 세트 보기';
+$labels['nextmessage'] = '다음 메일 보기';
+$labels['nextmessages'] = '다음 메일 세트 보기';
+$labels['lastmessage'] = '마지막 메일 보기';
+$labels['lastmessages'] = '마지막 메일 세트 보기';
+$labels['backtolist'] = '메일 목록으로';
+$labels['viewsource'] = '소스 보기';
+$labels['markmessages'] = '메시지 표시';
+$labels['markread'] = '읽은 것으로';
+$labels['markunread'] = '읽지 않은 것으로';
+$labels['select'] = '선택';
+$labels['all'] = '모두';
+$labels['none'] = '없음';
+$labels['unread'] = '읽지 않음';
+$labels['compact'] = '간단하게';
+$labels['empty'] = '비우기';
+$labels['purge'] = '삭제';
+$labels['quota'] = '디스크 사용';
+$labels['unknown'] = '알수 없음';
+$labels['unlimited'] = '제한 없음';
+$labels['quicksearch'] = '빨리 찾기';
+$labels['resetsearch'] = '찾기 리셋';
+$labels['compose'] = '메일 쓰기';
+$labels['savemessage'] = '드래프트 저장';
+$labels['sendmessage'] = '메일 지금 보냄';
+$labels['addattachment'] = '파일 첨부';
+$labels['charset'] = '문자셋';
+$labels['editortype'] = '편집기 형태';
+$labels['returnreceipt'] = '수신 확인';
+$labels['checkspelling'] = '스펠링 체크';
+$labels['resumeediting'] = '편집 계속';
+$labels['revertto'] = '돌아감';
+$labels['attachments'] = '첨부 파일';
+$labels['upload'] = '업로드';
+$labels['close'] = '닫기';
+$labels['low'] = '낮음';
+$labels['lowest'] = '가장 낮음';
+$labels['normal'] = '보통';
+$labels['high'] = '높음';
+$labels['highest'] = '가장 높음';
+$labels['nosubject'] = '(제목 없음)';
+$labels['showimages'] = '이미지 표시';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = '일반 텍스트';
+$labels['addcc'] = '참조 넣기';
+$labels['addbcc'] = '숨은참조 넣기';
+$labels['addreplyto'] = '회신주소 넣기';
+$labels['mdnrequest'] = '이 메시지를 보낸 분이 읽음 확인 요청을 했습니다. 확인할까요?';
+$labels['receiptread'] = '읽음 확인 보내기';
+$labels['yourmessage'] = '당신의 메시지를 읽었습니다.';
+$labels['receiptnote'] = '주의: 이 확인은 이 메시지가 수신자의 컴퓨터에 표시된 것만을 의미합니다. 수신자가 반드시 이 메일을 읽거나 이해했다는 것은 아닙니다.';
+$labels['name'] = '표시 이름';
+$labels['firstname'] = '이름';
+$labels['surname'] = '성';
+$labels['email'] = '이메일';
+$labels['addcontact'] = '새 연락처 추가';
+$labels['editcontact'] = '연락처 편집';
+$labels['edit'] = '편집';
+$labels['cancel'] = '취소';
+$labels['save'] = '저장';
+$labels['delete'] = '삭제';
+$labels['newcontact'] = '새 연락처 카드 만들기';
+$labels['deletecontact'] = '선택한 연락처 삭제';
+$labels['composeto'] = '새 메일 작성';
+$labels['contactsfromto'] = '$from 에서 $to 로의 연락처 $count 개';
+$labels['print'] = '인쇄';
+$labels['export'] = '내보내기';
+$labels['previouspage'] = '이전 세트 보기';
+$labels['firstpage'] = '처음 세트 보기';
+$labels['nextpage'] = '다음 세트 보기';
+$labels['lastpage'] = '마지막 세트 보기';
+$labels['groups'] = '그룹';
+$labels['personaladrbook'] = '개인 주소';
+$labels['settingsfor'] = '설정';
+$labels['preferences'] = '환경 설정';
+$labels['userpreferences'] = '사용자 환경';
+$labels['editpreferences'] = '사용자 환경 편집';
+$labels['identities'] = '신원';
+$labels['manageidentities'] = '이 계정의 신원 관리';
+$labels['newidentity'] = '새 신원';
+$labels['newitem'] = '새 아이템';
+$labels['edititem'] = '아이템 편집';
+$labels['setdefault'] = '기본으로 설정';
+$labels['language'] = '언어';
+$labels['timezone'] = '시간대';
+$labels['pagesize'] = '페이지당 줄 수';
+$labels['signature'] = '서명';
+$labels['dstactive'] = '서머타임';
+$labels['htmleditor'] = 'HTML 메일 쓰기';
+$labels['htmlsignature'] = 'HTML 서명';
+$labels['previewpane'] = '이전 구역 보기';
+$labels['autosavedraft'] = '드래프트 자동 저장';
+$labels['everynminutes'] = '$n 분마다';
+$labels['never'] = '하지 않음';
+$labels['folder'] = '폴더';
+$labels['folders'] = '폴더';
+$labels['foldername'] = '폴더 이름';
+$labels['subscribed'] = '가입됨';
+$labels['messagecount'] = '메시지';
+$labels['create'] = '만들기';
+$labels['createfolder'] = '새 폴더 만들기';
+$labels['rename'] = '이름 바꾸기';
+$labels['renamefolder'] = '폴더 이름 바꾸기';
+$labels['deletefolder'] = '폴더 지우기';
+$labels['managefolders'] = '폴더 관리';
+$labels['sortby'] = '정렬';
+$labels['sortasc'] = '오름차순으로 정렬';
+$labels['sortdesc'] = '내림차순으로 정렬';
+
+?>
\ No newline at end of file
diff --git a/program/localization/kr/messages.inc b/program/localization/kr/messages.inc
new file mode 100644 (file)
index 0000000..95d591e
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | localization/kr/messages.inc                                            |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: lordmiss <lordmiss@lordmiss.com>                              |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 560 2007-05-17 15:01:26Z thomasb $
+
+*/
+
+$messages['loginfailed'] = '로그인 실패';
+$messages['loginfailed'] = '로그인 실패';
+$messages['cookiesdisabled'] = '브라우저가 쿠키를 지원하지 않습니다';
+$messages['sessionerror'] = '세션이 유효하지 않거나 종료되었습니다';
+$messages['imaperror'] = 'IMAP 서버 연결 실패';
+$messages['nomessagesfound'] = '이 메일함에 메일이 없습니다';
+$messages['loggedout'] = '세션을 성공적으로 종료하였습니다. 안녕히 가십시오!';
+$messages['mailboxempty'] = '메일함이 비어있습니다';
+$messages['loading'] = '불러오는 중...';
+$messages['loadingdata'] = '데이터 불러오는 중...';
+$messages['checkingmail'] = '새 메일 확인 중...';
+$messages['sendingmessage'] = '메일 보내는 중...';
+$messages['messagesent'] = '메일을 성공적으로 보냈습니다';
+$messages['savingmessage'] = '메일 저장 중...';
+$messages['messagesaved'] = '메일이 드래프트 폴더에 저장되었습니다';
+$messages['successfullysaved'] = '성공적으로 저장';
+$messages['addedsuccessfully'] = '연락처가 주소록에 성공적으로 추가되었습니다';
+$messages['contactexists'] = '이 메일로 지정된 연락처가 이미 있습니다';
+$messages['blockedimages'] = '보안 유지를 위해, 이 메일의 외부 이미지를 차단하였습니다';
+$messages['encryptedmessage'] = '이 메일은 암호화되어 볼 수 없습니다. 죄송합니다!';
+$messages['nocontactsfound'] = '연락처 없음';
+$messages['contactnotfound'] = '요청한 연락처가 없습니다';
+$messages['sendingfailed'] = '메일을 보내지 못했습니다';
+$messages['errorsaving'] = '저장 중 에러가 발생했습니다';
+$messages['errormoving'] = '메일을 옮길 수 없습니다';
+$messages['errordeleting'] = '메일을 지울 수 없습니다';
+$messages['deletecontactconfirm'] = '정말 선택한 연락처들을 삭제하시겠습니까?';
+$messages['deletemessagesconfirm'] = '정말 선택한 메일들을 삭제하시겠습니까?';
+$messages['deletefolderconfirm'] = '정말 이 폴더를 삭제하시겠습니까?';
+$messages['purgefolderconfirm'] = '정말 이 폴더의 모든 메일을 삭제하시겠습니까?';
+$messages['formincomplete'] = '양식을 완전히 채우지 않았습니다';
+$messages['noemailwarning'] = '유효한 이메일 주소를 넣어주십시오';
+$messages['nonamewarning'] = '이름을 넣어주십시오';
+$messages['nopagesizewarning'] = '페이지 크기를 넣어주십시오';
+$messages['norecipientwarning'] = '적어도 한 개 이상의 수신 주소를 넣어주십시오';
+$messages['nosubjectwarning'] = '"제목"이 없습니다. 제목을 넣으시겠습니까?';
+$messages['nobodywarning'] = '텍스트 없이 메일을 보낼까요?';
+$messages['notsentwarning'] = '메일을 보내지 않았습니다. 메일을 버리시겠습니까?';
+$messages['noldapserver'] = '검색할 LDAP 서버를 선택하세요';
+$messages['nocontactsreturned'] = '연락처가 없습니다';
+$messages['nosearchname'] = '연락처 이름이나 메일 주소를 넣으세요';
+$messages['searchsuccessful'] = '$nr개의 메일 발견';
+$messages['searchnomatch'] = '검색 결과가 없습니다';
+$messages['searching'] = '검색 중...';
+$messages['checking'] = '체크 중...';
+$messages['nospellerrors'] = '스펠링 에러가 없습니다';
+$messages['folderdeleted'] = '폴더를 성공적으로 삭제하였습니다';
+$messages['deletedsuccessfully'] = '성공적으로 삭제하였습니다';
+$messages['converting'] = '메일의 포맷을 지우는 중...';
+$messages['messageopenerror'] = '서버에서 메일을 가져올 수 없습니다';
+$messages['fileuploaderror'] = '파일 업로드 실패';
+$messages['filesizeerror'] = '올린 파일이 $size의 최대 크기를 초과했습니다';
+$messages['copysuccess'] = '$nr개의 주소를 성공적으로 복사했습니다';
+$messages['copyerror'] = '주소를 복사할 수 없습니다';
+$messages['sourceisreadonly'] = '이 주소 소스는 읽기 전용입니다';
+$messages['errorsavingcontact'] = '연락처 주소를 저장할 수 없습니다';
+$messages['movingmessage'] = '메시지 이동 중...';
+$messages['receiptsent'] = '메일 읽음 확인을 보냈습니다';
+$messages['errorsendingreceipt'] = '읽음 확인을 보낼 수 없습니다';
+$messages['nodeletelastidentity'] = '이 정보는 마지막 남은 것이므로 지울 수 없습니다';
+$messages['addsubfolderhint'] = '이 폴더는 현재 선택된 폴더의 서브 폴더로 만들어질 것입니다';
+
+?>
\ No newline at end of file
index 9b9c16aab7602c79e7d2253d8b6bea913b08e5b8..6f161d623237cd92ef1992148503262861d03c68 100644 (file)
@@ -6,14 +6,14 @@
  | language/lt/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Martynas Bendorius <martynas@e-vaizdas.net>                   |
+ | Author: Martynas Bendorius <martynas@evanet.lt>                       |
  +-----------------------------------------------------------------------+'
 
- @version $Id: labels.inc 853 2007-10-03 19:47:40Z yllar $
+ @version $Id: labels.inc 1128 2008-02-21 07:43:23Z yllar $
 
 */
 
@@ -87,6 +87,9 @@ $labels['lastmessage'] = 'Rodyti paskutinį laišką';
 $labels['lastmessages'] = 'Rodyti paskutinius laiškus';
 $labels['backtolist'] = 'Grižti į laiškų sarašą';
 $labels['viewsource'] = 'Rodyti šaltinį';
+$labels['markmessages'] = 'Pažymėti laiškus';
+$labels['markread'] = 'Kaip perskaitytus';
+$labels['markunread'] = 'Kaip neperskaitytus';
 $labels['select'] = 'Pažymėti';
 $labels['all'] = 'Visus';
 $labels['none'] = 'Nieko';
@@ -124,6 +127,10 @@ $labels['plaintoggle'] = 'Paprastas tekstas';
 $labels['addcc'] = 'Pridėti Cc';
 $labels['addbcc'] = 'Pridėti Bcc';
 $labels['addreplyto'] = 'Pridėti Reply-To';
+$labels['mdnrequest'] = 'Žinutės siuntėjas paprašė patvirtinti, kad jūs ją perskaitėte. Ar norite išsiųsti patvirtinimą?';
+$labels['receiptread'] = 'Patvirtinimas (skaitymo)';
+$labels['yourmessage'] = 'Jūsų laiško perskaitymo patvirtinimas';
+$labels['receiptnote'] = 'Pastaba: šis laiško perskaitymo patvirtinimas nurodo, jog laiškas buvo atidarytas gavėjo kompiuteryje, tačiau negarantuoja, jog gavėjas perskaitė ir suprato laiško turinį.';
 $labels['name'] = 'Rodomas vardas';
 $labels['firstname'] = 'Vardas';
 $labels['surname'] = 'Pavardė';
@@ -171,6 +178,7 @@ $labels['folder'] = 'Aplankas';
 $labels['folders'] = 'Aplankai';
 $labels['foldername'] = 'Aplanko vardas';
 $labels['subscribed'] = 'Užsakytas';
+$labels['messagecount'] = 'Laiškai';
 $labels['create'] = 'Sukurti';
 $labels['createfolder'] = 'Sukurti naują aplanką';
 $labels['rename'] = 'Pervadinti';
index eb9041146d099b1acca5dfde080c387f083e8c9d..24cd96f54c7b8c9716bc203f92f52c01e3723923 100644 (file)
@@ -6,14 +6,14 @@
  | language/lt/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Martynas Bendorius <martynas@e-vaizdas.net>                   |
+ | Author: Martynas Bendorius <martynas@evanet.lt>                       |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 853 2007-10-03 19:47:40Z yllar $
+ @version $Id: messages.inc 1128 2008-02-21 07:43:23Z yllar $
 
 */
 
@@ -74,5 +74,9 @@ $messages['copyerror'] = 'Adresų kopijuoti negalima';
 $messages['sourceisreadonly'] = 'Šis adreso šaltinis yra tik skaitymui';
 $messages['errorsavingcontact'] = 'Kontakto adreso išsaugoti negalima';
 $messages['movingmessage'] = 'Perkeliamas laiškas...';
+$messages['receiptsent'] = 'Sėkmingai išsiųstas laiško perskaitymo patvirtinimas';
+$messages['errorsendingreceipt'] = 'Nepavyko išsiųsti laiško perskaitymo patvirtinimo';
+$messages['nodeletelastidentity'] = 'Jūs negalite ištrinti šios tapatybės, kadangi ji yra vienintelė likusi.';
+$messages['addsubfolderhint'] = 'Šis aplankas bus sukurtas kaip poaplankis, kurį esate pažymėjęs';
 
-?> 
+?>
index 54716a29c9e4f0f4949b7dc4b30ededa1cfbcf71..0d2f591a53112edf6e4e55bda23a71742f749252 100644 (file)
@@ -6,15 +6,15 @@
  | language/lv/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Rudolfs Osins <dev.random@gmail.com>                          |
- | Updated for 0.1-rc1: Mikelis Zalais <mik@prog.lv>                     |
+ |         Mikelis Zalais <mik@prog.lv>                                  |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 557 2007-05-15 06:41:32Z yllar $
+ @version $Id: labels.inc 1093 2008-02-16 11:40:18Z tomekp $
 
 */
 
@@ -75,7 +75,8 @@ $labels['writenewmessage'] = 'Rakstīt jaunu vēstuli';
 $labels['replytomessage'] = 'Atbildēt uz vēstuli';
 $labels['replytoallmessage'] = 'Atbildēt sūtītājam un visiem saņēmējiem';
 $labels['forwardmessage'] = 'Pārsūtīt vēstuli';
-$labels['deletemessage'] = 'Pārvietot vēstuli uz miskasti';
+$labels['deletemessage'] = 'Dzēst vēstuli';
+$labels['movemessagetotrash'] = 'Pārvietot vēstuli uz miskasti';
 $labels['printmessage'] = 'Izdrukāt šo vēstuli';
 $labels['previousmessage'] = 'Parādīt iepriekšējo vēstuli';
 $labels['previousmessages'] = 'Parādīt iepriekšējo vēstuļu kopu';
@@ -87,6 +88,9 @@ $labels['lastmessage'] = 'Parādīt pēdējo vēstuli';
 $labels['lastmessages'] = 'Parādīt pēdējo vēstuļu kopu';
 $labels['backtolist'] = 'Atpakaļ uz vēstuļu sarakstu';
 $labels['viewsource'] = 'Rādīt pirmtekstu';
+$labels['markmessages'] = 'Atzīmēt vēstules';
+$labels['markread'] = 'Kā lasītas';
+$labels['markunread'] = 'Kā nelasītas';
 $labels['select'] = 'Iezīmēt';
 $labels['all'] = 'Visas';
 $labels['none'] = 'Nevienu';
@@ -100,8 +104,8 @@ $labels['unlimited'] = 'neierobežots';
 $labels['quicksearch'] = 'Ārtā meklēšana';
 $labels['resetsearch'] = 'Atstatīt meklēšanu';
 $labels['compose'] = 'Rakstīt vēstuli';
-$labels['sendmessage'] = 'Sūtīt vēstuli';
 $labels['savemessage'] = 'Saglabāt uzmetumu';
+$labels['sendmessage'] = 'Sūtīt vēstuli';
 $labels['addattachment'] = 'Pievienot failu';
 $labels['charset'] = 'Rakstzīmju kopa';
 $labels['editortype'] = 'Redaktora tips';
@@ -121,6 +125,13 @@ $labels['nosubject'] = '(no subject)';
 $labels['showimages'] = 'Rādīt attēlus';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Vienkāršs teksts';
+$labels['addcc'] = 'Pievienot Cc';
+$labels['addbcc'] = 'Pievienot Bcc';
+$labels['addreplyto'] = 'Pievienot Reply-To';
+$labels['mdnrequest'] = 'Šīs vēstules sūtītājs vēlas redzēt vēstules saņemšanas apstiprinājumu. Vai jūs vēlaties nosūtīt apstiprinājumu?';
+$labels['receiptread'] = 'Saņemšanas apstiprinājums';
+$labels['yourmessage'] = 'Šīs ir jūsu vēstules saņemšanas apstiprinājums';
+$labels['receiptnote'] = 'Piezīme: Šīs apsiprinājums nozīmē tikai to, ka vēstule tika parādīta uz saņēmāja datora. Tas nenozīmē, ka saņēmējs ir izlasījis vai izpratis vēstules saturu.';
 $labels['name'] = 'Uzrādītais vārds';
 $labels['firstname'] = 'Vārds';
 $labels['surname'] = 'Uzvārds';
@@ -168,6 +179,7 @@ $labels['folder'] = 'Mape';
 $labels['folders'] = 'Mapes';
 $labels['foldername'] = 'Mapes nosaukums';
 $labels['subscribed'] = 'Abonētās';
+$labels['messagecount'] = 'Vēstules';
 $labels['create'] = 'Izveidot';
 $labels['createfolder'] = 'Izveidot jaunu mapi';
 $labels['rename'] = 'Pārsaukt';
index 753961bbc34327a1913eec14a9ab99a95bbffb8b..7ba47ed367252ad6da82eeedf57172610a8d40a6 100644 (file)
@@ -6,15 +6,15 @@
  | language/lv/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Rudolfs Osins <dev.random@gmail.com>                          |
- | Updated for 0.1-rc1: Mikelis Zalais <mik@prog.lv>                     |
+ |         Mikelis Zalais <mik@prog.lv>                                  |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 557 2007-05-15 06:41:32Z yllar $
+ @version $Id: messages.inc 1093 2008-02-16 11:40:18Z tomekp $
 
 */
 
@@ -74,5 +74,10 @@ $messages['copysuccess'] = 'Veiksmīgi nokopētas $nr vēstules';
 $messages['copyerror'] = 'Nevarēja nokopēt nevienu adresi';
 $messages['sourceisreadonly'] = 'Adreses avots ir lasīšanas režīmā tikai';
 $messages['errorsavingcontact'] = 'Nevarēja saglabāt kontakta adreses';
+$messages['movingmessage'] = 'Pārvietoju vēstules...';
+$messages['receiptsent'] = 'Saņemšanas apstiprinājums nosūtīts';
+$messages['errorsendingreceipt'] = 'Neizdevās nosūtīt apstiprinājumu';
+$messages['nodeletelastidentity'] = 'Šo identitāti nevar izdzēst, tā ir pati pēdējā.';
+$messages['addsubfolderhint'] = 'Šis folderis tiks izveidots kā apakšfolderis tam, kurš patreiz ir izvēlēts';
 
 ?>
\ No newline at end of file
index 3a42fe418214d478397550470bc7dec27826fd21..40e2b1a15813ace1c0e554ea3fb11c5a81e72ca7 100755 (executable)
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | language/mk/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author:  Ivan Mishev - mishevivan@gmail.com                           |
- +-----------------------------------------------------------------------+
-
-*/
-
-$labels = array();
-$labels['welcome'] = 'Добредојдовте во $product';
-$labels['username'] = 'Корисничко Име';
-$labels['password'] = 'Лозинка';
-$labels['server'] = 'Сервер';
-$labels['login'] = 'Логирај Се';
-$labels['logout'] = 'Одлогирај Се';
-$labels['mail'] = 'Е-Маил';
-$labels['settings'] = 'Подесувања';
-$labels['addressbook'] = 'Именик';
-$labels['inbox'] = 'Пошта';
-$labels['drafts'] = 'Непратени';
-$labels['sent'] = 'Пратени';
-$labels['trash'] = 'Корпа';
-$labels['junk'] = 'Ѓубре';
-$labels['subject'] = 'Наслов';
-$labels['from'] = 'Праќач';
-$labels['to'] = 'Примач';
-$labels['cc'] = 'Копирај';
-$labels['bcc'] = 'Bcc';
-$labels['replyto'] = 'Препрати на';
-$labels['date'] = 'Дата';
-$labels['size'] = 'Големина';
-$labels['priority'] = 'Приоритет';
-$labels['organization'] = 'Организација';
-$labels['reply-to'] = 'Препрати на';
-$labels['mailboxlist'] = 'Папки';
-$labels['messagesfromto'] = '$count пораки од $from';
-$labels['messagenrof'] = '$nr порака од $count';
-$labels['moveto'] = 'Премести во...';
-$labels['download'] = 'сними';
-$labels['filename'] = 'Име на фајлот';
-$labels['filesize'] = 'Големина на Фајлот';
-$labels['preferhtml'] = 'Прикажи во HTML';
-$labels['htmlmessage'] = 'HTML Порака';
-$labels['prettydate'] = 'Убави дати';
-$labels['addtoaddressbook'] = 'Додади во именик';
-$labels['sun'] = 'Нед';
-$labels['mon'] = 'Пон';
-$labels['tue'] = 'Вто';
-$labels['wed'] = 'Сре';
-$labels['thu'] = 'Чет';
-$labels['fri'] = 'Пет';
-$labels['sat'] = 'Саб';
-$labels['sunday'] = 'Недела';
-$labels['monday'] = 'Понеделник';
-$labels['tuesday'] = 'Вторник';
-$labels['wednesday'] = 'Среда';
-$labels['thursday'] = 'Четврток';
-$labels['friday'] = 'Петок';
-$labels['saturday'] = 'Сабота';
-$labels['today'] = 'Денес';
-$labels['checkmail'] = 'Провери пошта';
-$labels['writenewmessage'] = 'Нова порака';
-$labels['replytomessage'] = 'Одговори на пораката';
-$labels['replytoallmessage'] = 'Одговори на сите';
-$labels['forwardmessage'] = 'Препрати ја пораката';
-$labels['deletemessage'] = 'Премести ја пораката во Корпа';
-$labels['printmessage'] = 'За печатење';
-$labels['previousmessage'] = 'Прикажи ја претходната порака';
-$labels['previousmessages'] = 'Прикажи ги претходните пораки';
-$labels['firstmessage'] = 'Прикажи ја првата порака';
-$labels['firstmessages'] = 'Прикажи ги првите пораки';
-$labels['nextmessage'] = 'Прикажи ја наредната порака';
-$labels['nextmessages'] = 'Прикажи ги следните пораки';
-$labels['lastmessage'] = 'Прикажи ја последната порака';
-$labels['lastmessages'] = 'Прикажи ги последните пораки';
-$labels['backtolist'] = 'Врати се во поштенското сандаче';
-$labels['viewsource'] = 'Покажи го изворот на пракање';
-$labels['select'] = 'Одбележи';
-$labels['all'] = 'Сите';
-$labels['none'] = 'Никоја';
-$labels['unread'] = 'Непрочитани';
-$labels['compact'] = 'Уредно';
-$labels['empty'] = 'Испразни';
-$labels['purge'] = 'Чистење';
-$labels['quota'] = 'Искористен простор';
-$labels['unknown'] = 'непознато';
-$labels['unlimited'] = 'неограничено';
-$labels['quicksearch'] = 'Брзо претражување';
-$labels['resetsearch'] = 'Ново претражување';
-$labels['compose'] = 'Нова порака';
-$labels['sendmessage'] = 'Прати ја пораката';
-$labels['savemessage'] = 'Снимај ја пораката во Непратени';
-$labels['addattachment'] = 'Прикачи фајл';
-$labels['charset'] = 'Charset';
-$labels['editortype'] = 'Тип на едитор';
-$labels['returnreceipt'] = 'Врати ';
-$labels['checkspelling'] = 'Провери спелување';
-$labels['resumeediting'] = 'Продолжи со уредување';
-$labels['revertto'] = 'Обрати се на';
-$labels['attachments'] = 'Прикачено';
-$labels['upload'] = 'Прикачи';
-$labels['close'] = 'Затвори';
-$labels['low'] = 'Низок';
-$labels['lowest'] = 'Најнизок';
-$labels['normal'] = 'Нормален';
-$labels['high'] = 'Висок';
-$labels['highest'] = 'Највисок';
-$labels['nosubject'] = '(нема тема)';
-$labels['showimages'] = 'Прикажи ги сликите';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'Обичен текст';
-$labels['name'] = 'Прикажано име';
-$labels['firstname'] = 'Име';
-$labels['surname'] = 'Презиме';
-$labels['email'] = 'Е-маил';
-$labels['addcontact'] = 'Додади го контактот';
-$labels['editcontact'] = 'Промени го контактот';
-$labels['edit'] = 'Промени';
-$labels['cancel'] = 'Откажи';
-$labels['save'] = 'Сними';
-$labels['delete'] = 'Избриши';
-$labels['newcontact'] = 'Додади ново име';
-$labels['deletecontact'] = 'Избриши ги следните имиња';
-$labels['composeto'] = 'Напиши порака';
-$labels['contactsfromto'] = '$count имиња $from до $to';
-$labels['print'] = 'Испечати';
-$labels['export'] = 'Извади како';
-$labels['previouspage'] = 'Прикажи претходна страна';
-$labels['firstpage'] = 'Прикажи ја првата страна';
-$labels['nextpage'] = 'Прикажи ја следната страна';
-$labels['lastpage'] = 'Прикажи ја последната страна';
-$labels['groups'] = 'Групи';
-$labels['personaladrbook'] = 'Адреси';
-$labels['settingsfor'] = 'Подесувања за';
-$labels['preferences'] = 'Подесувања';
-$labels['userpreferences'] = 'Кориснички подесувања';
-$labels['editpreferences'] = 'Промени ги корисничките подесувања';
-$labels['identities'] = 'Идентитети';
-$labels['manageidentities'] = 'Организирај ги идентитетите за овој корисник';
-$labels['newidentity'] = 'Нов идентитет';
-$labels['newitem'] = 'Нов објект';
-$labels['edititem'] = 'Промени објект';
-$labels['setdefault'] = 'Одбери за основно';
-$labels['language'] = 'Јазик';
-$labels['timezone'] = 'Временска зона';
-$labels['pagesize'] = 'Редови прикажани на страна';
-$labels['signature'] = 'Потпис';
-$labels['dstactive'] = 'Промени на времето';
-$labels['htmleditor'] = 'Создади HTML порака';
-$labels['htmlsignature'] = 'HTML потпис';
-$labels['previewpane'] = 'Прикажи го претходниот панел';
-$labels['autosavedraft'] = 'Авоматски снимај во Непратени';
-$labels['everynminutes'] = 'секои $n минути';
-$labels['never'] = 'никогаш';
-$labels['folder'] = 'Папка';
-$labels['folders'] = 'Папки';
-$labels['foldername'] = 'Име на папката';
-$labels['subscribed'] = 'Претплатен';
-$labels['create'] = 'Креирај';
-$labels['createfolder'] = 'Креирај нова папка';
-$labels['rename'] = 'Преименувај';
-$labels['renamefolder'] = 'Преименувај ја папката';
-$labels['deletefolder'] = 'Избриши ја папката';
-$labels['managefolders'] = 'Организирање на папки';
-$labels['sortby'] = 'Уреди по';
-$labels['sortasc'] = 'Уреди по азбучен ред';
-$labels['sortdesc'] = 'Уреди опаѓачки';
-
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | language/mk/labels.inc                                                |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author:  Ivan Mishev - mishevivan@gmail.com                           |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$labels = array();\r
+$labels['welcome'] = 'Добредојдовте во $product';\r
+$labels['username'] = 'Корисничко Име';\r
+$labels['password'] = 'Лозинка';\r
+$labels['server'] = 'Сервер';\r
+$labels['login'] = 'Логирај Се';\r
+$labels['logout'] = 'Одлогирај Се';\r
+$labels['mail'] = 'Е-Маил';\r
+$labels['settings'] = 'Подесувања';\r
+$labels['addressbook'] = 'Именик';\r
+$labels['inbox'] = 'Пошта';\r
+$labels['drafts'] = 'Непратени';\r
+$labels['sent'] = 'Пратени';\r
+$labels['trash'] = 'Корпа';\r
+$labels['junk'] = 'Ѓубре';\r
+$labels['subject'] = 'Наслов';\r
+$labels['from'] = 'Праќач';\r
+$labels['to'] = 'Примач';\r
+$labels['cc'] = 'Копирај';\r
+$labels['bcc'] = 'Bcc';\r
+$labels['replyto'] = 'Препрати на';\r
+$labels['date'] = 'Дата';\r
+$labels['size'] = 'Големина';\r
+$labels['priority'] = 'Приоритет';\r
+$labels['organization'] = 'Организација';\r
+$labels['reply-to'] = 'Препрати на';\r
+$labels['mailboxlist'] = 'Папки';\r
+$labels['messagesfromto'] = '$count пораки од $from';\r
+$labels['messagenrof'] = '$nr порака од $count';\r
+$labels['moveto'] = 'Премести во...';\r
+$labels['download'] = 'сними';\r
+$labels['filename'] = 'Име на датотеката';\r
+$labels['filesize'] = 'Големина на датотеката';\r
+$labels['preferhtml'] = 'Прикажи во HTML';\r
+$labels['htmlmessage'] = 'HTML Порака';\r
+$labels['prettydate'] = 'Убави дати';\r
+$labels['addtoaddressbook'] = 'Додади во именик';\r
+$labels['sun'] = 'Нед';\r
+$labels['mon'] = 'Пон';\r
+$labels['tue'] = 'Вто';\r
+$labels['wed'] = 'Сре';\r
+$labels['thu'] = 'Чет';\r
+$labels['fri'] = 'Пет';\r
+$labels['sat'] = 'Саб';\r
+$labels['sunday'] = 'Недела';\r
+$labels['monday'] = 'Понеделник';\r
+$labels['tuesday'] = 'Вторник';\r
+$labels['wednesday'] = 'Среда';\r
+$labels['thursday'] = 'Четврток';\r
+$labels['friday'] = 'Петок';\r
+$labels['saturday'] = 'Сабота';\r
+$labels['today'] = 'Денес';\r
+$labels['checkmail'] = 'Провери пошта';\r
+$labels['writenewmessage'] = 'Нова порака';\r
+$labels['replytomessage'] = 'Одговори на пораката';\r
+$labels['replytoallmessage'] = 'Одговори на сите';\r
+$labels['forwardmessage'] = 'Препрати ја пораката';\r
+$labels['deletemessage'] = 'Премести ја пораката во Корпа';\r
+$labels['movemessagetotrash'] = 'Премести ги пораките во Канта';\r
+$labels['printmessage'] = 'За печатење';\r
+$labels['previousmessage'] = 'Прикажи ја претходната порака';\r
+$labels['previousmessages'] = 'Прикажи ги претходните пораки';\r
+$labels['firstmessage'] = 'Прикажи ја првата порака';\r
+$labels['firstmessages'] = 'Прикажи ги првите пораки';\r
+$labels['nextmessage'] = 'Прикажи ја наредната порака';\r
+$labels['nextmessages'] = 'Прикажи ги следните пораки';\r
+$labels['lastmessage'] = 'Прикажи ја последната порака';\r
+$labels['lastmessages'] = 'Прикажи ги последните пораки';\r
+$labels['backtolist'] = 'Врати се во поштенското сандаче';\r
+$labels['viewsource'] = 'Покажи го изворот на пракање';\r
+$labels['markmessages'] = 'Обележи ги пораките';\r
+$labels['markread'] = 'Како прочитани';\r
+$labels['markunread'] = 'Како непрочитани';\r
+$labels['select'] = 'Одбележи';\r
+$labels['all'] = 'Сите';\r
+$labels['none'] = 'Никоја';\r
+$labels['unread'] = 'Непрочитани';\r
+$labels['compact'] = 'Уредно';\r
+$labels['empty'] = 'Испразни';\r
+$labels['purge'] = 'Чистење';\r
+$labels['quota'] = 'Искористен простор';\r
+$labels['unknown'] = 'непознато';\r
+$labels['unlimited'] = 'неограничено';\r
+$labels['quicksearch'] = 'Брзо претражување';\r
+$labels['resetsearch'] = 'Ново претражување';\r
+$labels['compose'] = 'Нова порака';\r
+$labels['savemessage'] = 'Снимај ја пораката во Непратени';\r
+$labels['sendmessage'] = 'Прати ја пораката';\r
+$labels['addattachment'] = 'Прикачи фајл';\r
+$labels['charset'] = 'Charset';\r
+$labels['editortype'] = 'Тип на едитор';\r
+$labels['returnreceipt'] = 'Врати ';\r
+$labels['checkspelling'] = 'Провери спелување';\r
+$labels['resumeediting'] = 'Продолжи со уредување';\r
+$labels['revertto'] = 'Обрати се на';\r
+$labels['attachments'] = 'Прикачено';\r
+$labels['upload'] = 'Прикачи';\r
+$labels['close'] = 'Затвори';\r
+$labels['low'] = 'Низок';\r
+$labels['lowest'] = 'Најнизок';\r
+$labels['normal'] = 'Нормален';\r
+$labels['high'] = 'Висок';\r
+$labels['highest'] = 'Највисок';\r
+$labels['nosubject'] = '(нема тема)';\r
+$labels['showimages'] = 'Прикажи ги сликите';\r
+$labels['htmltoggle'] = 'HTML';\r
+$labels['plaintoggle'] = 'Обичен текст';\r
+$labels['addcc'] = 'Додај Cc';\r
+$labels['addbcc'] = 'Додај Bcc';\r
+$labels['addreplyto'] = 'Додај Одговори-На';\r
+$labels['mdnrequest'] = 'Праќачот на оваа порака сака да добие известување кога ќе ја прочитате пораката. Дали сакате да го известите?';\r
+$labels['receiptread'] = 'Извести (читај)';\r
+$labels['yourmessage'] = 'Ова е известување за вашата порака';\r
+$labels['receiptnote'] = 'Забелешка: Ова известување само потврдува дека пораката која сте ја пратиле е отворена. Не е гаранција дека примачот ја прочитал или ја разбрал истата.';\r
+$labels['name'] = 'Прикажано име';\r
+$labels['firstname'] = 'Име';\r
+$labels['surname'] = 'Презиме';\r
+$labels['email'] = 'Е-маил';\r
+$labels['addcontact'] = 'Додади го контактот';\r
+$labels['editcontact'] = 'Промени го контактот';\r
+$labels['edit'] = 'Промени';\r
+$labels['cancel'] = 'Откажи';\r
+$labels['save'] = 'Сними';\r
+$labels['delete'] = 'Избриши';\r
+$labels['newcontact'] = 'Додади ново име';\r
+$labels['deletecontact'] = 'Избриши ги следните имиња';\r
+$labels['composeto'] = 'Напиши порака';\r
+$labels['contactsfromto'] = '$count имиња $from до $to';\r
+$labels['print'] = 'Испечати';\r
+$labels['export'] = 'Извади како';\r
+$labels['previouspage'] = 'Прикажи претходна страна';\r
+$labels['firstpage'] = 'Прикажи ја првата страна';\r
+$labels['nextpage'] = 'Прикажи ја следната страна';\r
+$labels['lastpage'] = 'Прикажи ја последната страна';\r
+$labels['groups'] = 'Групи';\r
+$labels['personaladrbook'] = 'Адреси';\r
+$labels['settingsfor'] = 'Подесувања за';\r
+$labels['preferences'] = 'Подесувања';\r
+$labels['userpreferences'] = 'Кориснички подесувања';\r
+$labels['editpreferences'] = 'Промени ги корисничките подесувања';\r
+$labels['identities'] = 'Идентитети';\r
+$labels['manageidentities'] = 'Организирај ги идентитетите за овој корисник';\r
+$labels['newidentity'] = 'Нов идентитет';\r
+$labels['newitem'] = 'Нов објект';\r
+$labels['edititem'] = 'Промени објект';\r
+$labels['setdefault'] = 'Одбери за основно';\r
+$labels['language'] = 'Јазик';\r
+$labels['timezone'] = 'Временска зона';\r
+$labels['pagesize'] = 'Редови прикажани на страна';\r
+$labels['signature'] = 'Потпис';\r
+$labels['dstactive'] = 'Промени на времето';\r
+$labels['htmleditor'] = 'Создади HTML порака';\r
+$labels['htmlsignature'] = 'HTML потпис';\r
+$labels['previewpane'] = 'Прикажи го претходниот панел';\r
+$labels['autosavedraft'] = 'Авоматски снимај во Непратени';\r
+$labels['everynminutes'] = 'секои $n минути';\r
+$labels['never'] = 'никогаш';\r
+$labels['folder'] = 'Папка';\r
+$labels['folders'] = 'Папки';\r
+$labels['foldername'] = 'Име на папката';\r
+$labels['subscribed'] = 'Претплатен';\r
+$labels['messagecount'] = 'Пораки';\r
+$labels['create'] = 'Креирај';\r
+$labels['createfolder'] = 'Креирај нова папка';\r
+$labels['rename'] = 'Преименувај';\r
+$labels['renamefolder'] = 'Преименувај ја папката';\r
+$labels['deletefolder'] = 'Избриши ја папката';\r
+$labels['managefolders'] = 'Организирање на папки';\r
+$labels['sortby'] = 'Уреди по';\r
+$labels['sortasc'] = 'Уреди по азбучен ред';\r
+$labels['sortdesc'] = 'Уреди опаѓачки';\r
+\r
 ?>
\ No newline at end of file
index f20b7d9918efb105a915e431a1026f34fc93e9f8..15b664539327d08f13ba42c342eb2a98f0b9f383 100755 (executable)
@@ -1,74 +1,81 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | language/mk/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author:  Ivan Mishev - mishevivan@gmail.com                           |
- +-----------------------------------------------------------------------+
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'Неуспешна најава';
-$messages['cookiesdisabled'] = 'Вашиот прелистувач не прифаќа cookies';
-$messages['sessionerror'] = 'Сесијата е невалидна или е истечена';
-$messages['imaperror'] = 'Конектирањето со IMAP е неуспешно';
-$messages['nomessagesfound'] = 'Немате пораки во вашата пошта';
-$messages['loggedout'] = 'Успешно се одлогиравте. Благодариме!';
-$messages['mailboxempty'] = 'Поштенското сандаче е празно.';
-$messages['loading'] = 'Вчитувам...';
-$messages['loadingdata'] = 'Ги вчитувам податоците...';
-$messages['checkingmail'] = 'Проверување за нови пораки...';
-$messages['sendingmessage'] = 'Праќање на пораката...';
-$messages['messagesent'] = 'Пораката е успешно пратена';
-$messages['savingmessage'] = 'Пораката се снима...';
-$messages['messagesaved'] = 'Пораката е снимена во Непратени';
-$messages['successfullysaved'] = 'Успешно снимено';
-$messages['addedsuccessfully'] = 'Името е успешно додадено ви Именик';
-$messages['contactexists'] = 'Веќе постои име со зададената Е-маил адреса';
-$messages['blockedimages'] = 'За да се заштити вашата приватност, сликите во оваа порака не се прикажани.';
-$messages['encryptedmessage'] = 'Оваа порака е кодирана и неможе да се прикаже. Извинете!';
-$messages['nocontactsfound'] = 'Нема Имиња во Именикот.';
-$messages['contactnotfound'] = 'Бараното име не постои';
-$messages['sendingfailed'] = 'Пораката не е пратена';
-$messages['errorsaving'] = 'Грешка при снимањето';
-$messages['errormoving'] = 'Пораката неможе да се премести';
-$messages['errordeleting'] = 'Пораката неможе да се избрише';
-$messages['deletecontactconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) контакт(и)?';
-$messages['deletemessagesconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) порака(и)?';
-$messages['deletefolderconfirm'] = 'Дали сте сигурни дека сакате да ја избришете оваа папка?';
-$messages['purgefolderconfirm'] = 'Дали сте сигурни дека сакате да ги избршете сите пораки во оваа папка?';
-$messages['formincomplete'] = 'Имате изоставено непополнети информации';
-$messages['noemailwarning'] = 'Внесете валидна емаил адреса';
-$messages['nonamewarning'] = 'Внесете име';
-$messages['nopagesizewarning'] = 'Внесете ја големината на страната';
-$messages['norecipientwarning'] = 'Внесете барем еден примач';
-$messages['nosubjectwarning'] = 'Немате внесено „Наслов“. Дали сакате да внесете?';
-$messages['nobodywarning'] = 'Пораката нема текст во неа. Дали сакате да ја пратите?';
-$messages['notsentwarning'] = 'Пораката не е пратена. Дали сакате да ја откажете?';
-$messages['noldapserver'] = 'Изберете LDAP сервер за пребарување';
-$messages['nocontactsreturned'] = 'Не се најдени имиња';
-$messages['nosearchname'] = 'Внесете име или емаил адреса';
-$messages['searchsuccessful'] = '$nr пораки се најдени';
-$messages['searchnomatch'] = 'Претражувањето нема резлутати';
-$messages['searching'] = 'Пребарувам....';
-$messages['checking'] = 'Проверувам...';
-$messages['nospellerrors'] = 'Нема грешки во спелувањето';
-$messages['folderdeleted'] = 'Папката е успешно избришана';
-$messages['deletedsuccessfully'] = 'Успешно избришано';
-$messages['converting'] = 'Форматирањето на пораката е отстрането...';
-$messages['messageopenerror'] = 'Пораката неможе да се вчита од серверот';
-$messages['fileuploaderror'] = 'Прикачувањето е неуспешно';
-$messages['filesizeerror'] = 'Фајлот што се прикачува го изминува лимитот од $size';
-$messages['copysuccess'] = 'Успешно се копирани $nr имиња';
-$messages['copyerror'] = 'Неможе да се копираат адресите';
-$messages['sourceisreadonly'] = 'Изворот на оваа адреса неможе да се промени';
-$messages['errorsavingcontact'] = 'Името неможе да се сними';
-
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | language/mk/messages.inc                                              |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author:  Ivan Mishev - mishevivan@gmail.com                           |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed'] = 'Неуспешна најава';\r
+$messages['cookiesdisabled'] = 'Вашиот прелистувач не прифаќа cookies';\r
+$messages['sessionerror'] = 'Сесијата е невалидна или е истечена';\r
+$messages['imaperror'] = 'Конектирањето со IMAP е неуспешно';\r
+$messages['nomessagesfound'] = 'Немате пораки во вашата пошта';\r
+$messages['loggedout'] = 'Успешно се одлогиравте. Благодариме!';\r
+$messages['mailboxempty'] = 'Поштенското сандаче е празно.';\r
+$messages['loading'] = 'Вчитувам...';\r
+$messages['loadingdata'] = 'Ги вчитувам податоците...';\r
+$messages['checkingmail'] = 'Проверување за нови пораки...';\r
+$messages['sendingmessage'] = 'Праќање на пораката...';\r
+$messages['messagesent'] = 'Пораката е успешно пратена';\r
+$messages['savingmessage'] = 'Пораката се снима...';\r
+$messages['messagesaved'] = 'Пораката е снимена во Непратени';\r
+$messages['successfullysaved'] = 'Успешно снимено';\r
+$messages['addedsuccessfully'] = 'Името е успешно додадено ви Именик';\r
+$messages['contactexists'] = 'Веќе постои име со зададената Е-маил адреса';\r
+$messages['blockedimages'] = 'За да се заштити вашата приватност, сликите во оваа порака не се прикажани.';\r
+$messages['encryptedmessage'] = 'Оваа порака е кодирана и неможе да се прикаже. Извинете!';\r
+$messages['nocontactsfound'] = 'Нема Имиња во Именикот.';\r
+$messages['contactnotfound'] = 'Бараното име не постои';\r
+$messages['sendingfailed'] = 'Пораката не е пратена';\r
+$messages['errorsaving'] = 'Грешка при снимањето';\r
+$messages['errormoving'] = 'Пораката неможе да се премести';\r
+$messages['errordeleting'] = 'Пораката неможе да се избрише';\r
+$messages['deletecontactconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) контакт(и)?';\r
+$messages['deletemessagesconfirm'] = 'Дали сте сигурни дека сакате да го избришете обележаниот(те) порака(и)?';\r
+$messages['deletefolderconfirm'] = 'Дали сте сигурни дека сакате да ја избришете оваа папка?';\r
+$messages['purgefolderconfirm'] = 'Дали сте сигурни дека сакате да ги избршете сите пораки во оваа папка?';\r
+$messages['formincomplete'] = 'Имате изоставено непополнети информации';\r
+$messages['noemailwarning'] = 'Внесете валидна емаил адреса';\r
+$messages['nonamewarning'] = 'Внесете име';\r
+$messages['nopagesizewarning'] = 'Внесете ја големината на страната';\r
+$messages['norecipientwarning'] = 'Внесете барем еден примач';\r
+$messages['nosubjectwarning'] = 'Немате внесено „Наслов“. Дали сакате да внесете?';\r
+$messages['nobodywarning'] = 'Пораката нема текст во неа. Дали сакате да ја пратите?';\r
+$messages['notsentwarning'] = 'Пораката не е пратена. Дали сакате да ја откажете?';\r
+$messages['noldapserver'] = 'Изберете LDAP сервер за пребарување';\r
+$messages['nocontactsreturned'] = 'Не се најдени имиња';\r
+$messages['nosearchname'] = 'Внесете име или емаил адреса';\r
+$messages['searchsuccessful'] = '$nr пораки се најдени';\r
+$messages['searchnomatch'] = 'Претражувањето нема резлутати';\r
+$messages['searching'] = 'Пребарувам....';\r
+$messages['checking'] = 'Проверувам...';\r
+$messages['nospellerrors'] = 'Нема грешки во спелувањето';\r
+$messages['folderdeleted'] = 'Папката е успешно избришана';\r
+$messages['deletedsuccessfully'] = 'Успешно избришано';\r
+$messages['converting'] = 'Форматирањето на пораката е отстрането...';\r
+$messages['messageopenerror'] = 'Пораката неможе да се вчита од серверот';\r
+$messages['fileuploaderror'] = 'Прикачувањето е неуспешно';\r
+$messages['filesizeerror'] = 'Датотеката што се прикачува го изминува лимитот од $size';\r
+$messages['copysuccess'] = 'Успешно се копирани $nr имиња';\r
+$messages['copyerror'] = 'Неможе да се копираат адресите';\r
+$messages['sourceisreadonly'] = 'Изворот на оваа адреса неможе да се промени';\r
+$messages['errorsavingcontact'] = 'Името неможе да се сними';\r
+$messages['movingmessage'] = 'Пораката се преместува...';\r
+$messages['receiptsent'] = 'Известувањето е успешно пратено';\r
+$messages['errorsendingreceipt'] = 'Известувањето не е пратено';\r
+$messages['nodeletelastidentity'] = 'Овој идентитет неможе да се избрише, тој е последниот.';\r
+$messages['addsubfolderhint'] = 'Оваа папка ќе биде креирана како под-папка на селектираната.';\r
+\r
 ?>
\ No newline at end of file
index b511c7570d87a78950d3a35f73f7b68f734841e4..6be01bc1fc0dcbf3016652c9a9eea50fc54e72d6 100644 (file)
@@ -6,7 +6,7 @@
  | language/ms_MY/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
index 6cbd92b6ceb9bcfc7394b4ceb3c3dded9e9f89f0..d6c9fb1867f14d7064222b89d9bfee38fb866772 100644 (file)
@@ -3,10 +3,10 @@
 /*
 
  +-----------------------------------------------------------------------+
- | language/ms_MY/messages.inc                                              |
+ | language/ms_MY/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
index 1b46546d85129d2366d9bbc73f3ab9c4e4eac5c7..8e1b07ec87ff1ea6c2172fe385aa96c9fcbd1eba 100644 (file)
@@ -6,14 +6,15 @@
  | language/nb_NO/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | All rights reserved.                                                  |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Kjetil Waage - Nextline AS <kjetil@nextline.no>               |
+ | Author: Tor Erik Linnerud - JKLM <tel@jklm.no>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 553 2007-05-13 16:31:19Z thomasb $
+ @version $Id: labels.inc 1093 2008-02-16 11:40:18Z tomekp $
 
 */
 
@@ -29,9 +30,9 @@ $labels['settings'] = 'Personlige innstillinger';
 $labels['addressbook'] = 'Adressebok';
 $labels['inbox'] = 'Innboks';
 $labels['drafts'] = 'Kladder';
-$labels['sent'] = 'Sendt post';
+$labels['sent'] = 'Sendt';
 $labels['trash'] = 'Søppel';
-$labels['junk'] = 'Junk';
+$labels['junk'] = 'Spam';
 $labels['subject'] = 'Emne';
 $labels['from'] = 'Avsender';
 $labels['to'] = 'Mottaker';
@@ -51,7 +52,7 @@ $labels['download'] = 'last ned';
 $labels['filename'] = 'Filnavn';
 $labels['filesize'] = 'Filstørrelse';
 $labels['preferhtml'] = 'Foretrekk HTML';
-$labels['htmlmessage'] = 'HTML besked';
+$labels['htmlmessage'] = 'HTML-beskjed';
 $labels['prettydate'] = 'Pen datovisning';
 $labels['addtoaddressbook'] = 'Tilføy til adresseboken';
 $labels['sun'] = 'Søn';
@@ -71,14 +72,15 @@ $labels['saturday'] = 'Lørdag';
 $labels['today'] = 'I dag';
 $labels['checkmail'] = 'Sjekk for nye beskjeder';
 $labels['writenewmessage'] = 'Opprett en ny e-post';
-$labels['replytomessage'] = 'Svar på denne e-post';
+$labels['replytomessage'] = 'Svar på denne e-posten';
 $labels['replytoallmessage'] = 'Svar til alle mottakere';
-$labels['forwardmessage'] = 'Videresend denne e-post';
-$labels['deletemessage'] = 'Flytt e-posten til søppel';
-$labels['printmessage'] = 'Skriv ut denne e-post';
+$labels['forwardmessage'] = 'Videresend denne e-posten';
+$labels['deletemessage'] = 'Slett e-posten';
+$labels['movemessagetotrash'] = 'Flytt e-posten til søppel';
+$labels['printmessage'] = 'Skriv ut denne e-posten';
 $labels['previousmessage'] = 'Vis forrige melding';
 $labels['previousmessages'] = 'Vis forrige side';
-$labels['firstmessage'] = 'Vis første meldingen';
+$labels['firstmessage'] = 'Vis første melding';
 $labels['firstmessages'] = 'Vis første side med meldinger';
 $labels['nextmessage'] = 'Vis neste melding';
 $labels['nextmessages'] = 'Vis neste side';
@@ -86,6 +88,9 @@ $labels['lastmessage'] = 'Vis siste melding';
 $labels['lastmessages'] = 'Vis siste side med meldinger';
 $labels['backtolist'] = 'Tilbake til e-postlisten';
 $labels['viewsource'] = 'Vis kilde';
+$labels['markmessages'] = 'Merk e-postene';
+$labels['markread'] = 'som lest';
+$labels['markunread'] = 'som ulest';
 $labels['select'] = 'Velg';
 $labels['all'] = 'Alle';
 $labels['none'] = 'Ingen';
@@ -93,14 +98,14 @@ $labels['unread'] = 'Uleste';
 $labels['compact'] = 'Rydd opp';
 $labels['empty'] = 'Tøm';
 $labels['purge'] = 'Tøm';
-$labels['quota'] = 'Disk forbruk';
+$labels['quota'] = 'Plassforbruk';
 $labels['unknown'] = 'ukjent';
 $labels['unlimited'] = 'ubegrenset';
 $labels['quicksearch'] = 'Hurtigsøk';
 $labels['resetsearch'] = 'Nullstill søk';
-$labels['compose'] = 'Lag ny e-post';
-$labels['sendmessage'] = 'Send e-posten';
+$labels['compose'] = 'Skriv ny e-post';
 $labels['savemessage'] = 'Lagre kladd';
+$labels['sendmessage'] = 'Send e-posten';
 $labels['addattachment'] = 'Vedlegg';
 $labels['charset'] = 'Tegnsett';
 $labels['editortype'] = 'Format';
@@ -116,11 +121,18 @@ $labels['lowest'] = 'Lavest';
 $labels['normal'] = 'Normal';
 $labels['high'] = 'Høy';
 $labels['highest'] = 'Høyest';
-$labels['nosubject'] = '(ingen emne)';
+$labels['nosubject'] = '(intet emne)';
 $labels['showimages'] = 'Vis bilder';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Ren tekst';
-$labels['name'] = 'Vist navn';
+$labels['addcc'] = 'Legg til Cc';
+$labels['addbcc'] = 'Legg til Bcc';
+$labels['addreplyto'] = 'Legg til Reply-To';
+$labels['mdnrequest'] = 'Senderen av denne meldingen har bedt om å bli gjort oppmerksom på at denne meldingen er lest. Ønsker du å sende denne bekreftelsen?';
+$labels['receiptread'] = 'Kvittering (lest)';
+$labels['yourmessage'] = 'Dette er en kvittering for at din e-post er mottatt';
+$labels['receiptnote'] = 'Merknad: Denne kvitteringen bekrefter bare at e-posten ble vist hos mottakeren. Det er ingen garanti for at mottakeren har lest eller forstått innholdet i e-posten.';
+$labels['name'] = 'Visningsnavn';
 $labels['firstname'] = 'Fornavn';
 $labels['surname'] = 'Etternavn';
 $labels['email'] = 'E-post';
@@ -151,22 +163,23 @@ $labels['manageidentities'] = 'Administrer identitetene for denne kontoen';
 $labels['newidentity'] = 'Ny identitet';
 $labels['newitem'] = 'Nytt punkt';
 $labels['edititem'] = 'Rediger punkt';
-$labels['setdefault'] = 'Sett standard';
+$labels['setdefault'] = 'Sett som standard';
 $labels['language'] = 'Språk';
 $labels['timezone'] = 'Tidssone';
 $labels['pagesize'] = 'Linjer per side';
 $labels['signature'] = 'Signatur';
 $labels['dstactive'] = 'Sommertid';
-$labels['htmleditor'] = 'Bruk HTML editor';
-$labels['htmlsignature'] = 'HTML signatur';
+$labels['htmleditor'] = 'Bruk HTML-editor';
+$labels['htmlsignature'] = 'HTML-signatur';
 $labels['previewpane'] = 'Forhåndsvisning';
 $labels['autosavedraft'] = 'Autolagring av utkast';
-$labels['everynminutes'] = 'Hver $n minutt';
+$labels['everynminutes'] = 'Hvert $n. minutt';
 $labels['never'] = 'Aldri';
 $labels['folder'] = 'Mappe';
 $labels['folders'] = 'Mapper';
 $labels['foldername'] = 'Mappenavn';
 $labels['subscribed'] = 'Abonnere';
+$labels['messagecount'] = 'Meldinger';
 $labels['create'] = 'Opprett';
 $labels['createfolder'] = 'Lag ny mappe';
 $labels['rename'] = 'Endre navn';
index 0da3335d45a9d555a3676cb8dbaaa622c33c0250..2ea63a70c55f7b9480feccbd99911bde8f3c6b33 100644 (file)
@@ -6,23 +6,24 @@
  | language/nb_NO/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
- | All rights reserved.                                                  |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Kjetil Waage - Nextline AS <kjetil@nextline.no>               |
+ | Author: Tor Erik Linnerud - JKLM <tel@jklm.no>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 553 2007-05-13 16:31:19Z thomasb $
+ @version $Id: messages.inc 1093 2008-02-16 11:40:18Z tomekp $
 
 */
 
 $messages = array();
-$messages['loginfailed'] = 'Mislykket pålogging';
+$messages['loginfailed'] = 'Pålogging mislyktes';
 $messages['cookiesdisabled'] = 'Din nettleser aksepterer ikke cookies';
 $messages['sessionerror'] = 'Din session er ugyldig eller utløpt';
 $messages['imaperror'] = 'Forbindelsen til IMAP serveren sviktet';
-$messages['nomessagesfound'] = 'Det ble ikke funnet noen beskjeder i denne postkassen';
+$messages['nomessagesfound'] = 'Det ble ikke funnet noen beskjeder i denne innboksen';
 $messages['loggedout'] = 'Du er logget av webmail. Ha det bra!';
 $messages['mailboxempty'] = 'Postkassen er tom!';
 $messages['loading'] = 'Laster...';
@@ -34,7 +35,7 @@ $messages['savingmessage'] = 'Lagrer beskjed...';
 $messages['messagesaved'] = 'Beskjed er lagret i "kladder" mappen';
 $messages['successfullysaved'] = 'Lagret';
 $messages['addedsuccessfully'] = 'Kontakten ble tilføyd i adresseboken';
-$messages['contactexists'] = 'Der er allerede en kontakt med denne e-post adressen';
+$messages['contactexists'] = 'Der er allerede en kontakt med denne e-postadressen';
 $messages['blockedimages'] = 'Bilder fra eksterne servere er blokkert i denne e-posten.';
 $messages['encryptedmessage'] = 'Dette er en krypteret beskjed og kan ikke vises. Beklager!';
 $messages['nocontactsfound'] = 'Ingen kontakter ble funnet';
@@ -44,7 +45,7 @@ $messages['errorsaving'] = 'Det oppstod en feil ved lagring av data';
 $messages['errormoving'] = 'Kunne ikke flytte beskjeden';
 $messages['errordeleting'] = 'Kunne ikke slette beskjeden';
 $messages['deletecontactconfirm'] = 'Vil du virkelig slette valgte kontakt(er)?';
-$messages['deletemessagesconfirm'] = 'Vil du virkelig slette valgte meldingen(e)?';
+$messages['deletemessagesconfirm'] = 'Vil du virkelig slette de valgte meldingen(e)?';
 $messages['deletefolderconfirm'] = 'Vil du virkelig slette denne mappen?';
 $messages['purgefolderconfirm'] = 'Vil du virkelig slette alle meldingene i denne mappen?';
 $messages['formincomplete'] = 'Skjemaet var ikke fullstendig fylt ut';
@@ -57,7 +58,7 @@ $messages['nobodywarning'] = 'Send denne e-post uten tekst?';
 $messages['notsentwarning'] = 'E-posten ble ikke sendt. Vil du slette meldingen?';
 $messages['noldapserver'] = 'Venligst velg hvilken LDAP server det skal søkes i';
 $messages['nocontactsreturned'] = 'Ingen kontakter ble funnet';
-$messages['nosearchname'] = 'Venligst skriv inn kontaktens navn eller e-post adresse';
+$messages['nosearchname'] = 'Venligst skriv inn kontaktens navn eller e-postadresse';
 $messages['searchsuccessful'] = '$nr meldinger funnet';
 $messages['searchnomatch'] = 'Søket ga ingen resultater';
 $messages['searching'] = 'Søker...';
@@ -73,5 +74,10 @@ $messages['copysuccess'] = '$nr adresser ble kopiert';
 $messages['copyerror'] = 'Kunne ikke kopiere';
 $messages['sourceisreadonly'] = 'Denne adressekilden er skrivebeskyttet';
 $messages['errorsavingcontact'] = 'Kunne ikke lagre adressen';
+$messages['movingmessage'] = 'Flytter e-post...';
+$messages['receiptsent'] = 'Kvittering har blitt sent';
+$messages['errorsendingreceipt'] = 'Kunne ikke sende kvittering';
+$messages['nodeletelastidentity'] = 'Du kan ikke slette denne identiteten, det er din siste.';
+$messages['addsubfolderhint'] = 'Mappen vil bli opprettet som en undermappe av den nåværende valgte mappe';
 
 ?>
\ No newline at end of file
diff --git a/program/localization/ne/labels.inc b/program/localization/ne/labels.inc
new file mode 100644 (file)
index 0000000..1b1e899
--- /dev/null
@@ -0,0 +1,178 @@
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | localization/ne/labels.inc                                            |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Nepali Translation by:                                                |\r
+ | Prasanna Singh <prasanna@bhunet.com>, <prasanna@bhunet.com>           |\r
+ | RoundCubeAuthor: Thomas Bruederli <roundcube@gmail.com>               |\r
+ +-----------------------------------------------------------------------+\r
+*/\r
+\r
+$labels = array();\r
+$labels['welcome'] = '$product मा स्वागत छ';\r
+$labels['username'] = 'युसरनेम';\r
+$labels['password'] = 'पासवर्ड';\r
+$labels['server'] = 'सर्भर';\r
+$labels['login'] = 'लगईन';\r
+$labels['logout'] = 'लगआउट';\r
+$labels['mail'] = 'ई-मेल';\r
+$labels['settings'] = 'व्यक्तिगत रोजाईहरु';\r
+$labels['addressbook'] = 'ठेगाना किताब';\r
+$labels['inbox'] = 'इनबक्स';\r
+$labels['drafts'] = 'ड्राफ्ट';\r
+$labels['sent'] = 'पठईएका मेलहरु';\r
+$labels['trash'] = 'रद्दी टोकरी';\r
+$labels['junk'] = 'स्पाम';\r
+$labels['subject'] = 'विषय';\r
+$labels['from'] = 'प्रेषक';\r
+$labels['to'] = 'प्रापक';\r
+$labels['cc'] = 'कार्बन कपि';\r
+$labels['bcc'] = 'अंधो कार्बन कपि';\r
+$labels['replyto'] = 'पुन: जवाब';\r
+$labels['date'] = 'तारिख';\r
+$labels['size'] = 'नाप';\r
+$labels['priority'] = 'मेलको प्राथमिकता';\r
+$labels['organization'] = 'संस्था';\r
+$labels['reply-to'] = 'पुन: जवाब';\r
+$labels['mailboxlist'] = 'फोलडर';\r
+$labels['messagesfromto'] = 'मेलहरु $from बाट $to सम्म, $count मध्यबाट';\r
+$labels['messagenrof'] = '$nr नम्बर मेल, $count मध्यबाट';\r
+$labels['moveto'] = 'सार्नुहोस...';\r
+$labels['download'] = 'डाऊनलोड';\r
+$labels['filename'] = 'फाईलको नाम';\r
+$labels['filesize'] = 'फाईलको नाप';\r
+$labels['preferhtml'] = 'ऐच-टी-ऐम-ऐल(HTML) देखाउनुहोस';\r
+$labels['htmlmessage'] = 'ऐच-टी-ऐम-ऐल (HTML) रूपका मेल';\r
+$labels['prettydate'] = 'सुन्दर तारिख';\r
+$labels['addtoaddressbook'] = 'ठेगाना पुस्तिकामा जोड्नुहोस';\r
+$labels['sun'] = 'आइत';\r
+$labels['mon'] = 'सोम';\r
+$labels['tue'] = 'मंगल';\r
+$labels['wed'] = 'बुध';\r
+$labels['thu'] = 'विहि';\r
+$labels['fri'] = 'शुक';\r
+$labels['sat'] = 'शनि';\r
+$labels['sunday'] = 'आइतवार';\r
+$labels['monday'] = 'सोमवार';\r
+$labels['tuesday'] = 'मंगलवार';\r
+$labels['wednesday'] = 'बुधवार';\r
+$labels['thursday'] = 'विहिवार';\r
+$labels['friday'] = 'शुक्रवार';\r
+$labels['saturday'] = 'शनिवार';\r
+$labels['today'] = 'आज';\r
+$labels['checkmail'] = 'नया मेल खोज्नुहोस';\r
+$labels['writenewmessage'] = 'नया मेल लेखनुहोस';\r
+$labels['replytomessage'] = 'मेलको जवाफ दिनुहोस';\r
+$labels['replytoallmessage'] = 'प्रेषक लगायत सबैलाई जवाफ दिनुहोस';\r
+$labels['forwardmessage'] = 'मेल अगाडि पठाउनुहोस';\r
+$labels['deletemessage'] = 'रद्दी टोकरीमा सार्नुहोस';\r
+$labels['printmessage'] = 'मेल छाप्नुहोस';\r
+$labels['previousmessage'] = 'पछाडिको मेल देखाउनुहोस';\r
+$labels['previousmessages'] = 'पछाडिको मेलका सेटहरु देखाउनुहोस';\r
+$labels['firstmessage'] = 'पहलो मेल देखाउनुहोस';\r
+$labels['firstmessages'] = 'पहलो मेलका सेटहरु देखाउनुहोस';\r
+$labels['nextmessage'] = 'अगाडिको मेल देखाउनुहोस';\r
+$labels['nextmessages'] = 'अगाडिको मेलका सेटहरु देखाउनुहोस';\r
+$labels['lastmessage'] = 'अन्तिम मेल देखाउनुहोस';\r
+$labels['lastmessages'] = 'अन्तिम मेलका सेटहरु देखाउनुहोस';\r
+$labels['backtolist'] = 'मेल सूची देखाउनुहोस';\r
+$labels['viewsource'] = 'श्रोत देखाउनुहोस';\r
+$labels['select'] = 'चुन्नुहोस';\r
+$labels['all'] = 'सबै |';\r
+$labels['none'] = 'हैन';\r
+$labels['unread'] = 'नपढिएका |';\r
+$labels['compact'] = 'छोटो गर्नुहोस';\r
+$labels['empty'] = 'खाली गर्ने';\r
+$labels['purge'] = 'नाम निशाना मेटाउनुहोस';\r
+$labels['quota'] = 'डिस्कको उपभोग';\r
+$labels['unknown'] = 'अज्ञात';\r
+$labels['unlimited'] = 'अनगिन्ति';\r
+$labels['quicksearch'] = 'स्फुर्ति खोज';\r
+$labels['resetsearch'] = 'पन: खोज';\r
+$labels['compose'] = 'मेल लखन गर्नुहोस';\r
+$labels['sendmessage'] = 'तुरुन्तै मेल पठाउनुहोस';\r
+$labels['savemessage'] = 'ड्राफ्ट जोगाउनुहोस';\r
+$labels['addattachment'] = 'फाइल टाँस्नुहोस';\r
+$labels['charset'] = 'क्यारेक्टर सेट';\r
+$labels['editortype'] = 'सम्पादकको प्रकार';\r
+$labels['returnreceipt'] = 'फिर्ति रसीद';\r
+$labels['checkspelling'] = 'हिज्जे जाँच';\r
+$labels['resumeediting'] = 'पुन: सम्पादन गर्नुहोस';\r
+$labels['revertto'] = 'पहिलेको स्थितीमा जानुहोस';\r
+$labels['attachments'] = 'टाँसिएका फाईलहरु';\r
+$labels['upload'] = 'अपलोड';\r
+$labels['close'] = 'बन्द';\r
+$labels['low'] = 'कम';\r
+$labels['lowest'] = 'सबै भन्दा कम';\r
+$labels['normal'] = 'साधारण';\r
+$labels['high'] = 'उच्च';\r
+$labels['highest'] = 'उच्चतम';\r
+$labels['nosubject'] = '(बिना विषयको)';\r
+$labels['showimages'] = 'चित्र देखाउनुहोस';\r
+$labels['htmltoggle'] = 'ऐच-टी-ऐम-एल (HTML)';\r
+$labels['plaintoggle'] = 'सादा अक्षर';\r
+$labels['name'] = 'देखाउने नाम';\r
+$labels['firstname'] = 'पहिलो नाम';\r
+$labels['surname'] = 'थर';\r
+$labels['email'] = 'ई-मेल';\r
+$labels['addcontact'] = 'नया सम्पर्क जोड्नुहोस';\r
+$labels['editcontact'] = 'सम्पर्क सच्याउनुहोस';\r
+$labels['edit'] = 'सच्याउनुहोस';\r
+$labels['cancel'] = 'खारेज गर्नुहोस';\r
+$labels['save'] = 'जोगाउनुहोस';\r
+$labels['delete'] = 'मेटाउनुहोस';\r
+$labels['newcontact'] = 'नया सम्पर्क कार्ड बनाउनुहोस';\r
+$labels['deletecontact'] = 'छानिएका सम्पर्कहरु मेटाउनुहोस';\r
+$labels['composeto'] = 'मेल लेखी पठाउनुहोस';\r
+$labels['contactsfromto'] = 'सम्पर्कहरु $from बाट $to सम्म, $count मध्यबाट';\r
+$labels['print'] = 'छाप्नुहोस';\r
+$labels['export'] = 'ऐक्स्पोर्ट गर्नुहोस';\r
+$labels['previouspage'] = 'पहिलेको सेट देखाउनुहोस';\r
+$labels['firstpage'] = 'पहिलो सेट देखाउनुहोस';\r
+$labels['nextpage'] = 'अर्को सेट देखाउनुहोस';\r
+$labels['lastpage'] = 'अन्तिम सेट देखाउनुहोस';\r
+$labels['groups'] = 'समूहहरु';\r
+$labels['personaladrbook'] = 'व्यक्तिगत ठेगानाहरु';\r
+$labels['settingsfor'] = 'तय';\r
+$labels['preferences'] = 'रोजाइहरु';\r
+$labels['userpreferences'] = 'यूसरका रोजाइहरु';\r
+$labels['editpreferences'] = 'यूसरका रोजाइहर सम्पादन गर्नुहोस';\r
+$labels['identities'] = 'पहिचानहरु';\r
+$labels['manageidentities'] = 'यो खाताको पहिचानहरको व्यवस्था गर्नुहोस';\r
+$labels['newidentity'] = 'नया पहिचान';\r
+$labels['newitem'] = 'नया प्रकार';\r
+$labels['edititem'] = 'प्रकार सम्पादन गर्नुहोस';\r
+$labels['setdefault'] = 'तय गर्नुहोस';\r
+$labels['language'] = 'भाषा';\r
+$labels['timezone'] = 'समय क्षेत्र';\r
+$labels['pagesize'] = 'हरेक पन्नामा यति';\r
+$labels['signature'] = 'हस्ताक्षर';\r
+$labels['dstactive'] = 'प्रकाश बचाव';\r
+$labels['htmleditor'] = 'ऐच-टी-ऐम-एल (HTML) मेल लखन गर्नुहोस';\r
+$labels['htmlsignature'] = 'ऐच-टी-ऐम-एल (HTML) हस्ताक्षर';\r
+$labels['previewpane'] = 'पूर्व दृष्य देखाउनुहोस';\r
+$labels['autosavedraft'] = 'स्वत ड्राफ्ट जोगाउनुहोस';\r
+$labels['everynminutes'] = 'प्रत्येक $n मिनटमा';\r
+$labels['never'] = 'काहिलै नहुने';\r
+$labels['folder'] = 'फोल्डर';\r
+$labels['folders'] = 'फोल्डरहरु';\r
+$labels['foldername'] = 'फोल्डरको नाम';\r
+$labels['subscribed'] = 'सबस्क्राईब गरियो';\r
+$labels['create'] = 'बनाउनुहोस';\r
+$labels['createfolder'] = 'नया फोलडर बनाउनुहोस';\r
+$labels['rename'] = 'नाम बदल्नुहोस';\r
+$labels['renamefolder'] = 'फोलडरको नाम बदल्नुहोस';\r
+$labels['deletefolder'] = 'फोलडर मेट्नुहोस';\r
+$labels['managefolders'] = 'फोलडर व्यवस्थित गर्नुहोस';\r
+$labels['sortby'] = 'यसरी तय गर्नुहोस';\r
+$labels['sortasc'] = 'पहिलो देखि अन्तिम सम्म तय गर्नुहोस';\r
+$labels['sortdesc'] = 'अन्तिम देखि पहिलो सम्म तय गर्नुहोस';\r
+\r
+?>\r
diff --git a/program/localization/ne/messages.inc b/program/localization/ne/messages.inc
new file mode 100644 (file)
index 0000000..bd28199
--- /dev/null
@@ -0,0 +1,75 @@
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | localization/ne/messages.inc                                          |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2007, RoundCube Dev. - Switzerland                      |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Nepali Translation by:                                                |\r
+ | Prasanna Singh <prasanna@bhunet.com>, <prasanna@bhunet.com>           |\r
+ | RoundCubeAuthor: Thomas Bruederli <roundcube@gmail.com>               |\r
+ +-----------------------------------------------------------------------+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed'] = 'लागईन हुन पाएन';\r
+$messages['cookiesdisabled'] = 'तपाईको ब्राऊसरले कुकी स्वीकार गारिरहेको छैन';\r
+$messages['sessionerror'] = 'सत्र समाप्त वा अवैद्य';\r
+$messages['imaperror'] = 'सर्वर संग सम्पर्क हुन पाएन';\r
+$messages['nomessagesfound'] = 'यो मेलबक्स मा कुनै मेल छैन';\r
+$messages['loggedout'] = 'सत्र समाप्त । नमास्कार!';\r
+$messages['mailboxempty'] = 'मेल बक्स खाली छ';\r
+$messages['loading'] = 'लोड भईरहेको छ...';\r
+$messages['loadingdata'] = 'डाटा लोड भईरहेको छै...';\r
+$messages['checkingmail'] = 'नया मेलको खोजी भईरहेको छ...';\r
+$messages['sendingmessage'] = 'मेल पठाईदै रहेको छ...';\r
+$messages['messagesent'] = 'मेल सफल्तापूर्वक पठाईयो';\r
+$messages['savingmessage'] = 'मेल जोगाईदै छ...';\r
+$messages['messagesaved'] = 'मेल ड्राफ्ट फोल्डरमा जोगाईयो';\r
+$messages['successfullysaved'] = 'सफल्तापूर्वक जोगाईयो';\r
+$messages['addedsuccessfully'] = 'सम्पर्क पुस्तिकामा सफल्तापूर्वक सम्पर्क प्रविष्ट गारियो';\r
+$messages['contactexists'] = 'यो ई-मेल पहिलै लिईसकिएको छ';\r
+$messages['blockedimages'] = 'तपाईको प्राईवेसी को लागि तथा अन्य स्पामबाट बच्नकोलागि यो मेलमा चित्रहुरु देखाईएका छैनन्।';\r
+$messages['encryptedmessage'] = 'माफ गर्नुहोसे, यो मेल ईन्क्रिफ्ट गरिएको रूपमा छ, त्यसैले देखाउन सकिदैन!';\r
+$messages['nocontactsfound'] = 'कुनै सम्पर्क भेटिएन';\r
+$messages['contactnotfound'] = 'अनुरोध गारिएको सम्पर्क भेटिएन';\r
+$messages['sendingfailed'] = 'मेल पठाउन सकिएन';\r
+$messages['errorsaving'] = 'जोगाउदा-जोगाउदै गडबड भायो';\r
+$messages['errormoving'] = 'मेल सार्न सकिएन';\r
+$messages['errordeleting'] = 'मेल मेटाउन सकिएन';\r
+$messages['deletecontactconfirm'] = 'तापाईले छान्नुभएको सम्पर्कहरु, साँचै मेट्न चहानुहुन्छ?';\r
+$messages['deletemessagesconfirm'] = 'तापाईले छान्नु भएको मेलहरु, साँचै मेट्न चहानुहुन्छ?';\r
+$messages['deletefolderconfirm'] = 'तापाईले साँचै यो फोल्डर मेट्न चहानु हुन्छ?';\r
+$messages['purgefolderconfirm'] = 'तापाईले साँचै यो फोल्डरमा भएका सबै मेलहरु मेट्न चहानुहुन्छ?';\r
+$messages['formincomplete'] = 'फर्म पूर्ण रुपमा भरिएको छैन';\r
+$messages['noemailwarning'] = 'कृपया वैद्य ई-मेल भर्नुहोस';\r
+$messages['nonamewarning'] = 'कृपया नाम भर्नुहोस';\r
+$messages['nopagesizewarning'] = 'कृपया पन्नाको नाप भर्नुहोस';\r
+$messages['norecipientwarning'] = 'कृपया कम-से-कम एउटा प्रापकको विवरण भर्नुहोस';\r
+$messages['nosubjectwarning'] = 'मेलको कुनै विषय तोकिएको छैनै। केहि तोक्न चहानुहुन्छ ?';\r
+$messages['nobodywarning'] = 'बिना केहि लेखि पठाउने?';\r
+$messages['notsentwarning'] = 'मेल पठएको छैन.. मेल रद्द गर्न चहानुहुन्छ?';\r
+$messages['noldapserver'] = 'कृपया खोजको निम्ति एउटा ऐलडाप सर्वर छान्नहोस';\r
+$messages['nocontactsreturned'] = 'कुनै सम्पर्क फेला परेनन्';\r
+$messages['nosearchname'] = 'कृपया सम्पर्कको नाम या ई-मेल भर्नुहोस';\r
+$messages['searchsuccessful'] = '$nr मेलहरु पाइयो';\r
+$messages['searchnomatch'] = 'खोज असफल रहयो';\r
+$messages['searching'] = 'खोजि भईरहेको छ...';\r
+$messages['checking'] = 'जाँच भईरहेको छ...';\r
+$messages['nospellerrors'] = 'कुनै गलत हिज्जे फेला परेनन्';\r
+$messages['folderdeleted'] = 'फोल्डर सफल्तापूर्वक मेटियो';\r
+$messages['deletedsuccessfully'] = 'सफल्तापूर्वक मेटियो';\r
+$messages['converting'] = 'मेलबाट फोर्माटिङ हटाईदै छ...';\r
+$messages['messageopenerror'] = 'सर्वरबाट मेल लोड हुन सकेन';\r
+$messages['fileuploaderror'] = 'फाईल अपलोड हुन असफल';\r
+$messages['filesizeerror'] = 'अपलोड गरिएको फाईल हद $size भन्दा ठूलो छ';\r
+$messages['copysuccess'] = 'सफल्तापूर्वक $nr ठेगानाहरु उतारियो';\r
+$messages['copyerror'] = 'कुनै पनि ठेगानाहरु उतार्न सकिएन';\r
+$messages['sourceisreadonly'] = 'यो ठेगाना को श्रोत पढ्नको लागि मात्र उपलब्ध छ';\r
+$messages['errorsavingcontact'] = 'स्मपर्कको ठेगाना जोगाउन सकिएन';\r
+\r
+?>\r
diff --git a/program/localization/nl_BE/labels.inc b/program/localization/nl_BE/labels.inc
new file mode 100644 (file)
index 0000000..b69e5f0
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/nl_BE/labels.inc                                             |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Dennis Heeren <dennis.heeren@gmail.com>                       |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 1108 2008-02-17 20:08:44Z thomasb $
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Welkom bij $product';
+$labels['username'] = 'Gebruikersnaam';
+$labels['password'] = 'Wachtwoord';
+$labels['server'] = 'Server';
+$labels['login'] = 'Aanmelden';
+$labels['logout'] = 'Afmelden';
+$labels['mail'] = 'Berichten';
+$labels['settings'] = 'Instellingen';
+$labels['addressbook'] = 'Contactpersonen';
+$labels['inbox'] = 'Postvak IN';
+$labels['drafts'] = 'Concepten';
+$labels['sent'] = 'Verzonden berichten';
+$labels['trash'] = 'Prullenbak';
+$labels['junk'] = 'Spam';
+$labels['subject'] = 'Onderwerp';
+$labels['from'] = 'Van';
+$labels['to'] = 'Aan';
+$labels['cc'] = 'Cc';
+$labels['bcc'] = 'Bcc';
+$labels['replyto'] = 'Antwoorden aan';
+$labels['date'] = 'Datum';
+$labels['size'] = 'Grootte';
+$labels['priority'] = 'Prioriteit';
+$labels['organization'] = 'Organisatie';
+$labels['reply-to'] = 'Antwoorden aan';
+$labels['mailboxlist'] = 'Mappen';
+$labels['messagesfromto'] = 'Berichten $from - $to van $count';
+$labels['messagenrof'] = 'Bericht $nr van $count';
+$labels['moveto'] = 'verplaats naar...';
+$labels['download'] = 'downloaden';
+$labels['filename'] = 'Bestandsnaam';
+$labels['filesize'] = 'Bestandsgrootte';
+$labels['preferhtml'] = 'Gebruik HTML-opmaak';
+$labels['htmlmessage'] = 'HTML-bericht';
+$labels['prettydate'] = 'Uitgebreide datumweergave';
+$labels['addtoaddressbook'] = 'Voeg toe aan lijst met contactpersonen';
+$labels['sun'] = 'Zo';
+$labels['mon'] = 'Ma';
+$labels['tue'] = 'Di';
+$labels['wed'] = 'Wo';
+$labels['thu'] = 'Do';
+$labels['fri'] = 'Vr';
+$labels['sat'] = 'Za';
+$labels['sunday'] = 'Zondag';
+$labels['monday'] = 'Maandag';
+$labels['tuesday'] = 'Dinsdag';
+$labels['wednesday'] = 'Woensdag';
+$labels['thursday'] = 'Donderdag';
+$labels['friday'] = 'Vrijdag';
+$labels['saturday'] = 'Zaterdag';
+$labels['today'] = 'Vandaag';
+$labels['checkmail'] = 'Controleer op nieuwe berichten';
+$labels['writenewmessage'] = 'Nieuw bericht';
+$labels['replytomessage'] = 'Beantwoorden';
+$labels['replytoallmessage'] = 'Allen beantwoorden';
+$labels['forwardmessage'] = 'Doorsturen';
+$labels['deletemessage'] = 'Dit bericht verwijderen';
+$labels['movemessagetotrash'] = 'Verplaats bericht naar verwijderde items';
+$labels['printmessage'] = 'Afdrukken';
+$labels['previousmessage'] = 'Vorig bericht';
+$labels['previousmessages'] = 'Vorige berichten';
+$labels['firstmessage'] = 'Eerste bericht';
+$labels['firstmessages'] = 'Eerste berichten';
+$labels['nextmessage'] = 'Volgende bericht';
+$labels['nextmessages'] = 'Volgende berichten';
+$labels['lastmessage'] = 'Laatste bericht';
+$labels['lastmessages'] = 'Laatste berichten';
+$labels['backtolist'] = 'Terug naar berichtenlijst';
+$labels['viewsource'] = 'Broncode bericht weergeven';
+$labels['markmessages'] = 'Markeer berichten';
+$labels['markread'] = 'Als gelezen';
+$labels['markunread'] = 'Als ongelezen';
+$labels['select'] = 'Selecteren';
+$labels['all'] = 'Alles';
+$labels['none'] = 'Geen';
+$labels['unread'] = 'Ongelezen';
+$labels['compact'] = 'Comprimeren';
+$labels['empty'] = 'Legen';
+$labels['purge'] = 'Opruimen';
+$labels['quota'] = 'Gebruikte schijfruimte';
+$labels['unknown'] = 'onbekend';
+$labels['unlimited'] = 'ongelimiteerd';
+$labels['quicksearch'] = 'Snelzoeken';
+$labels['resetsearch'] = 'Zoek opnieuw';
+$labels['compose'] = 'Nieuw bericht opstellen';
+$labels['savemessage'] = 'Bewaar als concept';
+$labels['sendmessage'] = 'Verzenden';
+$labels['addattachment'] = 'Bestand toevoegen als bijlage';
+$labels['charset'] = 'Karakterset';
+$labels['editortype'] = 'Opmaak';
+$labels['returnreceipt'] = 'Ontvangstbevestiging';
+$labels['checkspelling'] = 'Controleer spelling';
+$labels['resumeediting'] = 'Hervat bewerken';
+$labels['revertto'] = 'Ongedaan maken';
+$labels['attachments'] = 'Bijlagen';
+$labels['upload'] = 'Toevoegen';
+$labels['close'] = 'Sluiten';
+$labels['low'] = 'Laag';
+$labels['lowest'] = 'Laagste';
+$labels['normal'] = 'Normaal';
+$labels['high'] = 'Hoog';
+$labels['highest'] = 'Hoogste';
+$labels['nosubject'] = '(geen onderwerp)';
+$labels['showimages'] = 'Toon afbeeldingen';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Platte tekst';
+$labels['addcc'] = 'Cc toevoegen';
+$labels['addbcc'] = 'Bcc toevoegen';
+$labels['addreplyto'] = 'Antwoorden aan toevoegen';
+$labels['mdnrequest'] = 'De afzender heeft een ontvangstbevestiging gevraagd. Wilt u deze versturen?';
+$labels['receiptread'] = 'Ontvangstbevestiging (gelezen)';
+$labels['yourmessage'] = 'Dir is een onvangstbevestiging voor uw bericht';
+$labels['receiptnote'] = 'Opmerking: deze ontvangstbevestiging houdt enkel in dat het bericht was weergegeven bij de ontvanger. Er is geen garantie dat de ontvanger het bericht daadwerkelijk heeft gelezen en/of begrepen.';
+$labels['name'] = 'Naam';
+$labels['firstname'] = 'Voornaam';
+$labels['surname'] = 'Achternaam';
+$labels['email'] = 'E-mailadres';
+$labels['addcontact'] = 'Geselecteerde contactpersoon toevoegen';
+$labels['editcontact'] = 'Contactpersoon bewerken';
+$labels['edit'] = 'Bewerken';
+$labels['cancel'] = 'Annuleren';
+$labels['save'] = 'Opslaan';
+$labels['delete'] = 'Verwijderen';
+$labels['newcontact'] = 'Contactpersoon toevoegen';
+$labels['deletecontact'] = 'Verwijder geselecteerde contactpersonen';
+$labels['composeto'] = 'Mail sturen aan';
+$labels['contactsfromto'] = 'Contactpersonen $from - $to van $count';
+$labels['print'] = 'Afdrukken';
+$labels['export'] = 'Exporteren';
+$labels['previouspage'] = 'Toon vorige';
+$labels['firstpage'] = 'Toon eerste';
+$labels['nextpage'] = 'Toon volgende';
+$labels['lastpage'] = 'Toon laatste';
+$labels['groups'] = 'Groepen';
+$labels['personaladrbook'] = 'Personlijke adressen';
+$labels['settingsfor'] = 'Instellingen voor';
+$labels['preferences'] = 'Voorkeuren';
+$labels['userpreferences'] = 'Gebruikersvoorkeuren';
+$labels['editpreferences'] = 'Gebruikersvoorkeuren bewerken';
+$labels['identities'] = 'Identiteiten';
+$labels['manageidentities'] = 'Beheer de identiteiten voor deze gebruiker';
+$labels['newidentity'] = 'Nieuwe identiteit';
+$labels['newitem'] = 'Nieuw';
+$labels['edititem'] = 'Bewerken';
+$labels['setdefault'] = 'Als standaard instellen';
+$labels['language'] = 'Taal';
+$labels['timezone'] = 'Tijdzone';
+$labels['pagesize'] = 'Berichten per pagina';
+$labels['signature'] = 'Handtekening';
+$labels['dstactive'] = 'Zomer/wintertijd';
+$labels['htmleditor'] = 'HTML berichten opmaken';
+$labels['htmlsignature'] = 'HTML handtekening';
+$labels['previewpane'] = 'Toon voorbeeldvenster';
+$labels['autosavedraft'] = 'Automatisch als concept opslaan';
+$labels['everynminutes'] = 'elke $n minuten';
+$labels['never'] = 'nooit';
+$labels['folder'] = 'Map';
+$labels['folders'] = 'Mappen';
+$labels['foldername'] = 'Naam';
+$labels['subscribed'] = 'Gebruiken';
+$labels['messagecount'] = 'Berichten';
+$labels['create'] = 'Aanmaken';
+$labels['createfolder'] = 'Nieuwe map aanmaken';
+$labels['rename'] = 'Hernoemen';
+$labels['renamefolder'] = 'Hernoem map';
+$labels['deletefolder'] = 'Map verwijderen';
+$labels['managefolders'] = 'Mappen beheren';
+$labels['sortby'] = 'Sorteren op';
+$labels['sortasc'] = 'Oplopend sorteren';
+$labels['sortdesc'] = 'Aflopend sorteren';
+
+?>
diff --git a/program/localization/nl_BE/messages.inc b/program/localization/nl_BE/messages.inc
new file mode 100644 (file)
index 0000000..aba3010
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/nl_BE/messages.inc                                           |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Dennis Heeren <dennis.heeren@gmail.com>                       |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 1108 2008-02-17 20:08:44Z thomasb $
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Aanmelden mislukt...';
+$messages['cookiesdisabled'] = 'Uw browser accepteert geen cookies...';
+$messages['sessionerror'] = 'Sessie is reeds beëindigd of is ongeldig...';
+$messages['imaperror'] = 'Kon geen verbinding maken met de IMAP server...';
+$messages['nomessagesfound'] = 'Er zijn geen berichten in deze map...';
+$messages['loggedout'] = 'U bent nu afgemeld. Tot ziens!';
+$messages['mailboxempty'] = 'Mailbox is leeg...';
+$messages['loading'] = 'Bezig met ophalen gegevens...';
+$messages['loadingdata'] = 'Bezig met gegevens ophalen...';
+$messages['checkingmail'] = 'Controleer op nieuwe berichten...';
+$messages['sendingmessage'] = 'Bericht wordt verstuurd...';
+$messages['messagesent'] = 'Het bericht is verzonden...';
+$messages['savingmessage'] = 'Bericht wordt bewaard...';
+$messages['messagesaved'] = 'Bericht bewaard in Concepten';
+$messages['successfullysaved'] = 'Succesvol opgeslagen...';
+$messages['addedsuccessfully'] = 'Contactpersoon is toegevoegd...';
+$messages['contactexists'] = 'Er bestaat reeds een contactpersoon met dit e-mailadres...';
+$messages['blockedimages'] = 'Om uw privacy te beschermen worden de afbeeldingen in dit bericht niet getoond...';
+$messages['encryptedmessage'] = 'Dit bericht is geëncrypteerd en kan niet worden weergegeven, sorry...';
+$messages['nocontactsfound'] = 'Geen contactpersonen gevonden...';
+$messages['contactnotfound'] = 'De gevraagde contactpersoon was niet gevonden';
+$messages['sendingfailed'] = 'Kon het bericht niet versturen...';
+$messages['errorsaving'] = 'Er is een fout opgetreden bij het opslaan van het bericht...';
+$messages['errormoving'] = 'Kon het bericht niet verplaatsen...';
+$messages['errordeleting'] = 'Kon het bericht niet verwijderen...';
+$messages['deletecontactconfirm'] = 'Bent u zeker dat u de geselecteerde contactpers(o)on(en) wilt verwijderen?';
+$messages['deletemessagesconfirm'] = 'Bent u zeker dat u de geselecteerde bericht(en) wilt verwijderen?';
+$messages['deletefolderconfirm'] = 'Weet u zeker dat u deze map wilt verwijderen?';
+$messages['purgefolderconfirm'] = 'Bent u zeker dat u alle berichten in deze map wilt verwijderen?';
+$messages['formincomplete'] = 'Het formulier is niet volledig ingevuld...';
+$messages['noemailwarning'] = 'Geef een geldig e-mailadres op...';
+$messages['nonamewarning'] = 'Geef een naam op...';
+$messages['nopagesizewarning'] = 'Geef een geldig aantal berichten per pagina op...';
+$messages['norecipientwarning'] = 'Geef minstens één bestemmeling op...';
+$messages['nosubjectwarning'] = 'Geen onderwerp opgegeven. Wenst u alsnog een onderwerp te geven?';
+$messages['nobodywarning'] = 'Wilt u dit lege bericht versturen?';
+$messages['notsentwarning'] = 'Het bericht is niet verzonden. Wilt u het bericht verwijderen?';
+$messages['noldapserver'] = 'Kies een LDAP server waarop gezocht moet worden...';
+$messages['nocontactsreturned'] = 'Geen contactpersonen gevonden';
+$messages['nosearchname'] = 'Geen een contacpersoon of e-mailadres op...';
+$messages['searchsuccessful'] = '$nr berichten gevonden';
+$messages['searchnomatch'] = 'Zoekopdracht leverde geen resultaten';
+$messages['searching'] = 'Bezig met zoeken...';
+$messages['checking'] = 'Bezig met controleren...';
+$messages['nospellerrors'] = 'Geen spelfouten gevonden';
+$messages['folderdeleted'] = 'Mappen met succes verwijderd';
+$messages['deletedsuccessfully'] = 'Succesvol verwijderd';
+$messages['converting'] = 'Opmaak van het bericht wordt gewist...';
+$messages['messageopenerror'] = 'Kon het bericht niet ophalen van de server';
+$messages['fileuploaderror'] = 'Bestandupload mislukt';
+$messages['filesizeerror'] = 'Het bestand overschrijdt de maximum grootte van $size';
+$messages['copysuccess'] = '$nr adressen met succes gekopiëerd';
+$messages['copyerror'] = 'Kon de adressen niet kopiëren';
+$messages['sourceisreadonly'] = 'Het adres kan niet worden opgeslagen';
+$messages['errorsavingcontact'] = 'Kon de contactpersoon niet bewaren';
+$messages['movingmessage'] = 'Bericht wordt verplaatst...';
+$messages['receiptsent'] = 'Ontvangstbevestiging verstuurd';
+$messages['errorsendingreceipt'] = 'Kon de ontvangstbevestigign niet versturen';
+$messages['nodeletelastidentity'] = 'U kunt dit laatste afzendadres niet verwijderen.';
+$messages['addsubfolderhint'] = 'De map wordt aangemaakt als submap van de geselecteerde map.';
+
+?>
index d0c413052e5fae521d65e07ed1e8099b6e4cb3a9..94f23300dbbb501cfb7094fe25122b23f60d74d0 100644 (file)
@@ -6,14 +6,14 @@
  | language/nl_NL/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Mark Moses <mark@katmoda.com>                                 |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 844 2007-10-02 05:33:18Z tomekp $
+ @version $Id: labels.inc 1183 2008-03-04 22:10:15Z yllar $
 
 */
 
@@ -22,7 +22,7 @@ $labels['welcome'] = 'Welkom bij $product';
 $labels['username'] = 'Gebruikersnaam';
 $labels['password'] = 'Wachtwoord';
 $labels['server'] = 'Server';
-$labels['login'] = 'Login';
+$labels['login'] = 'Inloggen';
 $labels['logout'] = 'Uitloggen';
 $labels['mail'] = 'E-Mail';
 $labels['settings'] = 'Persoonlijke Instellingen';
@@ -35,7 +35,7 @@ $labels['junk'] = 'SPAM';
 $labels['subject'] = 'Onderwerp';
 $labels['from'] = 'Afzender';
 $labels['to'] = 'Ontvanger';
-$labels['cc'] = 'kopie';
+$labels['cc'] = 'Kopie';
 $labels['bcc'] = 'Bcc';
 $labels['replyto'] = 'Antwoord-aan';
 $labels['date'] = 'Datum';
@@ -87,6 +87,9 @@ $labels['lastmessage'] = 'Toon het laatste bericht';
 $labels['lastmessages'] = 'Toon laatste lijst met berichten';
 $labels['backtolist'] = 'Terug naar berichtenoverzicht';
 $labels['viewsource'] = 'Toon bron';
+$labels['markmessages'] = 'Markeer berichten';
+$labels['markread'] = 'Gelezen';
+$labels['markunread'] = 'Ongelezen';
 $labels['select'] = 'Selecteer';
 $labels['all'] = 'Allemaal';
 $labels['none'] = 'Geen';
@@ -103,7 +106,7 @@ $labels['compose'] = 'Maak een bericht';
 $labels['savemessage'] = 'Bewaar als concept';
 $labels['sendmessage'] = 'Verstuur het bericht nu';
 $labels['addattachment'] = 'Voeg een bijlage toe';
-$labels['charset'] = 'karakterset';
+$labels['charset'] = 'Karakterset';
 $labels['editortype'] = 'Opmaak';
 $labels['returnreceipt'] = 'Ontvangstbevestiging';
 $labels['checkspelling'] = 'Controleer spelling';
@@ -124,6 +127,10 @@ $labels['plaintoggle'] = 'Gewone tekst';
 $labels['addcc'] = 'Kopie toevoegen';
 $labels['addbcc'] = 'Bcc toevoegen';
 $labels['addreplyto'] = 'Antwoord-aan toevoegen';
+$labels['mdnrequest'] = 'De afzender van dit bericht heeft gevraagd of er een melding kan worden verzonden als dit bericht is ontvangen. Wilt u de een melding verzenden?';
+$labels['receiptread'] = 'Ontvangstbevestiging (gelezen)';
+$labels['yourmessage'] = 'Dit is een ontvangstbevestiging voor uw bericht';
+$labels['receiptnote'] = 'Let op: Deze bevestigt alleen dat uw bericht bij de geaddresseerde is binnen gekomen. Er is geen garantie dat de geaddresseerde het bericht daadwerkelijk heeft gelezen of de inhoud heeft begrepen.';
 $labels['name'] = 'Naam';
 $labels['firstname'] = 'Voornaam';
 $labels['surname'] = 'Achternaam';
@@ -171,6 +178,7 @@ $labels['folder'] = 'Map';
 $labels['folders'] = 'Mappen';
 $labels['foldername'] = 'Mapnaam';
 $labels['subscribed'] = 'Geabonneerd';
+$labels['messagecount'] = 'Berichten';
 $labels['create'] = 'Nieuw';
 $labels['createfolder'] = 'Maak nieuwe map';
 $labels['rename'] = 'Wijzig naam';
@@ -181,4 +189,4 @@ $labels['sortby'] = 'Sorteer op';
 $labels['sortasc'] = 'Sorteer oplopend';
 $labels['sortdesc'] = 'Sorteer aflopend';
 
-?>
\ No newline at end of file
+?>
index 3a961ebe9b13d8e8e5fa5b1e1d0197261ef7fbbf..0930ced3f5789b0cb824c31cf521c7c2c9ad0eca 100644 (file)
@@ -6,14 +6,14 @@
  | language/nl_NL/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Mark Moses <mark@katmoda.com>                                 |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 844 2007-10-02 05:33:18Z tomekp $
+ @version $Id: messages.inc 1087 2008-02-15 07:49:48Z robin $
 
 */
 
@@ -74,5 +74,8 @@ $messages['copyerror'] = 'Kan geen adressen kopiëren';
 $messages['sourceisreadonly'] = 'Het adres kan niet worden opgeslagen';
 $messages['errorsavingcontact'] = 'Kan het ontvanger-adres niet opslaan';
 $messages['movingmessage'] = 'Bericht verplaatsen...';
-
-?>
\ No newline at end of file
+$messages['receiptsent'] = 'Ontvangstbevestiging is verstuurd';
+$messages['errorsendingreceipt'] = 'Kan de ontvangstbevestiging niet versturen';
+$messages['nodeletelastidentity'] = 'U kunt dit afzenderadres niet verwijderen';
+$messages['addsubfolderhint'] = 'Deze map zal worden aangemaakt onder de geselecteerde map';
+?>
diff --git a/program/localization/nn_NO/labels.inc b/program/localization/nn_NO/labels.inc
new file mode 100644 (file)
index 0000000..d539015
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/nn/labels.inc                                                |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Per-Stian Vatne <psv@orsta.org>                               |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: labels.inc 950 2008-01-04 08:04:53Z tomekp $
+
+*/
+
+$labels = array();
+
+// login page
+$labels['welcome']   = 'Welcome to Roundcube|Mail';
+$labels['username']  = 'Brukarnamn';
+$labels['password']  = 'Passord';
+$labels['server']    = 'Tenar';
+$labels['login']     = 'Logg inn';
+
+// taskbar
+$labels['logout']   = 'Logg ut';
+$labels['mail']     = 'E-post';
+$labels['settings'] = 'Personlege innstillingar';
+$labels['addressbook'] = 'Adressebok';
+
+// mailbox names
+$labels['inbox']  = 'Innboks';
+$labels['sent']   = 'Sende element';
+$labels['trash']  = 'Sletta element';
+$labels['drafts'] = 'Kladd';
+$labels['junk']   = 'Søppel';
+
+// message listing
+$labels['subject'] = 'Emne';
+$labels['from']    = 'Sendar';
+$labels['to']      = 'Mottakar';
+$labels['cc']      = 'Kopi';
+$labels['bcc']     = 'Blindkopi';
+$labels['replyto'] = 'Svar-til';
+$labels['date']    = 'Dato';
+$labels['size']    = 'Storleik';
+$labels['priority'] = 'Prioritet';
+$labels['organization'] = 'Organisasjon';
+
+// aliases
+$labels['reply-to'] = $labels['replyto'];
+
+$labels['mailboxlist'] = 'Katalogar';
+$labels['messagesfromto'] = 'Meldingar $from til $to av $count';
+$labels['messagenrof'] = 'Melding $nr av $count';
+
+$labels['moveto']   = 'flytt til...';
+$labels['download'] = 'last ned';
+
+$labels['filename'] = 'Filnamn';
+$labels['filesize'] = 'Filstorleik';
+
+$labels['preferhtml'] = 'Føretrekk HTML';
+$labels['htmlmessage'] = 'HTML-melding';
+$labels['prettydate'] = 'Pene datoar';
+
+$labels['addtoaddressbook'] = 'Legg til i adressebok';
+
+// weekdays short
+$labels['sun'] = 'Sun';
+$labels['mon'] = 'Mån';
+$labels['tue'] = 'Tys';
+$labels['wed'] = 'Ons';
+$labels['thu'] = 'Tor';
+$labels['fri'] = 'Fre';
+$labels['sat'] = 'Lau';
+
+// weekdays long
+$labels['sunday']    = 'Sundag';
+$labels['monday']    = 'Måndag';
+$labels['tuesday']   = 'Tysdag';
+$labels['wednesday'] = 'Onsdag';
+$labels['thursday']  = 'Torsdag';
+$labels['friday']    = 'Fredag';
+$labels['saturday']  = 'Laurdag';
+
+$labels['today'] = 'I dag';
+
+// toolbar buttons
+$labels['writenewmessage']  = 'Skriv ei ny melding';
+$labels['replytomessage']   = 'Svar på meldinga';
+$labels['forwardmessage']   = 'Vidaresend meldinga';
+$labels['deletemessage']    = 'Flytt melding til Sletta element';
+$labels['printmessage']     = 'Skriv ut meldinga';
+$labels['previousmessages'] = 'Vis føregåande side med meldingar';
+$labels['nextmessages']     = 'Vis neste side med med meldingar';
+$labels['backtolist']       = 'Tilbake til meldingslista';
+$labels['viewsource']       = 'Vis kjelde';
+
+$labels['select'] = 'Vel';
+$labels['all'] = 'Alle';
+$labels['none'] = 'Ingen';
+$labels['unread'] = 'Uleste';
+
+// message compose
+$labels['compose']  = 'Skriv ei melding';
+$labels['sendmessage']  = 'Send meldinga no';
+$labels['addattachment']  = 'Legg ved ei fil';
+
+$labels['attachments'] = 'Vedlegg';
+$labels['upload'] = 'Last opp';
+$labels['close']  = 'Steng';
+
+$labels['low']     = 'Låg';
+$labels['lowest']  = 'Lågast';
+$labels['normal']  = 'Normal';
+$labels['high']    = 'Høg';
+$labels['highest'] = 'Høgast';
+
+$labels['showimages'] = 'Vis bilete';
+
+// address book
+$labels['name']      = 'Visingsnamn';
+$labels['firstname'] = 'Førenamn';
+$labels['surname']   = 'Etternamn';
+$labels['email']     = 'E-post';
+
+$labels['addcontact'] = 'Legg til ny kontakt';
+$labels['editcontact'] = 'Redigere kontakt';
+
+$labels['edit']   = 'Redigere';
+$labels['cancel'] = 'Avbryt';
+$labels['save']   = 'Lagre';
+$labels['delete'] = 'Slette';
+
+$labels['newcontact']     = 'Opprett nytt kontaktkort';
+$labels['deletecontact']  = 'Slett valde kontaktar';
+$labels['composeto']      = 'Ny melding til';
+$labels['contactsfromto'] = 'Kontaktar $from til $to av $count';
+$labels['print']          = 'Skriv ut';
+$labels['export']         = 'Eksport';
+
+// settings
+$labels['settingsfor']  = 'Innstillingar for';
+
+$labels['preferences']  = 'Innstillingar';
+$labels['userpreferences']  = 'Brukarinnstillingar';
+$labels['editpreferences']  = 'Redigere brukarinnstillingar';
+
+$labels['identities']  = 'Identitetar';
+$labels['manageidentities']  = 'Administrere identitetar for denne kontoen';
+$labels['newidentity']  = 'Ny identitet';
+
+$labels['newitem']  = 'Nytt element';
+$labels['edititem']  = 'Redigere element';
+
+$labels['setdefault']  = 'Set som standard';
+$labels['language']  = 'Språk';
+$labels['timezone']  = 'Tidssone';
+$labels['pagesize']  = 'Rader pr side';
+
+$labels['folders']  = 'Mapper';
+$labels['foldername']  = 'Mappenamn';
+$labels['subscribed']  = 'Abonnert';
+$labels['create']  = 'Opprette';
+$labels['createfolder']  = 'Opprett ny mappe';
+$labels['deletefolder']  = 'Slett mappe';
+$labels['managefolders']  = 'Administrere mapper';
+
+?>
\ No newline at end of file
diff --git a/program/localization/nn_NO/messages.inc b/program/localization/nn_NO/messages.inc
new file mode 100644 (file)
index 0000000..4cb38ad
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/nn/messages.inc                                              |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Per-Stian Vatne <psv@orsta.org>                               |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 950 2008-01-04 08:04:53Z tomekp $
+
+*/
+
+$messages = array();
+$messages['loginfailed']  = 'Feil ved innlogging';
+$messages['cookiesdisabled'] = 'Nettlesaren din tillet ikkje informasjonskapslar (cookies)';
+$messages['sessionerror'] = 'Sesjonen din er ulovleg eller har gått ut på tid';
+$messages['imaperror'] = 'Feil ved tilkopling til IMAP-tenar';
+$messages['nomessagesfound'] = 'Ingen meldingar i denne postkassa';
+$messages['loggedout'] = 'Du har avslutta sesjonen. Ha det bra!';
+$messages['mailboxempty'] = 'Postkassa er tom';
+$messages['loadingdata'] = 'Lastar inn data...';
+$messages['messagesent'] = 'Meldinga vart send';
+$messages['successfullysaved'] = 'Meldinga vart lagra';
+$messages['addedsuccessfully'] = 'Kontakta vart lagt til i adresseboka';
+$messages['contactexists'] = 'Ei kontakt med denne e-postadressa eksisterer allereie';
+$messages['blockedimages'] = 'For å ta vare på privatlivet ditt er eksterne bilete blokkert i denne meldinga.';
+$messages['encryptedmessage'] = 'Dette er ei kryptert melding og kan ikkje visast. Orsak!';
+$messages['nocontactsfound'] = 'Fann ingen kontaktar';
+$messages['sendingfailed'] = 'Kunne ikkje sende meldinga';
+$messages['errorsaving'] = 'Det skjedde ein feil ved lagring';
+$messages['errormoving'] = 'Kunne ikkje flytte meldinga';
+$messages['errordeleting'] = 'Kunne ikkje slette meldinga';
+
+?>
\ No newline at end of file
index 45093e45025b4ef9d6a962d25147c38137af2585..9158e4fdf70e1cd6570b9e061eddfd12460524aa 100644 (file)
@@ -6,16 +6,18 @@
  | language/pl/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Tomasz Pajor     <t.pajor@kei.pl>                             |
- |         Sławomir Cichoń  <slawek.cichon@gmail.com>                    |
- |         Janusz Zamecki   <janusz@zamecki.eu>                          |
+ | Author: Tomasz Pajor        <t.pajor@kei.pl>                          |
+ |         Sławomir Cichoń     <slawek.cichon@gmail.com>                 |
+ |         Janusz Zamecki      <janusz@zamecki.eu>                       |
+ |         Mariusz Szulerecki  <nob@force.eu.org>                        |
+ |         Wojciech Szczepucha <donkoyote@gmail.com>                     |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 819 2007-09-26 08:26:58Z tomekp $
+ @version $Id: labels.inc 1160 2008-03-01 15:32:44Z yllar $
 
 */
 
@@ -89,11 +91,14 @@ $labels['lastmessage'] = 'Pokaż ostatnią';
 $labels['lastmessages'] = 'Pokaż ostatnie';
 $labels['backtolist'] = 'Pokaż listę wiadomości';
 $labels['viewsource'] = 'Pokaż źródło';
-$labels['select'] = 'Wybierz';
-$labels['all'] = 'Zaznacz wszystkie';
-$labels['none'] = 'Anuluj zaznaczenie';
-$labels['unread'] = 'Zaznacz nieprzeczytane';
-$labels['compact'] = 'Kompaktuj';
+$labels['markmessages'] = 'Oznacz wiadomość';
+$labels['markread'] = 'Jako przeczytaną';
+$labels['markunread'] = 'Jako nieprzeczytaną';
+$labels['select'] = 'Zaznacz';
+$labels['all'] = 'Wszystkie';
+$labels['none'] = 'Anuluj';
+$labels['unread'] = 'Nieprzeczytane';
+$labels['compact'] = 'Upakuj';
 $labels['empty'] = 'Opróżnij';
 $labels['purge'] = 'Oczyść';
 $labels['quota'] = 'Użyte miejsce';
@@ -123,9 +128,13 @@ $labels['nosubject'] = '(brak tematu)';
 $labels['showimages'] = 'Wyświetl obrazki';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Zwykły tekst';
-$labels['addcc'] = 'Dodaj Cc'; 
-$labels['addbcc'] = 'Dodaj Bcc'; 
+$labels['addcc'] = 'Dodaj Cc';
+$labels['addbcc'] = 'Dodaj Bcc';
 $labels['addreplyto'] = 'Dodaj Reply-To';
+$labels['mdnrequest'] = 'Nadawca poprosił o potwierdzenie przeczytania tej wiadomości. Czy chcesz go powiadomić?';
+$labels['receiptread'] = 'Potwierdzenie odbioru';
+$labels['yourmessage'] = 'To jest potwierdzenie dostarczenia Twojej wiadomości';
+$labels['receiptnote'] = 'Uwaga: To potwierdzenie dostarczenia wiadomości oznacza tylko, że wiadomość została wyświetlona na komputerze adresata. Nie ma żadnej gwarancji, że odbiorca przeczytał czy też zrozumiał treść wiadomości.';
 $labels['name'] = 'Nazwa';
 $labels['firstname'] = 'Imię';
 $labels['surname'] = 'Nazwisko';
@@ -173,6 +182,7 @@ $labels['folder'] = 'Folder';
 $labels['folders'] = 'Foldery';
 $labels['foldername'] = 'Nazwa folderu';
 $labels['subscribed'] = 'Zasubskrybowany';
+$labels['messagecount'] = 'Wiadomości';
 $labels['create'] = 'Utwórz';
 $labels['createfolder'] = 'Utwórz nowy folder';
 $labels['rename'] = 'Zmień nazwę';
@@ -183,4 +193,4 @@ $labels['sortby'] = 'Sortuj wg';
 $labels['sortasc'] = 'Rosnąco';
 $labels['sortdesc'] = 'Malejąco';
 
-?>
\ No newline at end of file
+?>
index eeb487c9b072704a7cdec31375d2d8dc373391b6..02cf26b56a6069c9f878f4ada52ac69e335c84fb 100644 (file)
@@ -6,16 +6,18 @@
  | language/pl/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Tomasz Pajor     <t.pajor@kei.pl>                             |
- | Author: Sławomir Cichoń  <slawek.cichon@gmail.com>                    |
- |         Janusz Zamecki   <janusz@zamecki.eu>                          |
+ | Author: Tomasz Pajor        <t.pajor@kei.pl>                          |
+ | Author: Sławomir Cichoń     <slawek.cichon@gmail.com>                 |
+ |         Janusz Zamecki      <janusz@zamecki.eu>                       |
+ |         Mariusz Szulerecki  <nob@force.eu.org>                        |
+ |         Wojciech Szczepucha <donkoyote@gmail.com>                     |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 815 2007-09-26 08:03:07Z tomekp $
+ @version $Id: messages.inc 1086 2008-02-15 05:43:32Z tomekp $
 
 */
 
@@ -76,5 +78,9 @@ $messages['copyerror'] = 'Nie można skopiować żadnego adresu';
 $messages['sourceisreadonly'] = 'Źródło adresu jest tylko do odczytu';
 $messages['errorsavingcontact'] = 'Nie można było zapisać adresu kontaktu';
 $messages['movingmessage'] = 'Przenoszenie wiadomości...';
+$messages['receiptsent'] = 'Pomyślnie wysłano potwierdzenie dostarczenia';
+$messages['errorsendingreceipt'] = 'Nie można wysłać potwierdzenia';
+$messages['nodeletelastidentity'] = 'Nie można skasować tej tożsamości, ponieważ jest ostatnią.';
+$messages['addsubfolderhint'] = 'Ten folder zostanie utworzony jako podfolder aktualnie wybranego.';
 
 ?>
\ No newline at end of file
index 1c3e433e26ede0a964da0ff29d53bddefaeb373f..4c4696be5be976fa936837f4df505bad853735be 100644 (file)
@@ -6,73 +6,56 @@
  | language/pt_BR/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Anderson S. Ferreira <anderson@cnpm.embrapa.br>               |
- | Updated by: Robson F. Ramaldes <rframaldes@gmail.com>                 |
- | Updated by: Alessandro Lenzi <alessandro@mistymountain.com.br>        |
+ |         Robson F. Ramaldes <rframaldes@gmail.com>                     |
+ |         Alessandro Lenzi <alessandro@mistymountain.com.br>            |
  +-----------------------------------------------------------------------+
 
$Id: labels.inc 870 2007-10-16 06:50:49Z thomasb $
@version $Id: labels.inc 1113 2008-02-18 12:47:25Z yllar $
 
 */
 
 $labels = array();
-
-// login page
-$labels['welcome']      = 'Bem Vindo ao $product';
-$labels['username']  = 'Usuário';
-$labels['password']  = 'Senha';
-$labels['server']       = 'Servidor';
-$labels['login']        = 'Entrar';
-
-// taskbar
-$labels['logout']      = 'Sair';
-$labels['mail']        = 'E-mail';
+$labels['welcome'] = 'Bem Vindo ao $product';
+$labels['username'] = 'Usuário';
+$labels['password'] = 'Senha';
+$labels['server'] = 'Servidor';
+$labels['login'] = 'Entrar';
+$labels['logout'] = 'Sair';
+$labels['mail'] = 'E-mail';
 $labels['settings'] = 'Configurações pessoais';
 $labels['addressbook'] = 'Catálogo de endereços';
-
-// mailbox names
-$labels['inbox']  = 'Entrada';
+$labels['inbox'] = 'Entrada';
 $labels['drafts'] = 'Rascunhos';
-$labels['sent']   = 'Enviados';
-$labels['trash']  = 'Lixeira';
-$labels['junk']   = 'Junk';
-
-// message listing
+$labels['sent'] = 'Enviados';
+$labels['trash'] = 'Lixeira';
+$labels['junk'] = 'Junk';
 $labels['subject'] = 'Assunto';
-$labels['from']    = 'Remetente';
-$labels['to']      = 'Para';
-$labels['cc']      = 'Cópia';
-$labels['bcc']     = 'Cópia Oculta';
+$labels['from'] = 'Remetente';
+$labels['to'] = 'Para';
+$labels['cc'] = 'Cópia';
+$labels['bcc'] = 'Cópia Oculta';
 $labels['replyto'] = 'Responder para';
-$labels['date']    = 'Data';
-$labels['size']    = 'Tamanho';
+$labels['date'] = 'Data';
+$labels['size'] = 'Tamanho';
 $labels['priority'] = 'Prioridade';
 $labels['organization'] = 'Organização';
-
-// aliases
-$labels['reply-to'] = $labels['replyto'];
-
+$labels['reply-to'] = 'Responder para';
 $labels['mailboxlist'] = 'Pastas';
 $labels['messagesfromto'] = 'Mensagens $from - $to de $count';
 $labels['messagenrof'] = 'Mensagem $nr de $count';
-
-$labels['moveto']      = 'mover para...';
+$labels['moveto'] = 'mover para...';
 $labels['download'] = 'download';
-
 $labels['filename'] = 'Arquivo';
 $labels['filesize'] = 'Tamanho';
-
 $labels['preferhtml'] = 'Preferir HTML';
 $labels['htmlmessage'] = 'Mensagem HTML';
 $labels['prettydate'] = 'Formatar datas';
-
 $labels['addtoaddressbook'] = 'Incluir no catálogo de endereços';
-
-// weekdays short
 $labels['sun'] = 'Dom';
 $labels['mon'] = 'Seg';
 $labels['tue'] = 'Ter';
@@ -80,160 +63,132 @@ $labels['wed'] = 'Qua';
 $labels['thu'] = 'Qui';
 $labels['fri'] = 'Sex';
 $labels['sat'] = 'Sáb';
-
-// weekdays long
-$labels['sunday']       = 'Domingo';
-$labels['monday']       = 'Segunda-feira';
-$labels['tuesday']      = 'Terça-feira';
+$labels['sunday'] = 'Domingo';
+$labels['monday'] = 'Segunda-feira';
+$labels['tuesday'] = 'Terça-feira';
 $labels['wednesday'] = 'Quarta-feira';
-$labels['thursday']     = 'Quinta-feira';
-$labels['friday']       = 'Sexta-feira';
-$labels['saturday']     = 'Sábado';
-
+$labels['thursday'] = 'Quinta-feira';
+$labels['friday'] = 'Sexta-feira';
+$labels['saturday'] = 'Sábado';
 $labels['today'] = 'Hoje';
-
-// toolbar buttons
-$labels['checkmail']           = 'Verificar se há novas mensagens.';
-$labels['writenewmessage']     = 'Criar nova mensagem';
-$labels['replytomessage']      = 'Responder';
+$labels['checkmail'] = 'Verificar se há novas mensagens.';
+$labels['writenewmessage'] = 'Criar nova mensagem';
+$labels['replytomessage'] = 'Responder';
 $labels['replytoallmessage'] = 'Responder para todos';
-$labels['forwardmessage']      = 'Encaminhar';
-$labels['deletemessage']       = 'Excluir';
+$labels['forwardmessage'] = 'Encaminhar';
+$labels['deletemessage'] = 'Excluir';
 $labels['movemessagetotrash'] = 'Mover para Lixeira';
-$labels['printmessage']        = 'Imprimir';
-$labels['previousmessage']     = 'Mensagem Anterior';
+$labels['printmessage'] = 'Imprimir';
+$labels['previousmessage'] = 'Mensagem Anterior';
 $labels['previousmessages'] = 'Página Anterior';
-$labels['firstmessage']        = 'Primeira Mensagem';
-$labels['firstmessages']       = 'Primeira Página';
-$labels['nextmessage']                 = 'Próxima Mensagem';
-$labels['nextmessages']        = 'Próxima Página';
-$labels['lastmessage']                 = 'Ultima Mensagem';
-$labels['lastmessages']        = 'Ultima Página';
-$labels['backtolist']          = 'Voltar';
-$labels['viewsource']          = 'Exibir código fonte';
-
+$labels['firstmessage'] = 'Primeira Mensagem';
+$labels['firstmessages'] = 'Primeira Página';
+$labels['nextmessage'] = 'Próxima Mensagem';
+$labels['nextmessages'] = 'Próxima Pána';
+$labels['lastmessage'] = 'Última Mensagem';
+$labels['lastmessages'] = 'Última Página';
+$labels['backtolist'] = 'Voltar';
+$labels['viewsource'] = 'Exibir código fonte';
+$labels['markmessages'] = 'Marcar mensagens';
+$labels['markread'] = 'como lidas';
+$labels['markunread'] = 'como não lidas';
 $labels['select'] = 'Selecionar';
 $labels['all'] = 'Todas';
 $labels['none'] = 'Nenhuma';
 $labels['unread'] = 'Não lidas';
-
 $labels['compact'] = 'Compactar';
 $labels['empty'] = 'Esvaziar';
 $labels['purge'] = 'Apagar';
-
 $labels['quota'] = 'Utilização';
-$labels['unknown']  = 'desconhecido';
-$labels['unlimited']  = 'Sem limitação';
-
+$labels['unknown'] = 'desconhecido';
+$labels['unlimited'] = 'Sem limitação';
 $labels['quicksearch'] = 'Pesquisa Rápida';
 $labels['resetsearch'] = 'Limpar';
-
-
-// message compose
-$labels['compose']           = 'Escrever mensagem';
-$labels['sendmessage']   = 'Enviar';
-$labels['savemessage']    = 'Salvar Rascunho';
-$labels['addattachment']  = 'Anexar';
-$labels['charset']        = 'Codificação';
-$labels['editortype']     = 'Tipo';
-$labels['returnreceipt']  = 'Receber Confirmação';
-
+$labels['compose'] = 'Escrever mensagem';
+$labels['savemessage'] = 'Salvar Rascunho';
+$labels['sendmessage'] = 'Enviar';
+$labels['addattachment'] = 'Anexar';
+$labels['charset'] = 'Codificação';
+$labels['editortype'] = 'Tipo';
+$labels['returnreceipt'] = 'Receber Confirmação';
 $labels['checkspelling'] = 'Verificar Ortografia';
 $labels['resumeediting'] = 'Continuar';
-$labels['revertto']             = 'Reverter para';
-
+$labels['revertto'] = 'Reverter para';
 $labels['attachments'] = 'Anexos';
 $labels['upload'] = 'Enviar';
-$labels['close']  = 'Fechar';
-
-$labels['low']            = 'Mais baixa';
-$labels['lowest']  = 'Baixa';
-$labels['normal']  = 'Normal';
-$labels['high']    = 'Alta';
+$labels['close'] = 'Fechar';
+$labels['low'] = 'Mais baixa';
+$labels['lowest'] = 'Baixa';
+$labels['normal'] = 'Normal';
+$labels['high'] = 'Alta';
 $labels['highest'] = 'Mais alta';
-
-$labels['nosubject']  = '(Sem assunto)';
+$labels['nosubject'] = '(Sem assunto)';
 $labels['showimages'] = 'Exibir imagens';
-
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Texto Puro';
-
 $labels['addcc'] = 'Cópia';
 $labels['addbcc'] = 'Cópia Oculta';
 $labels['addreplyto'] = 'Responder para';
-
-
-// address boook
-$labels['name']         = 'Nome completo';
+$labels['mdnrequest'] = 'O remetente desta mensagem deseja ser notificado quando você ler esta mensagem. Você permite o envio desta notificação?';
+$labels['receiptread'] = 'Confirmacao de Leitura (Exibida)';
+$labels['yourmessage'] = 'Esta e uma confirmacao de leitura da sua mensagem.';
+$labels['receiptnote'] = 'Nota: Esta confirmacao de leitura somente informa que a mensagem foi aberta no computador do destinatario.\\n Nao ha garantia que o destinatario tenha lido ou compreendido o conteudo da mensagem.';
+$labels['name'] = 'Nome completo';
 $labels['firstname'] = 'Primeiro nome';
-$labels['surname']      = 'Sobrenome';
-$labels['email']        = 'E-Mail';
-
+$labels['surname'] = 'Sobrenome';
+$labels['email'] = 'E-Mail';
 $labels['addcontact'] = 'Incluir novo contato';
 $labels['editcontact'] = 'Editar contato';
-
-$labels['edit']   = 'Editar';
+$labels['edit'] = 'Editar';
 $labels['cancel'] = 'Cancelar';
-$labels['save']   = 'Salvar';
+$labels['save'] = 'Salvar';
 $labels['delete'] = 'Apagar';
-
-$labels['newcontact']    = 'Criar novo contato';
-$labels['deletecontact']  = 'Apagar contatos selecionados';
-$labels['composeto']     = 'Escrever mensagem para';
+$labels['newcontact'] = 'Criar novo contato';
+$labels['deletecontact'] = 'Apagar contatos selecionados';
+$labels['composeto'] = 'Escrever mensagem para';
 $labels['contactsfromto'] = 'Contatos de $from à $to de $count';
-$labels['print']                 = 'Imprimir';
-$labels['export']                = 'Exportar';
-
-$labels['previouspage']   = 'Página Anterior';
-$labels['firstpage']     = 'Primeira Página ';
-$labels['nextpage']      = 'Próxima Página';
-$labels['lastpage']              = 'Última Página';
-
+$labels['print'] = 'Imprimir';
+$labels['export'] = 'Exportar';
+$labels['previouspage'] = 'Página Anterior';
+$labels['firstpage'] = 'Primeira Página ';
+$labels['nextpage'] = 'Próxima Página';
+$labels['lastpage'] = 'Última Página';
 $labels['groups'] = 'Grupos';
 $labels['personaladrbook'] = 'Endereços Pessoais';
-
-
-// settings
-$labels['settingsfor']  = 'Configurações para';
-
-$labels['preferences']  = 'Preferências';
-$labels['userpreferences']  = 'Preferências do usuário';
-$labels['editpreferences']  = 'Editar preferências do usuário';
-
-$labels['identities']  = 'Identidades';
-$labels['manageidentities']  = 'Gerenciar identidades para esta conta';
-$labels['newidentity']  = 'Nova identidade';
-
-$labels['newitem']  = 'Novo item';
-$labels['edititem']  = 'Editar item';
-
-$labels['setdefault']  = 'Padrão';
-$labels['language']  = 'Idioma';
-$labels['timezone']  = 'Fuso Horário';
-$labels['pagesize']  = 'Linhas por página';
+$labels['settingsfor'] = 'Configurações para';
+$labels['preferences'] = 'Preferências';
+$labels['userpreferences'] = 'Preferências do usuário';
+$labels['editpreferences'] = 'Editar preferências do usuário';
+$labels['identities'] = 'Identidades';
+$labels['manageidentities'] = 'Gerenciar identidades para esta conta';
+$labels['newidentity'] = 'Nova identidade';
+$labels['newitem'] = 'Novo item';
+$labels['edititem'] = 'Editar item';
+$labels['setdefault'] = 'Padrão';
+$labels['language'] = 'Idioma';
+$labels['timezone'] = 'Fuso Horário';
+$labels['pagesize'] = 'Linhas por página';
 $labels['signature'] = 'Assinatura';
-$labels['dstactive']  = 'Horário de Verão';
+$labels['dstactive'] = 'Horário de Verão';
 $labels['htmleditor'] = 'Criar mensagens em HTML';
 $labels['htmlsignature'] = 'Assinatura em HTML';
-$labels['previewpane'] = 'Exibir Pré-Visualização';
-
-$labels['autosavedraft']  = 'Salvar Rascunho automaticamente';
-$labels['everynminutes']  = 'a cada $n minutos';
-$labels['never']  = 'nunca';
-
-$labels['folder']  = 'Pasta';
-$labels['folders']  = 'Pastas';
-$labels['foldername']  = 'Nome da pasta';
-$labels['subscribed']  = 'Assinado';
-$labels['create']  = 'Criar';
-$labels['createfolder']  = 'Criar nova pasta';
+$labels['previewpane'] = 'Exibir Pré-visualização';
+$labels['autosavedraft'] = 'Salvar Rascunho automaticamente';
+$labels['everynminutes'] = 'a cada $n minutos';
+$labels['never'] = 'nunca';
+$labels['folder'] = 'Pasta';
+$labels['folders'] = 'Pastas';
+$labels['foldername'] = 'Nome da pasta';
+$labels['subscribed'] = 'Assinado';
+$labels['messagecount'] = 'Mensagens';
+$labels['create'] = 'Criar';
+$labels['createfolder'] = 'Criar nova pasta';
 $labels['rename'] = 'Renomear';
 $labels['renamefolder'] = 'Renomear Pasta';
-$labels['deletefolder']  = 'Apagar pasta';
-$labels['managefolders']  = 'Gerenciar pastas';
-
+$labels['deletefolder'] = 'Apagar pasta';
+$labels['managefolders'] = 'Gerenciar pastas';
 $labels['sortby'] = 'Ordenado por';
-$labels['sortasc']  = 'Ascendente';
+$labels['sortasc'] = 'Ascendente';
 $labels['sortdesc'] = 'Descendente';
 
 ?>
\ No newline at end of file
index 989811833a83288fab55b260e37dcffdd06d8203..6f5d46022362e080642ba868a26e40557343eeb1 100644 (file)
@@ -6,25 +6,25 @@
  | language/pt_BR/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Anderson S. Ferreira <anderson@cnpm.embrapa.br>               |
- | Updated by: Robson F. Ramaldes <rframaldes@gmail.com>                 |
- | Updated by: Alessandro Lenzi <alessandro@mistymountain.com.br>        |
+ |         Robson F. Ramaldes <rframaldes@gmail.com>                     |
+ |         Alessandro Lenzi <alessandro@mistymountain.com.br>            |
  +-----------------------------------------------------------------------+
 
$Id: messages.inc 830 2007-09-27 04:33:46Z tomekp $
@version $Id: messages.inc 1113 2008-02-18 12:47:25Z yllar $
 
 */
 
 $messages = array();
-$messages['loginfailed']  = 'Falha no login.';
+$messages['loginfailed'] = 'Falha no login.';
 $messages['cookiesdisabled'] = 'Seu navegador não suporta cookies.';
 $messages['sessionerror'] = 'A sessão do seu navegador é inválida ou expirou.';
-$messages['imaperror'] = 'A conexão com o servidor IMAP falhou.';
-$messages['nomessagesfound'] = 'Não foi encontrada nenhuma mensagem.';
+$messages['imaperror'] = 'Falha na conexão com o servidor IMAP.';
+$messages['nomessagesfound'] = 'Nenhuma mensagem foi encontrada.';
 $messages['loggedout'] = 'Sua sessão foi finalizada com sucesso. Até breve!';
 $messages['mailboxempty'] = 'A caixa de mensagens está vazia.';
 $messages['loading'] = 'Carregando...';
@@ -41,7 +41,6 @@ $messages['blockedimages'] = 'Para proteger sua privacidade, as imagens desta me
 $messages['encryptedmessage'] = 'Esta mensagem está criptografada e não pode ser exibida. Desculpe.';
 $messages['nocontactsfound'] = 'Nenhum contato foi encontrado';
 $messages['contactnotfound'] = 'O contato solicitado não foi encontrado';
-
 $messages['sendingfailed'] = 'Falha no envio da mensagem';
 $messages['errorsaving'] = 'Ocorreu um erro ao Salvar';
 $messages['errormoving'] = 'Não foi possível mover a mensagem';
@@ -52,10 +51,10 @@ $messages['deletefolderconfirm'] = 'Deseja realmente excluir esta pasta?';
 $messages['purgefolderconfirm'] = 'Deseja realmente excluir todas mensagens desta pasta?';
 $messages['formincomplete'] = 'Os campos não foram completamente preenchidos.';
 $messages['noemailwarning'] = 'Por favor, informe um endereço de e-mail válido.';
-$messages['nonamewarning']  = 'Por favor, informe o nome.';
+$messages['nonamewarning'] = 'Por favor, informe o nome.';
 $messages['nopagesizewarning'] = 'Por favor, informe o tamanho da página.';
 $messages['norecipientwarning'] = 'Por favor, informe pelo menos um destinatário.';
-$messages['nosubjectwarning']  = 'O campo assunto não foi informado. Deseja incluí-lo agora?';
+$messages['nosubjectwarning'] = 'O campo assunto não foi informado. Deseja incluí-lo agora?';
 $messages['nobodywarning'] = 'Enviar a mensagem sem texto?';
 $messages['notsentwarning'] = 'A mensegem não foi enviada, deseja excluí-la?';
 $messages['noldapserver'] = 'Por favor, selecione um servidor LDAP para a pesquisa';
@@ -72,11 +71,14 @@ $messages['converting'] = 'Removendo formatação da Mensagem...';
 $messages['messageopenerror'] = 'Não foi possível carregar a mensagem do servidor';
 $messages['fileuploaderror'] = 'Falha ao enviar o arquivo';
 $messages['filesizeerror'] = 'O Arquivo enviado excede o tamanho máximo de $size';
-
-$messages['copysuccess'] = '$nr endereços copiados com sucesso';
+$messages['copysuccess'] = '$nr endereço(s) copiado(s) com sucesso';
 $messages['copyerror'] = 'Não foi possível copiar quaisquer endereços';
-$messages['sourceisreadonly'] = 'Esta fonte de endereços é somente leitura';
+$messages['sourceisreadonly'] = 'Esta fonte de endereço é somente leitura';
 $messages['errorsavingcontact'] = 'Não foi possível salvar o endereço de contato.';
 $messages['movingmessage'] = 'Movendo mensagem...';
+$messages['receiptsent'] = 'Confirmação de Leitura enviada com sucesso.';
+$messages['errorsendingreceipt'] = 'Não foi possível enviar a confirmação de leitura.';
+$messages['nodeletelastidentity'] = 'Você não pode excluir sua única identidade.';
+$messages['addsubfolderhint'] = 'Esta pasta será criada como uma sub-pasta da que está selecionada.';
 
 ?>
\ No newline at end of file
index b346ee6cd96a719dfbe55fb71fe8c9ed97151ebd..9b6391e37e01c485714f2130db1b798cd2a6a598 100644 (file)
@@ -6,7 +6,7 @@
  | language/pt_PT/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -15,7 +15,7 @@
  |          Fernando Silva <fernando.silva@openquest.pt>                 |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 873 2007-10-16 19:06:34Z yllar $
+ @version $Id: labels.inc 1068 2008-02-13 19:24:23Z yllar $
 
 */
 
@@ -89,6 +89,9 @@ $labels['lastmessage'] = 'Última mensagem';
 $labels['lastmessages'] = 'Última página';
 $labels['backtolist'] = 'Voltar';
 $labels['viewsource'] = 'Mostrar código fonte';
+$labels['markmessages'] = 'Marcar mensagens';
+$labels['markread'] = 'Como lidas';
+$labels['markunread'] = 'Como não lidas';
 $labels['select'] = 'Seleccionar';
 $labels['all'] = 'Todas';
 $labels['none'] = 'Nenhuma';
@@ -126,6 +129,10 @@ $labels['plaintoggle'] = 'Texto simples';
 $labels['addcc'] = 'Adicionar Cc';
 $labels['addbcc'] = 'Adicionar Bcc';
 $labels['addreplyto'] = 'Adicionar "Responder para"';
+$labels['mdnrequest'] = 'O remetente desta mensagem pediu para ser notificado quando esta fosse lida. Deseja enviar uma notificação?';
+$labels['receiptread'] = 'Recibo de leitura';
+$labels['yourmessage'] = 'Isto é um recibo de leitura da sua mensagem';
+$labels['receiptnote'] = 'Nota: este recibo apenas indica que a mensagem foi aberta pelo destinatário. Não garante que a mensagem foi lida ou compreendida.';
 $labels['name'] = 'Nome completo';
 $labels['firstname'] = 'Primeiro nome';
 $labels['surname'] = 'Apelido';
@@ -173,6 +180,7 @@ $labels['folder'] = 'Pasta';
 $labels['folders'] = 'Pastas';
 $labels['foldername'] = 'Nome da pasta';
 $labels['subscribed'] = 'Subscrito';
+$labels['messagecount'] = 'Mensagens';
 $labels['create'] = 'Criar';
 $labels['createfolder'] = 'Criar nova pasta';
 $labels['rename'] = 'Renomear';
index ccb4fa1d5bc7bc0156fd5be7d0a3ea6c79c858ef..9d273101703ca441ddb59b27c85980b0fccf4782 100644 (file)
@@ -6,7 +6,7 @@
  | language/pt_PT/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |          João Vale <jpvale@gmail.com>                                 |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 873 2007-10-16 19:06:34Z yllar $
+ @version $Id: messages.inc 1068 2008-02-13 19:24:23Z yllar $
 
 */
 
@@ -75,5 +75,9 @@ $messages['copyerror'] = 'Não foi possível copiar os endereços';
 $messages['sourceisreadonly'] = 'Esta fonte de endereços é só de leitura';
 $messages['errorsavingcontact'] = 'Não foi possível guardar o endereço de contacto';
 $messages['movingmessage'] = 'Movendo mensagem...';
+$messages['receiptsent'] = 'Recibo de leitura enviado';
+$messages['errorsendingreceipt'] = 'Não foi possível enviar o recibo';
+$messages['nodeletelastidentity'] = 'Esta é a última identidade, não é possível apagá-la.';
+$messages['addsubfolderhint'] = 'Esta pasta será criada como uma sub-pasta da que está seleccionada';
 
 ?>
index 0712c4288fa0fd4f3078a6122c2881eefafd1bf0..2ca0e5d45cb8d38a3c6e7cfffb12fd9e5a27c8b0 100644 (file)
@@ -6,15 +6,15 @@
  | language/ro/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Daniel Anechitoaie - danieLs  <daniels@safereaction.ro>       |
+ | Author: Daniel Anechitoaie - danieLs <daniels@safereaction.ro>        |
  |         Ispas Dorin <dorinxp2004@yahoo.com>                           |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 550 2007-05-01 19:07:56Z thomasb $
+ @version $Id: labels.inc 1149 2008-02-28 19:52:09Z thomasb $
 
 */
 
@@ -75,7 +75,8 @@ $labels['writenewmessage'] = 'Creaza mesaj nou';
 $labels['replytomessage'] = 'Raspunde la mesaj';
 $labels['replytoallmessage'] = 'Raspunde la toti';
 $labels['forwardmessage'] = 'Trimite mesajul mai departe';
-$labels['deletemessage'] = 'Trimmite mesajul la gunoi';
+$labels['deletemessage'] = 'Trimite mesajul la gunoi';
+$labels['movemessagetotrash'] = 'Muta mesajul la gunoi';
 $labels['printmessage'] = 'Listeaza mesajul';
 $labels['previousmessage'] = 'Afiseaza mesajul anterior';
 $labels['previousmessages'] = 'Afiseaza setul anterior de mesaje';
@@ -87,6 +88,9 @@ $labels['lastmessage'] = 'Afiseaza ultimul mesaj';
 $labels['lastmessages'] = 'Afiseaza ultimul set de mesaje';
 $labels['backtolist'] = 'Inapoi la lista cu mesaje';
 $labels['viewsource'] = 'Afiseaza sursa';
+$labels['markmessages'] = 'Marcheaza mesajele';
+$labels['markread'] = 'Ca citit';
+$labels['markunread'] = 'Ca necitit';
 $labels['select'] = 'Selecteaza';
 $labels['all'] = 'Toate';
 $labels['none'] = 'Nici unul';
@@ -100,8 +104,8 @@ $labels['unlimited'] = 'nelimitat';
 $labels['quicksearch'] = 'Cautare rapida';
 $labels['resetsearch'] = 'Resetare cautare';
 $labels['compose'] = 'Compune mesaj';
-$labels['sendmessage'] = 'Trimite mesaj';
 $labels['savemessage'] = 'Salveaza aceasta ciorna';
+$labels['sendmessage'] = 'Trimite mesaj';
 $labels['addattachment'] = 'Ataseaza fisier';
 $labels['charset'] = 'Set de caractere';
 $labels['editortype'] = 'Tip de editor';
@@ -121,6 +125,13 @@ $labels['nosubject'] = '(fara subiect)';
 $labels['showimages'] = 'Afiseaza imagini';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Text simplu';
+$labels['addcc'] = 'Adauga Cc';
+$labels['addbcc'] = 'Adauga Bcc';
+$labels['addreplyto'] = 'Adauga Raspunde-La';
+$labels['mdnrequest'] = 'Expeditorul acestui mesaj a solicitat sa fie notificat la cititrea mesajului. Doriti sa notificati expeditorul?';
+$labels['receiptread'] = 'Returneaza confirmare (citit)';
+$labels['yourmessage'] = 'Aceasta este o confirmare a mesajului dumneavoastra.';
+$labels['receiptnote'] = 'Nota: Aceasta confirmare doar va informeaza ca mesajul a fost afisat pe calculatorul destinatarului. Nu este nici o garantie ca destinatarul a citit sau a inteles continutul mesajului.';
 $labels['name'] = 'Nume de afisat';
 $labels['firstname'] = 'Nume';
 $labels['surname'] = 'Prenume';
@@ -168,6 +179,7 @@ $labels['folder'] = 'Dosar';
 $labels['folders'] = 'Dosare';
 $labels['foldername'] = 'Nume dosar';
 $labels['subscribed'] = 'Inscris';
+$labels['messagecount'] = 'Mesaje';
 $labels['create'] = 'Creaza';
 $labels['createfolder'] = 'Creaza dosar nou';
 $labels['rename'] = 'Redenumeste';
index 9e8f6ecfa702948f88666a8c8a25665030cf3a69..562bab7c3ce3804e6f843020500776c41511961a 100644 (file)
@@ -6,7 +6,7 @@
  | language/ro/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Ispas Dorin <dorinxp2004@yahoo.com>                           |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 550 2007-05-01 19:07:56Z thomasb $
+ @version $Id: messages.inc 1149 2008-02-28 19:52:09Z thomasb $
 
 */
 
@@ -23,7 +23,7 @@ $messages['loginfailed'] = 'Autentificare esuata';
 $messages['cookiesdisabled'] = 'Browserul dumneavoastra nu accepta cookies';
 $messages['sessionerror'] = 'Sesiunea dumneavoastra este invalida sau a expirat';
 $messages['imaperror'] = 'Conectarea la serverul IMAP a esuat';
-$messages['nomessagesfound'] = 'Nu a fost gasit niciun mesaj in aceasta casuta postala';
+$messages['nomessagesfound'] = 'Nu a fost gasit nici un mesaj in aceasta casuta postala';
 $messages['loggedout'] = 'Sesiune incheiata cu succes. La revedere!';
 $messages['mailboxempty'] = 'Casuta postala este goala';
 $messages['loading'] = 'Se incarca...';
@@ -38,7 +38,7 @@ $messages['addedsuccessfully'] = 'Contactul a fost adaugat cu succes in agenda';
 $messages['contactexists'] = 'Mai exista un contact cu aceasta adresa de e-mail';
 $messages['blockedimages'] = 'Pentru a va proteja intimitatea imaginile externe au fost blocate.';
 $messages['encryptedmessage'] = 'Acesta este un mesaj criptat si nu poate fi afisat. Ne pare rau.';
-$messages['nocontactsfound'] = 'Nu s-a gasit niciun contact';
+$messages['nocontactsfound'] = 'Nu s-a gasit nici un contact';
 $messages['contactnotfound'] = 'Contactul solicitat nu a fost gasit.';
 $messages['sendingfailed'] = 'Nu s-a reusit trimiterea mesajului';
 $messages['errorsaving'] = 'A intervenit o eroare in timp ce se efectua salvarea';
@@ -57,10 +57,10 @@ $messages['nosubjectwarning'] = 'Mesajul nu are subiect. Vreti sa introduceti un
 $messages['nobodywarning'] = 'Trimiteti acest mesaj fara text?';
 $messages['notsentwarning'] = 'Mesajul nu a fost trimis. Vreti sa renuntatati la el?';
 $messages['noldapserver'] = 'Va rugam alegeti un server ldap pentru cautare';
-$messages['nocontactsreturned'] = 'Nu s-a gasit niciun contact';
+$messages['nocontactsreturned'] = 'Nu s-a gasit nici un contact';
 $messages['nosearchname'] = 'Va rugam introduceti un nume de contact sau adresa de e-mail';
 $messages['searchsuccessful'] = '$nr mesaje gasite';
-$messages['searchnomatch'] = 'Cautarea nu a returnat niciun rezultat';
+$messages['searchnomatch'] = 'Cautarea nu a returnat nici un rezultat';
 $messages['searching'] = 'Se cauta...';
 $messages['checking'] = 'Se verifica...';
 $messages['nospellerrors'] = 'Nu s-a gasit nicio greseala de ortografie';
@@ -74,5 +74,10 @@ $messages['copysuccess'] = 'Am copiat cu succes $nr de adrese';
 $messages['copyerror'] = 'Nu am putut copia nici o adresa';
 $messages['sourceisreadonly'] = 'Sursa adrese este "read-only"(se poate doar citi)';
 $messages['errorsavingcontact'] = 'Nu am putut salva adresa de contact';
+$messages['movingmessage'] = 'Mutare mesaj....';
+$messages['receiptsent'] = 'Confirmarea a fost trimisa cu succes';
+$messages['errorsendingreceipt'] = 'Confirmarea nu a putut fi trimisa';
+$messages['nodeletelastidentity'] = 'Nu putesti sterge aceasta identitate, este ultima.';
+$messages['addsubfolderhint'] = 'Acest dosar va fi creat ca subdosar al celui selectat.';
 
 ?>
\ No newline at end of file
index 6c13682deea194cc5966ad8ebe0959b2e9331023..a7ba51755427f10346f722e1f9d6aba956839245 100644 (file)
@@ -6,15 +6,16 @@
  | language/ru_RU/labels.inc                                             |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Maxim Zenin <maxx@webmechanics.ru>                            |
  |         Vladimir Kulev <me@lightoze.net>                              |
+ |         Artur Smolkin <admin@roundcube.ru>                            |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 584 2007-05-24 03:49:19Z estadtherr $
+ @version $Id: labels.inc 1134 2008-02-22 15:05:18Z yllar $
 
 */
 
@@ -76,6 +77,7 @@ $labels['replytomessage'] = 'Ответить';
 $labels['replytoallmessage'] = 'Ответить всем';
 $labels['forwardmessage'] = 'Переслать';
 $labels['deletemessage'] = 'В корзину';
+$labels['movemessagetotrash'] = 'Переместить сообщение в корзину';
 $labels['printmessage'] = 'Печать';
 $labels['previousmessage'] = 'Показать предыдущее сообщение';
 $labels['previousmessages'] = 'Предыдущее';
@@ -87,6 +89,9 @@ $labels['lastmessage'] = 'Показать последнее сообщение
 $labels['lastmessages'] = 'Последнее сообщение';
 $labels['backtolist'] = 'К списку сообщений';
 $labels['viewsource'] = 'Исходный текст';
+$labels['markmessages'] = 'Отметить сообщение';
+$labels['markread'] = 'как прочитанное';
+$labels['markunread'] = 'как непрочитанное';
 $labels['select'] = 'Выбрать';
 $labels['all'] = 'Все';
 $labels['none'] = 'Ничего';
@@ -100,8 +105,8 @@ $labels['unlimited'] = 'без ограничений';
 $labels['quicksearch'] = 'Быстрый поиск';
 $labels['resetsearch'] = 'Сброс';
 $labels['compose'] = 'Написать сообщение';
-$labels['sendmessage'] = 'Отправить сейчас';
 $labels['savemessage'] = 'Сохранить черновик';
+$labels['sendmessage'] = 'Отправить сейчас';
 $labels['addattachment'] = 'Добавить вложение';
 $labels['charset'] = 'Кодировка';
 $labels['editortype'] = 'Редактор';
@@ -121,6 +126,13 @@ $labels['nosubject'] = '(без темы)';
 $labels['showimages'] = 'Показать изображения';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Обычный текст';
+$labels['addcc'] = 'Копия';
+$labels['addbcc'] = 'Скрытая копия';
+$labels['addreplyto'] = 'Обратный адрес';
+$labels['mdnrequest'] = 'Отправитель этого сообщения запросил уведомление о прочтении. Отправить уведомление?';
+$labels['receiptread'] = 'Уведомление о прочтении';
+$labels['yourmessage'] = 'Это уведомление о прочтении вашего сообщения';
+$labels['receiptnote'] = 'Это уведомление означает только, что сообщение было открыто получателем, и не гарантирует того, что оно было прочитано и (или) понято.';
 $labels['name'] = 'Отображаемое имя';
 $labels['firstname'] = 'Имя';
 $labels['surname'] = 'Фамилия';
@@ -168,6 +180,7 @@ $labels['folder'] = 'Папка';
 $labels['folders'] = 'Папки';
 $labels['foldername'] = 'Имя папки';
 $labels['subscribed'] = 'Подписан';
+$labels['messagecount'] = 'сообщения';
 $labels['create'] = 'Создать';
 $labels['createfolder'] = 'Создать новую папку';
 $labels['rename'] = 'Переименовать';
index 2e576168b0489f87ac4d2ef6b241cae48b13b7a2..8e54291e9a7e74c0cb4d42bbd5810984d8462866 100644 (file)
@@ -6,15 +6,16 @@
  | language/ru_RU/messages.inc                                           |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Maxim Zenin <maxx@webmechanics.ru>                            |
  |         Vladimir Kulev <me@lightoze.net>                              |
+ |         Artur Smolkin <admin@roundcube.ru>                            |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 584 2007-05-24 03:49:19Z estadtherr $
+ @version $Id: messages.inc 1134 2008-02-22 15:05:18Z yllar $
 
 */
 
@@ -74,5 +75,10 @@ $messages['copysuccess'] = 'Скопировано $nr адресов';
 $messages['copyerror'] = 'Невозможно скопировать адреса';
 $messages['sourceisreadonly'] = 'Данный источник адресов только для чтения';
 $messages['errorsavingcontact'] = 'Невозможно сохранить адрес контакта';
+$messages['movingmessage'] = 'Перемещение сообщения…';
+$messages['receiptsent'] = 'Уведомление о прочтении отправлено';
+$messages['errorsendingreceipt'] = 'Уведомление о прочтении не отправлено';
+$messages['nodeletelastidentity'] = 'Вы не можете удалить этот профиль, он у вас последний';
+$messages['addsubfolderhint'] = 'Эта папка будет создана как подпапка в текущей папке';
 
 ?>
\ No newline at end of file
index c1e19f599a613f0b3cc106a6957992cc80b43a85..d8fa1bdd1ced80e01b4542996d2189b1d6e02f0b 100644 (file)
@@ -6,15 +6,16 @@
  | language/se/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Fredrik Nygren <f.nygren@gmail.com>                           |
- |         Andreas Henriksson <andreas@fatal.se>                         |
+ |         Andreas Henriksson <andreas@fatal.se>                                                |
+ |                Jonas Näsholm <hostmaster@bitfuse.net>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: labels.inc 1143 2008-02-26 20:50:10Z yllar $
 
 */
 
@@ -25,7 +26,7 @@ $labels['password'] = 'Lösenord';
 $labels['server'] = 'Server';
 $labels['login'] = 'Logga in';
 $labels['logout'] = 'Logga ut';
-$labels['mail'] = 'E-post';
+$labels['mail'] = 'Meddelanden';
 $labels['settings'] = 'Personliga inställningar';
 $labels['addressbook'] = 'Adressbok';
 $labels['inbox'] = 'Inkorg';
@@ -45,7 +46,7 @@ $labels['priority'] = 'Prioritet';
 $labels['organization'] = 'Organisation';
 $labels['reply-to'] = 'Svara till';
 $labels['mailboxlist'] = 'Mappar';
-$labels['messagesfromto'] = 'Meddelanden $from till $to av $count';
+$labels['messagesfromto'] = 'Meddelande $from till $to av $count';
 $labels['messagenrof'] = 'Meddelande $nr av $count';
 $labels['moveto'] = 'flytta till...';
 $labels['download'] = 'ladda ner';
@@ -70,12 +71,13 @@ $labels['thursday'] = 'Torsdag';
 $labels['friday'] = 'Fredag';
 $labels['saturday'] = 'Lördag';
 $labels['today'] = 'Idag';
-$labels['checkmail'] = 'Hämta ny e-post';
+$labels['checkmail'] = 'Hämta nya meddelanden';
 $labels['writenewmessage'] = 'Skapa nytt meddelande';
-$labels['replytomessage'] = 'Svar på meddelande';
-$labels['replytoallmessage'] = 'Svar till avsändare och alla mottagare';
+$labels['replytomessage'] = 'Svara avsändaren';
+$labels['replytoallmessage'] = 'Svara avsändaren och alla mottagare';
 $labels['forwardmessage'] = 'Vidarebefordra meddelande';
-$labels['deletemessage'] = 'Flytta meddelande till papperskorgen';
+$labels['deletemessage'] = 'Radera meddelande';
+$labels['movemessagetotrash'] = 'Flytta meddelande till papperskorgen';
 $labels['printmessage'] = 'Skriv ut';
 $labels['previousmessage'] = 'Visa föregående meddelande';
 $labels['previousmessages'] = 'Visa tidigare grupp av meddelanden';
@@ -87,12 +89,15 @@ $labels['lastmessage'] = 'Visa sista meddelandet';
 $labels['lastmessages'] = 'Visa sista gruppen av meddelanden';
 $labels['backtolist'] = 'Tillbaka till meddelandelistan';
 $labels['viewsource'] = 'Visa källa';
+$labels['markmessages'] = 'Markera meddelande';
+$labels['markread'] = 'Som läst';
+$labels['markunread'] = 'Som oläst';
 $labels['select'] = 'Välj';
 $labels['all'] = 'Alla';
 $labels['none'] = 'Ingen';
-$labels['unread'] = 'Oläst';
+$labels['unread'] = 'Olästa';
 $labels['compact'] = 'Packa';
-$labels['empty'] = 'Tom';
+$labels['empty'] = 'Töm';
 $labels['purge'] = 'Rensa';
 $labels['quota'] = 'Diskutrymme';
 $labels['unknown'] = 'okänd';
@@ -100,9 +105,9 @@ $labels['unlimited'] = 'obegränsad';
 $labels['quicksearch'] = 'Snabbsök';
 $labels['resetsearch'] = 'Återställ sökning';
 $labels['compose'] = 'Skapa nytt meddelande';
-$labels['sendmessage'] = 'Skicka meddelande nu';
 $labels['savemessage'] = 'Spara utkast';
-$labels['addattachment'] = 'Bifoga en fil';
+$labels['sendmessage'] = 'Skicka meddelande';
+$labels['addattachment'] = 'Bifoga fil';
 $labels['charset'] = 'Teckenkodning';
 $labels['editortype'] = 'Typ av redigerare';
 $labels['returnreceipt'] = 'Mottagarkvitto';
@@ -110,7 +115,7 @@ $labels['checkspelling'] = 'Kontrollera stavning';
 $labels['resumeediting'] = 'Återuppta redigering';
 $labels['revertto'] = 'Återgå till';
 $labels['attachments'] = 'Bilagor';
-$labels['upload'] = 'Uppladdning';
+$labels['upload'] = 'Bifoga';
 $labels['close'] = 'Stäng';
 $labels['low'] = 'Låg';
 $labels['lowest'] = 'Lägst';
@@ -121,10 +126,17 @@ $labels['nosubject'] = '(inget ämne)';
 $labels['showimages'] = 'Visa bilder';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Oformaterad text';
+$labels['addcc'] = 'Kopia';
+$labels['addbcc'] = 'Hemlig kopia';
+$labels['addreplyto'] = 'Svara till';
+$labels['mdnrequest'] = 'Avsändaren har bett om att bli uppmärksammad när du läst det här meddelandet. Vill du skicka uppmärksamma avsändaren?';
+$labels['receiptread'] = 'Svarskvitto (läst)';
+$labels['yourmessage'] = 'Det här är ett svarskvitto för ditt meddelande';
+$labels['receiptnote'] = 'Notera: Det här kvittot berättar bara att meddelandet visats på mottagarens dator. Det finns ingen garanti att mottagaren har läst och förstått innehållet i meddelandet';
 $labels['name'] = 'Visa namn';
 $labels['firstname'] = 'Förnamn';
 $labels['surname'] = 'Efternamn';
-$labels['email'] = 'E-post';
+$labels['email'] = 'Meddelande';
 $labels['addcontact'] = 'Lägg till ny kontakt';
 $labels['editcontact'] = 'Redigera kontakt';
 $labels['edit'] = 'Redigera';
@@ -133,7 +145,7 @@ $labels['save'] = 'Spara';
 $labels['delete'] = 'Radera';
 $labels['newcontact'] = 'Skapa nytt kontaktkort';
 $labels['deletecontact'] = 'Radera valda kontakter';
-$labels['composeto'] = 'Skriv e-post till';
+$labels['composeto'] = 'Skriv meddelande till';
 $labels['contactsfromto'] = 'Kontakter $from till $to av $count';
 $labels['print'] = 'Skriv ut';
 $labels['export'] = 'Exportera';
@@ -168,6 +180,7 @@ $labels['folder'] = 'Mapp';
 $labels['folders'] = 'Mappar';
 $labels['foldername'] = 'Mappnamn';
 $labels['subscribed'] = 'Ansluten';
+$labels['messagecount'] = 'Meddelanden';
 $labels['create'] = 'Skapa';
 $labels['createfolder'] = 'Skapa ny mapp';
 $labels['rename'] = 'Byt namn';
index a51cc5cfd4e1ae751b32f2f4119107281fb793e1..fa8a153bd7c75d4df1a82111393cbdc339d66b31 100644 (file)
@@ -6,42 +6,43 @@
  | language/se/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Fredrik Nygren <f.nygren@gmail.com>                           |
- |         Andreas Henriksson <andreas@fatal.se>                         |
+ |         Andreas Henriksson <andreas@fatal.se>                                                |
+ |                Jonas Näsholm <hostmaster@bitfuse.net>                        |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: messages.inc 1143 2008-02-26 20:50:10Z yllar $
 
 */
 
 $messages = array();
 $messages['loginfailed'] = 'Inloggningen misslyckades';
 $messages['cookiesdisabled'] = 'Din webbläsare accepterar inte cookies';
-$messages['sessionerror'] = 'Din session är felaktig eller har gått ut';
+$messages['sessionerror'] = 'Din inloggning är felaktig eller har gått ut';
 $messages['imaperror'] = 'Kontakt med IMAP-servern misslyckades';
-$messages['nomessagesfound'] = 'Inga meddelanden hittades i din inkorg';
-$messages['loggedout'] = 'Du har framgångsrikt avslutat din session. Hej då!';
-$messages['mailboxempty'] = 'Postlådan är tom';
+$messages['nomessagesfound'] = 'Inga meddelanden';
+$messages['loggedout'] = 'Du är utloggad. Välkommen åter!';
+$messages['mailboxempty'] = 'Mappen är tom';
 $messages['loading'] = 'Laddar...';
 $messages['loadingdata'] = 'Laddar data...';
-$messages['checkingmail'] = 'Letar efter ny e-post...';
+$messages['checkingmail'] = 'Letar efter nya meddelanden...';
 $messages['sendingmessage'] = 'Skickar meddelande...';
 $messages['messagesent'] = 'Meddelandet har skickats';
 $messages['savingmessage'] = 'Sparar meddelande...';
 $messages['messagesaved'] = 'Meddelande sparades till utkast';
 $messages['successfullysaved'] = 'Sparat';
 $messages['addedsuccessfully'] = 'Kontakten har lagts till i adressboken';
-$messages['contactexists'] = 'En kontakt med den här e-postadressen finns redan';
+$messages['contactexists'] = 'En kontakt med den här adressen finns redan';
 $messages['blockedimages'] = 'För att skydda dig är bilder blockerade.';
-$messages['encryptedmessage'] = 'Det här ett krypterat meddelande som inte kan visas. Tyvärr!';
+$messages['encryptedmessage'] = 'Meddelandet är krypterat och kan tyvärr inte visas.';
 $messages['nocontactsfound'] = 'Inga kontakter hittades';
 $messages['contactnotfound'] = 'Den efterfrågade kontanten hittades inte';
-$messages['sendingfailed'] = 'Misslyckades med att skicka meddelandet';
-$messages['errorsaving'] = 'Ett fel uppstod vid sparandet';
+$messages['sendingfailed'] = 'Meddelandet kunde inte skickas';
+$messages['errorsaving'] = 'Ett fel uppstod när meddelandet sparades';
 $messages['errormoving'] = 'Meddelandet kunde inte flyttas';
 $messages['errordeleting'] = 'Meddelandet kunde inte raderas';
 $messages['deletecontactconfirm'] = 'Vill du verkligen radera valda kontakter?';
@@ -49,7 +50,7 @@ $messages['deletemessagesconfirm'] = 'Vill du verkligen ta bort valda meddelande
 $messages['deletefolderconfirm'] = 'Vill du verkligen radera den här mappen?';
 $messages['purgefolderconfirm'] = 'Vill du verkligen radera alla meddelanden i den här mappen?';
 $messages['formincomplete'] = 'Formuläret var inte ifyllt i sin helhet';
-$messages['noemailwarning'] = 'Vänligen ange en giltig e-postadress';
+$messages['noemailwarning'] = 'Vänligen ange en giltig adress';
 $messages['nonamewarning'] = 'Vänligen ange ett namn';
 $messages['nopagesizewarning'] = 'Vänligen ange en sidstorlek';
 $messages['norecipientwarning'] = 'Vänligen ange minst en mottagare';
@@ -58,7 +59,7 @@ $messages['nobodywarning'] = 'Skicka det här meddelandet utan text?';
 $messages['notsentwarning'] = 'Meddelande har inte skickats. Vill du avbryta meddelandet?';
 $messages['noldapserver'] = 'Vänligen ange en LDAP-server att söka';
 $messages['nocontactsreturned'] = 'Inga kontakter hittades';
-$messages['nosearchname'] = 'Vänligen ange ett kontaktnamn eller e-postadress';
+$messages['nosearchname'] = 'Vänligen ange ett kontaktnamn eller eadress';
 $messages['searchsuccessful'] = '$nr meddelanden hittades';
 $messages['searchnomatch'] = 'Sökningen returnerade inga träffar';
 $messages['searching'] = 'Söker...';
@@ -74,5 +75,10 @@ $messages['copysuccess'] = 'Lyckad kopiering av $nr adresser';
 $messages['copyerror'] = 'Kunde inte kopiera några adresser';
 $messages['sourceisreadonly'] = 'Denna adresskälla är skrivskyddad';
 $messages['errorsavingcontact'] = 'Kunde inte spara kontakt-adressen';
+$messages['movingmessage'] = 'Flyttar meddelande...';
+$messages['receiptsent'] = 'Ett läskvitto har skickats';
+$messages['errorsendingreceipt'] = 'Kunde inte skicka läskvittot';
+$messages['nodeletelastidentity'] = 'Du kan inte radera den här identiteten, det är din sista.';
+$messages['addsubfolderhint'] = 'Den här mappen kommer att skapas som en underkatalog till den valda';
 
 ?>
\ No newline at end of file
index 98ab215add9a651b5f0af910d7e4fe77644795ca..4bd63066ddd4681dd6a77071004e1420932a1894 100644 (file)
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | language/si/labels.inc                                                |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Melanga Dissanayake <Melanga.Dissanayake@pabcbank.com>        |
- +-----------------------------------------------------------------------+
-
-*/
-
-$labels = array();
-$labels['welcome'] = '$product ආයුබොවන්';
-$labels['username'] = 'නම';
-$labels['password'] = 'මුරපදය';
-$labels['server'] = 'පද්ධතිය';
-$labels['login'] = 'අතුල්වීම';
-$labels['logout'] = 'පිටවීම';
-$labels['mail'] = 'විද්යුත් තැපෑල';
-$labels['settings'] = 'පොද්ගලික කට්ටල අංග';
-$labels['addressbook'] = 'ලිපින පොත';
-$labels['inbox'] = 'ඇතුල්වීම්';
-$labels['drafts'] = 'කටු සටහන්';
-$labels['sent'] = 'පිටවුම්';
-$labels['trash'] = 'ලටපට';
-$labels['junk'] = 'සුන්බුන්';
-$labels['subject'] = 'මාතෘකාව';
-$labels['from'] = 'යවන්නා';
-$labels['to'] = 'ලබන්නා';
-$labels['cc'] = 'පිටපත් කිරීම්';
-$labels['bcc'] = 'අඳ පිටපත් කිරීම්';
-$labels['replyto'] = 'පිළිතුරු සඳහා';
-$labels['date'] = 'දිනය';
-$labels['size'] = 'ප්රමාණය';
-$labels['priority'] = 'ප්රමුඛතාව';
-$labels['organization'] = 'සංවිධානය';
-$labels['reply-to'] = 'පිළිතුරු සඳහා';
-$labels['mailboxlist'] = 'ෆෝල්ඩරය';
-$labels['messagesfromto'] = '$from ගෙන් $to පනිවුඩ $count';
-$labels['messagenrof'] = 'පනිවුඩය $count න් $nr ';
-$labels['moveto'] = 'ගෙනයෑම...';
-$labels['download'] = 'බාගතකිරීම';
-$labels['filename'] = 'ගොනුවේ නම';
-$labels['filesize'] = 'ගොනුවේ ප්රමාණය';
-$labels['preferhtml'] = 'HTML විදහා පෙන්වීම';
-$labels['htmlmessage'] = 'HTML පනිවුඩය';
-$labels['prettydate'] = 'සුරුබුහුටි දින';
-$labels['addtoaddressbook'] = 'ලිපින පොතට එකතු කරන්න';
-$labels['sun'] = 'ඉරිදා';
-$labels['mon'] = 'සඳුදා';
-$labels['tue'] = 'අගහ';
-$labels['wed'] = 'බදාදා';
-$labels['thu'] = 'බ්රහස්';
-$labels['fri'] = 'සිකුරා';
-$labels['sat'] = 'සෙනසු';
-$labels['sunday'] = 'ඉරිදා';
-$labels['monday'] = 'සඳුදා';
-$labels['tuesday'] = 'අගහරුවාදා';
-$labels['wednesday'] = 'බදාදා';
-$labels['thursday'] = 'බ්රහස්පතිනිදා';
-$labels['friday'] = 'සිකුරාදා';
-$labels['saturday'] = 'සෙනසුරාදා';
-$labels['today'] = 'අද';
-$labels['checkmail'] = 'අඵත් පනිවුඩ සඳහා පිරික්සීම';
-$labels['writenewmessage'] = 'අඵත් පනිවුඩක්';
-$labels['replytomessage'] = 'පනිවුඩයට පිළිතුරු';
-$labels['replytoallmessage'] = 'එවන්නාට සහ සැමට පිළිතුරු';
-$labels['forwardmessage'] = 'පනිවුඩය ඉදිරියට';
-$labels['deletemessage'] = 'පනිවුඩය ලටපට තුලට ගෙනයන්න';
-$labels['printmessage'] = 'පනිවුඩය මුද්රනය කරන්න';
-$labels['previousmessage'] = 'කලින් පනිවුඩය පෙන්නන්න';
-$labels['previousmessages'] = 'කලින් පනිවුඩ කට්ටලය පෙන්නන්න';
-$labels['firstmessage'] = 'පළමුවන පනිවුඩය පෙන්නන්න';
-$labels['firstmessages'] = 'පළමුවන පනිවුඩ කට්ටලය පෙන්නන්න';
-$labels['nextmessage'] = 'මීළඟ පනිවුඩය පෙන්නන්න';
-$labels['nextmessages'] = 'මීළඟ පනිවුඩ කට්ටලය පෙන්නන්න';
-$labels['lastmessage'] = 'අවසාන පනිවුඩය පෙන්නන්න';
-$labels['lastmessages'] = 'අවසාන පනිවුඩ කට්ටලය පෙන්නන්න';
-$labels['backtolist'] = 'නැවතත් පනිවුඩ ලැයිස්තුවට';
-$labels['viewsource'] = 'මූලාශ්රය පෙන්නන්න';
-$labels['select'] = 'තෝරාගන්න';
-$labels['all'] = 'සියලු';
-$labels['none'] = 'තෝරානොගත්';
-$labels['unread'] = 'නොකියවූ';
-$labels['compact'] = 'සංයුක්ත';
-$labels['empty'] = 'රික්ත';
-$labels['purge'] = 'විරේචන';
-$labels['quota'] = 'භාවිතය';
-$labels['unknown'] = 'නාඳුනන';
-$labels['unlimited'] = 'අසීමිත';
-$labels['quicksearch'] = 'ඉක්මන් සෙවුම';
-$labels['resetsearch'] = 'සෙවුම යලි පිහිටවීම';
-$labels['compose'] = 'පනිවුඩයක් සෑදීම';
-$labels['sendmessage'] = 'පනිවුඩය දැන් යවන්න';
-$labels['savemessage'] = 'කටු සටහනේ තැන්පත කරන්න';
-$labels['addattachment'] = 'ගොනුවක් ඇතුලත් කිරීම';
-$labels['charset'] = 'අකුරැ කට්ටලය';
-$labels['editortype'] = 'සම්පාදන ආකාරය';
-$labels['returnreceipt'] = 'නැවත ලබන්නා';
-$labels['checkspelling'] = 'වචන පරීක්ෂාව';
-$labels['resumeediting'] = 'සම්පාදන නැවත ඇරඹීම';
-$labels['revertto'] = 'ආපසු ඒම';
-$labels['attachments'] = 'ගොනු';
-$labels['upload'] = 'ඇතුල් කරීම';
-$labels['close'] = 'වැසීම';
-$labels['low'] = 'අඩු';
-$labels['lowest'] = 'අඩුම';
-$labels['normal'] = 'සමක';
-$labels['high'] = 'ඉහළ';
-$labels['highest'] = 'ඉහළම';
-$labels['nosubject'] = '(මාතෘකාව නොමැති)';
-$labels['showimages'] = 'රූප පෙන්නන්න';
-$labels['htmltoggle'] = 'HTML';
-$labels['plaintoggle'] = 'පැහැදිලි අකුරු';
-$labels['name'] = 'නම පෙන්නන්න';
-$labels['firstname'] = 'පළමු නම';
-$labels['surname'] = 'අවසාන නම';
-$labels['email'] = 'ද්යුත් තැපෑල';
-$labels['addcontact'] = 'ලිපින පොතට එකතු කරන්න';
-$labels['editcontact'] = 'ලිපිනය වෙනස් කිරීම';
-$labels['edit'] = 'වෙනස් කිරීම';
-$labels['cancel'] = 'අවලංගු කරීම';
-$labels['save'] = 'තැන්පත් කිරීම';
-$labels['delete'] = 'මකා දැමීම';
-$labels['newcontact'] = 'අඵත් ලිපින පතක් සෑදීම';
-$labels['deletecontact'] = 'තෝරාගත් ලිපින මකා දැමන්න';
-$labels['composeto'] = 'පනිවුඩයක් සෑදීම';
-$labels['contactsfromto'] = '$from ගෙන් $to ලිපින $count';
-$labels['print'] = 'මුද්රණය';
-$labels['export'] = 'නිර්යාත';
-$labels['previouspage'] = 'කලින් කට්ටලය පෙන්නන්න';
-$labels['firstpage'] = 'පළමුවන කට්ටලය පෙන්නන්න';
-$labels['nextpage'] = 'මීළඟ කට්ටලය පෙන්නන්න';
-$labels['lastpage'] = 'අවසාන කට්ටලය පෙන්නන්න';
-$labels['groups'] = 'කණ්ඩායම්';
-$labels['personaladrbook'] = 'පොද්ගලික ලිපිනය';
-$labels['settingsfor'] = 'සඳහා කට්ටල අංග';
-$labels['preferences'] = 'අභිමතය';
-$labels['userpreferences'] = 'පරිශීලක අභිමතය';
-$labels['editpreferences'] = 'පරිශීලක අභිමතය වෙනස් කිරීම්';
-$labels['identities'] = 'අනන්නයතාව';
-$labels['manageidentities'] = 'මෙම ගිණුමෙ අනන්නයතාව හැසිරවීම';
-$labels['newidentity'] = 'අඵත් අනන්නයතාව';
-$labels['newitem'] = 'අඵත් අයිතම';
-$labels['edititem'] = 'අයිතම වෙනස් කිරීම්';
-$labels['setdefault'] = 'පළමු තත්වයට';
-$labels['language'] = 'භාෂාව';
-$labels['timezone'] = 'කාල කලාපය';
-$labels['pagesize'] = 'පිටුවකටඅ පේළි';
-$labels['signature'] = 'අත්සන';
-$labels['dstactive'] = 'දිවා එළිය ඉතිරි කිරීම';
-$labels['htmleditor'] = 'HTML පනිවුඩයක් සෑදීම';
-$labels['htmlsignature'] = 'HTML අත්සන';
-$labels['previewpane'] = 'පූර්වදර්ශන කොටස පෙන්නන්න';
-$labels['autosavedraft'] = 'ස්වයංක්රීයව කටු සටහනේ තැන්පත් කරන්න';
-$labels['everynminutes'] = 'සෑම මිනිත්තු $n';
-$labels['never'] = 'කිසි විටෙකත් නැති';
-$labels['folder'] = 'ෆෝල්ඩරය';
-$labels['folders'] = 'ෆෝල්ඩර';
-$labels['foldername'] = 'ෆෝල්ඩරයේ නම';
-$labels['subscribed'] = 'සාමාජික';
-$labels['create'] = 'සෑදීම';
-$labels['createfolder'] = 'අඵත් ෆෝල්ඩරයක් සෑදීම';
-$labels['rename'] = 'නැවත නම් කිරීම';
-$labels['renamefolder'] = 'ෆෝල්ඩරය නැවත නම් කිරීම';
-$labels['deletefolder'] = 'ෆෝල්ඩරය මකා දැමීම';
-$labels['managefolders'] = 'හැසිරවීම හැසිරවීම';
-$labels['sortby'] = 'චිසින් වර්ග කිරීම';
-$labels['sortasc'] = 'ආරෝහණ වර්ග කිරීම';
-$labels['sortdesc'] = 'අවරෝහණ වර්ග කිරීම';
-
+<?php\r
+\r
+/*\r
+ +-----------------------------------------------------------------------+\r
+ | language/si/labels.inc                                                |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Melanga Dissanayake <Melanga.Dissanayake@pabcbank.com>        |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$labels = array();\r
+$labels['welcome'] = '$product ආයුබොවන්';\r
+$labels['username'] = 'නම';\r
+$labels['password'] = 'මුරපදය';\r
+$labels['server'] = 'පද්ධතිය';\r
+$labels['login'] = 'අතුල්වීම';\r
+$labels['logout'] = 'පිටවීම';\r
+$labels['mail'] = 'විද්යුත් තැපෑල';\r
+$labels['settings'] = 'පොද්ගලික කට්ටල අංග';\r
+$labels['addressbook'] = 'ලිපින පොත';\r
+$labels['inbox'] = 'ඇතුල්වීම්';\r
+$labels['drafts'] = 'කටු සටහන්';\r
+$labels['sent'] = 'පිටවුම්';\r
+$labels['trash'] = 'ලටපට';\r
+$labels['junk'] = 'සුන්බුන්';\r
+$labels['subject'] = 'මාතෘකාව';\r
+$labels['from'] = 'යවන්නා';\r
+$labels['to'] = 'ලබන්නා';\r
+$labels['cc'] = 'පිටපත් කිරීම්';\r
+$labels['bcc'] = 'අඳ පිටපත් කිරීම්';\r
+$labels['replyto'] = 'පිළිතුරු සඳහා';\r
+$labels['date'] = 'දිනය';\r
+$labels['size'] = 'ප්රමාණය';\r
+$labels['priority'] = 'ප්රමුඛතාව';\r
+$labels['organization'] = 'සංවිධානය';\r
+$labels['reply-to'] = 'පිළිතුරු සඳහා';\r
+$labels['mailboxlist'] = 'ෆෝල්ඩරය';\r
+$labels['messagesfromto'] = '$from ගෙන් $to පනිවුඩ $count';\r
+$labels['messagenrof'] = 'පනිවුඩය $count න් $nr ';\r
+$labels['moveto'] = 'ගෙනයෑම...';\r
+$labels['download'] = 'බාගතකිරීම';\r
+$labels['filename'] = 'ගොනුවේ නම';\r
+$labels['filesize'] = 'ගොනුවේ ප්රමාණය';\r
+$labels['preferhtml'] = 'HTML විදහා පෙන්වීම';\r
+$labels['htmlmessage'] = 'HTML පනිවුඩය';\r
+$labels['prettydate'] = 'සුරුබුහුටි දින';\r
+$labels['addtoaddressbook'] = 'ලිපින පොතට එකතු කරන්න';\r
+$labels['sun'] = 'ඉරිදා';\r
+$labels['mon'] = 'සඳුදා';\r
+$labels['tue'] = 'අගහ';\r
+$labels['wed'] = 'බදාදා';\r
+$labels['thu'] = 'බ්රහස්';\r
+$labels['fri'] = 'සිකුරා';\r
+$labels['sat'] = 'සෙනසු';\r
+$labels['sunday'] = 'ඉරිදා';\r
+$labels['monday'] = 'සඳුදා';\r
+$labels['tuesday'] = 'අගහරුවාදා';\r
+$labels['wednesday'] = 'බදාදා';\r
+$labels['thursday'] = 'බ්රහස්පතිනිදා';\r
+$labels['friday'] = 'සිකුරාදා';\r
+$labels['saturday'] = 'සෙනසුරාදා';\r
+$labels['today'] = 'අද';\r
+$labels['checkmail'] = 'අඵත් පනිවුඩ සඳහා පිරික්සීම';\r
+$labels['writenewmessage'] = 'අඵත් පනිවුඩක්';\r
+$labels['replytomessage'] = 'පනිවුඩයට පිළිතුරු';\r
+$labels['replytoallmessage'] = 'එවන්නාට සහ සැමට පිළිතුරු';\r
+$labels['forwardmessage'] = 'පනිවුඩය ඉදිරියට';\r
+$labels['deletemessage'] = 'පනිවුඩය ලටපට තුලට ගෙනයන්න';\r
+$labels['movemessagetotrash'] = 'පණිවුඩය ලටපට වෙත ගෙන යන්න';\r
+$labels['printmessage'] = 'පනිවුඩය මුද්රනය කරන්න';\r
+$labels['previousmessage'] = 'කලින් පනිවුඩය පෙන්නන්න';\r
+$labels['previousmessages'] = 'කලින් පනිවුඩ කට්ටලය පෙන්නන්න';\r
+$labels['firstmessage'] = 'පළමුවන පනිවුඩය පෙන්නන්න';\r
+$labels['firstmessages'] = 'පළමුවන පනිවුඩ කට්ටලය පෙන්නන්න';\r
+$labels['nextmessage'] = 'මීළඟ පනිවුඩය පෙන්නන්න';\r
+$labels['nextmessages'] = 'මීළඟ පනිවුඩ කට්ටලය පෙන්නන්න';\r
+$labels['lastmessage'] = 'අවසාන පනිවුඩය පෙන්නන්න';\r
+$labels['lastmessages'] = 'අවසාන පනිවුඩ කට්ටලය පෙන්නන්න';\r
+$labels['backtolist'] = 'නැවතත් පනිවුඩ ලැයිස්තුවට';\r
+$labels['viewsource'] = 'මූලාශ්රය පෙන්නන්න';\r
+$labels['markmessages'] = 'පණිවුඩ';\r
+$labels['markread'] = 'කියවු ලෙස සළකුණු කරන්න';\r
+$labels['markunread'] = 'නොකියවු ලෙස සළකුණු කරන්න';\r
+$labels['select'] = 'තෝරාගන්න';\r
+$labels['all'] = 'සියලු';\r
+$labels['none'] = 'තෝරානොගත්';\r
+$labels['unread'] = 'නොකියවූ';\r
+$labels['compact'] = 'සංයුක්ත';\r
+$labels['empty'] = 'රික්ත';\r
+$labels['purge'] = 'විරේචන';\r
+$labels['quota'] = 'භාවිතය';\r
+$labels['unknown'] = 'නාඳුනන';\r
+$labels['unlimited'] = 'අසීමිත';\r
+$labels['quicksearch'] = 'ඉක්මන් සෙවුම';\r
+$labels['resetsearch'] = 'සෙවුම යලි පිහිටවීම';\r
+$labels['compose'] = 'පනිවුඩයක් සෑදීම';\r
+$labels['savemessage'] = 'කටු සටහනේ තැන්පත කරන්න';\r
+$labels['sendmessage'] = 'පනිවුඩය දැන් යවන්න';\r
+$labels['addattachment'] = 'ගොනුවක් ඇතුලත් කිරීම';\r
+$labels['charset'] = 'අකුරැ කට්ටලය';\r
+$labels['editortype'] = 'සම්පාදන ආකාරය';\r
+$labels['returnreceipt'] = 'නැවත ලබන්නා';\r
+$labels['checkspelling'] = 'වචන පරීක්ෂාව';\r
+$labels['resumeediting'] = 'සම්පාදන නැවත ඇරඹීම';\r
+$labels['revertto'] = 'ආපසු ඒම';\r
+$labels['attachments'] = 'ගොනු';\r
+$labels['upload'] = 'ඇතුල් කරීම';\r
+$labels['close'] = 'වැසීම';\r
+$labels['low'] = 'අඩු';\r
+$labels['lowest'] = 'අඩුම';\r
+$labels['normal'] = 'සමක';\r
+$labels['high'] = 'ඉහළ';\r
+$labels['highest'] = 'ඉහළම';\r
+$labels['nosubject'] = '(මාතෘකාව නොමැති)';\r
+$labels['showimages'] = 'රූප පෙන්නන්න';\r
+$labels['htmltoggle'] = 'HTML';\r
+$labels['plaintoggle'] = 'පැහැදිලි අකුරු';\r
+$labels['addcc'] = 'Cc එක් කරන්න';\r
+$labels['addbcc'] = 'Bcc එක් කරන්න';\r
+$labels['addreplyto'] = '\'පිළිතුරු සඳහා\' එක් කරන්න';\r
+$labels['mdnrequest'] = 'මෙම පණිවුඩය එවන්නා ඔබ එය කියවු බව අසයි. එය දැන්වීමට ඔබ කැමතිද?';\r
+$labels['receiptread'] = 'ලැබීම් ලදුපත (කියවීම)';\r
+$labels['yourmessage'] = 'මෙය ඔබගේ පණිවුඩයේ ලැබීම් ලදුපතයි';\r
+$labels['receiptnote'] = 'සටහන: ලැබීම් ලදුපත මගින් මෙම පණිවුඩය කියවූ බව හෝ තේරුම් ගත් බව ගම්‍ය නොවේ. පණිවුඩය ලබන්නාට පෙන්නුම් කල බවටට සාක්ෂියක් පමණි';\r
+$labels['name'] = 'නම පෙන්නන්න';\r
+$labels['firstname'] = 'පළමු නම';\r
+$labels['surname'] = 'අවසාන නම';\r
+$labels['email'] = 'ද්යුත් තැපෑල';\r
+$labels['addcontact'] = 'ලිපින පොතට එකතු කරන්න';\r
+$labels['editcontact'] = 'ලිපිනය වෙනස් කිරීම';\r
+$labels['edit'] = 'වෙනස් කිරීම';\r
+$labels['cancel'] = 'අවලංගු කරීම';\r
+$labels['save'] = 'තැන්පත් කිරීම';\r
+$labels['delete'] = 'මකා දැමීම';\r
+$labels['newcontact'] = 'අඵත් ලිපින පතක් සෑදීම';\r
+$labels['deletecontact'] = 'තෝරාගත් ලිපින මකා දැමන්න';\r
+$labels['composeto'] = 'පනිවුඩයක් සෑදීම';\r
+$labels['contactsfromto'] = '$from ගෙන් $to ලිපින $count';\r
+$labels['print'] = 'මුද්රණය';\r
+$labels['export'] = 'නිර්යාත';\r
+$labels['previouspage'] = 'කලින් කට්ටලය පෙන්නන්න';\r
+$labels['firstpage'] = 'පළමුවන කට්ටලය පෙන්නන්න';\r
+$labels['nextpage'] = 'මීළඟ කට්ටලය පෙන්නන්න';\r
+$labels['lastpage'] = 'අවසාන කට්ටලය පෙන්නන්න';\r
+$labels['groups'] = 'කණ්ඩායම්';\r
+$labels['personaladrbook'] = 'පොද්ගලික ලිපිනය';\r
+$labels['settingsfor'] = 'සඳහා කට්ටල අංග';\r
+$labels['preferences'] = 'අභිමතය';\r
+$labels['userpreferences'] = 'පරිශීලක අභිමතය';\r
+$labels['editpreferences'] = 'පරිශීලක අභිමතය වෙනස් කිරීම්';\r
+$labels['identities'] = 'අනන්නයතාව';\r
+$labels['manageidentities'] = 'මෙම ගිණුමෙ අනන්නයතාව හැසිරවීම';\r
+$labels['newidentity'] = 'අඵත් අනන්නයතාව';\r
+$labels['newitem'] = 'අඵත් අයිතම';\r
+$labels['edititem'] = 'අයිතම වෙනස් කිරීම්';\r
+$labels['setdefault'] = 'පළමු තත්වයට';\r
+$labels['language'] = 'භාෂාව';\r
+$labels['timezone'] = 'කාල කලාපය';\r
+$labels['pagesize'] = 'පිටුවකටඅ පේළි';\r
+$labels['signature'] = 'අත්සන';\r
+$labels['dstactive'] = 'දිවා එළිය ඉතිරි කිරීම';\r
+$labels['htmleditor'] = 'HTML පනිවුඩයක් සෑදීම';\r
+$labels['htmlsignature'] = 'HTML අත්සන';\r
+$labels['previewpane'] = 'පූර්වදර්ශන කොටස පෙන්නන්න';\r
+$labels['autosavedraft'] = 'ස්වයංක්රීයව කටු සටහනේ තැන්පත් කරන්න';\r
+$labels['everynminutes'] = 'සෑම මිනිත්තු $n';\r
+$labels['never'] = 'කිසි විටෙකත් නැති';\r
+$labels['folder'] = 'ෆෝල්ඩරය';\r
+$labels['folders'] = 'ෆෝල්ඩර';\r
+$labels['foldername'] = 'ෆෝල්ඩරයේ නම';\r
+$labels['subscribed'] = 'සාමාජික';\r
+$labels['messagecount'] = 'පනිවුඩ';\r
+$labels['create'] = 'සෑදීම';\r
+$labels['createfolder'] = 'අඵත් ෆෝල්ඩරයක් සෑදීම';\r
+$labels['rename'] = 'නැවත නම් කිරීම';\r
+$labels['renamefolder'] = 'ෆෝල්ඩරය නැවත නම් කිරීම';\r
+$labels['deletefolder'] = 'ෆෝල්ඩරය මකා දැමීම';\r
+$labels['managefolders'] = 'හැසිරවීම හැසිරවීම';\r
+$labels['sortby'] = 'චිසින් වර්ග කිරීම';\r
+$labels['sortasc'] = 'ආරෝහණ වර්ග කිරීම';\r
+$labels['sortdesc'] = 'අවරෝහණ වර්ග කිරීම';\r
+\r
 ?>
\ No newline at end of file
index 3d5d92205d4eea7d1b8b30e33a4c7e3673006eb5..3729cbab64d32d47a1de3fe7e700daa5f4cceec8 100644 (file)
@@ -1,73 +1,81 @@
-<?
-/*
- +-----------------------------------------------------------------------+
- | language/si/messages.inc                                              |
- |                                                                       |
- | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
- | Licensed under the GNU GPL                                            |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Author: Melanga Dissanayake <Melanga.Dissanayake@pabcbank.com>        |
- +-----------------------------------------------------------------------+
-
-*/
-
-$messages = array();
-$messages['loginfailed'] = 'ඇතුල්වීම අසාර්ථකයි';
-$messages['cookiesdisabled'] = 'ඔබේ බෞසරය කුකී බාර ගන්නේ නැත';
-$messages['sessionerror'] = 'ඔබේ වාරය අවලංගු හෝ කාලය ඉකුත් වී ඇත';
-$messages['imaperror'] = 'IMAP සම්බන්ධතාවය අසාර්ථකයි';
-$messages['nomessagesfound'] = 'ලියුම් පෙට්ටියේ පනිවුඩ නැත';
-$messages['loggedout'] = 'ඔබගේ වාරය සාර්ථකව අවසන් විය. අයුබොවන්!';
-$messages['mailboxempty'] = 'ලියුම් පෙට්ටිය හිස්';
-$messages['loading'] = 'පූරනය...';
-$messages['loadingdata'] = 'දත්ත පූරනය...';
-$messages['checkingmail'] = 'අලුත් පනිවුඩ පරීක්ෂා කිරීම...';
-$messages['sendingmessage'] = 'පනිවුඩය යැවීම...';
-$messages['messagesent'] = 'පනිවුඩය සාර්ථකව යවන ලදී';
-$messages['savingmessage'] = 'පනිවුඩය තැන්පත් කීරීම...';
-$messages['messagesaved'] = 'පනිවුඩය කටු සටහනේ තැන්පත් විය';
-$messages['successfullysaved'] = 'සාර්ථකව තැන්පත විය';
-$messages['addedsuccessfully'] = 'ලිපිනය සාර්ථකව ලිපින පොතට එකතු කරන ලදී';
-$messages['contactexists'] = 'ඉහත ලිපිනය සහිත විද්යුත් තැපැල් ලිපිනයක් ලිපින පොතේ ඇත';
-$messages['blockedimages'] = 'ඔබගෙ පොද්ගලිකත්වය හේතුවෙන්, දුරස්ථ රූප අවහිර කර ඇත.';
-$messages['encryptedmessage'] = 'මෙම පනිවුඩය රහස් කේතනය කර ඇති බැවින් පෙන්විය නොහැක. සමාවන්න!';
-$messages['nocontactsfound'] = 'ලිපින සොයා ගත නොහැක';
-$messages['contactnotfound'] = 'ඉල්ලූ ලිපිනය සොයාගත නොහැක';
-$messages['sendingfailed'] = 'පනිවුඩය යැවීම අසාර්ථකයි';
-$messages['errorsaving'] = 'පනිවුඩය තැන්පත් කීරීමේදී දොෂයක් සිදු විය';
-$messages['errormoving'] = 'පනිවුඩය ගෙන යාමට නොහැක';
-$messages['errordeleting'] = 'පනිවුඩය මකා දැමීමට නොහැක';
-$messages['deletecontactconfirm'] = 'තෝරා ඇති ලිපින ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';
-$messages['deletemessagesconfirm'] = 'තෝරා ඇත පනිවුඩ ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';
-$messages['deletefolderconfirm'] = 'ෆෝල්ඩරය මකා දැමීමට සැබවින්ම වුවමනාද?';
-$messages['purgefolderconfirm'] = 'මෙම ෆෝල්ඩරයේ ඇති සියලුම පනිවුඩ ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';
-$messages['formincomplete'] = 'පෝරමය සම්පූර්ණයෙන් පුරවා නොමැත';
-$messages['noemailwarning'] = 'කරුණාකර වලංගු විද්යුත් තැපැල් ලිපිනයක් ඇතුලත් කරන්න';
-$messages['nonamewarning'] = 'කරුණාකර නම ඇතුලත් කරන්න';
-$messages['nopagesizewarning'] = 'කරුණාකර පිටුවේ ප්රමානය ඇතුලත් කරන්න';
-$messages['norecipientwarning'] = 'කරුණාකර යටත් පිරිසෙයින් එක් ලබන්නෙකු හෝ ඇතුලත් කරන්න';
-$messages['nosubjectwarning'] = '"මාතෘකාව" හිස්. මාතෘකාවක් අතුලත් කිරීමට ඔබ කැමතිද?';
-$messages['nobodywarning'] = 'මෙම හිස් පනිවුඩය යවන්නද?';
-$messages['notsentwarning'] = 'පනිවුඩය යැවීමට නොහැකි විය. ඔබට එය බැහැර කිරීමට වුවමනාද?';
-$messages['noldapserver'] = 'සෙවුම සඳහා කරුණාකර ldap සම්බන්ධතාවයක් තෝරා ගන්න';
-$messages['nocontactsreturned'] = 'ලිපින/ය සොයා ගත නොහැක';
-$messages['nosearchname'] = 'කරුණාකර ලිපිනයෙහි නම හෝ විද්යුත් තැපැල් ලිපිනය ඇතුලත් කරන්න';
-$messages['searchsuccessful'] = '$nr පනිවුඩය හමු විය';
-$messages['searchnomatch'] = 'සෙවුමට අදාල ගැලපීමක් නොමැත';
-$messages['searching'] = 'සොයමින් පවතී...';
-$messages['checking'] = 'පිරික්සමින් පවතී...';
-$messages['nospellerrors'] = 'වියාකරන දොෂ නොමැත';
-$messages['folderdeleted'] = 'ෆෝල්ඩරය සාර්ථකව මකා දමන ලදී';
-$messages['deletedsuccessfully'] = 'සාර්ථකව මකා දමන ලදී';
-$messages['converting'] = 'පනිවුඩයෙන් ආකෘතීකරණය ඉවත් කිරීම';
-$messages['messageopenerror'] = 'පනිවුඩය පූරනය කිරීමට නොහැක';
-$messages['fileuploaderror'] = 'ගොනුව ඇතුලත් කිරීමට නොහැක';
-$messages['filesizeerror'] = 'ඇතුලත් කල ගොනුවෙ ප්රමාණය උපරිම අගය $size ඉක්මවා ඇත';
-$messages['copysuccess'] = '$nr ලිපිනය සාර්ථකව පිටපත් කරන ලදී';
-$messages['copyerror'] = 'කවර ලිපිනයක්වත් හෝ පිටපත් කල නොහැක';
-$messages['sourceisreadonly'] = 'මෙම ලිපින මූලාශ්රය කියවීම සඳහා පමනි';
-$messages['errorsavingcontact'] = 'ලිපිනය තැන්පත් කීරීමට නොහැක';
-
+<?\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/si/messages.inc                                              |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Melanga Dissanayake <Melanga.Dissanayake@pabcbank.com>        |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed'] = 'ඇතුල්වීම අසාර්ථකයි';\r
+$messages['cookiesdisabled'] = 'ඔබේ බෞසරය කුකී බාර ගන්නේ නැත';\r
+$messages['sessionerror'] = 'ඔබේ වාරය අවලංගු හෝ කාලය ඉකුත් වී ඇත';\r
+$messages['imaperror'] = 'IMAP සම්බන්ධතාවය අසාර්ථකයි';\r
+$messages['nomessagesfound'] = 'ලියුම් පෙට්ටියේ පනිවුඩ නැත';\r
+$messages['loggedout'] = 'ඔබගේ වාරය සාර්ථකව අවසන් විය. අයුබොවන්!';\r
+$messages['mailboxempty'] = 'ලියුම් පෙට්ටිය හිස්';\r
+$messages['loading'] = 'පූරනය...';\r
+$messages['loadingdata'] = 'දත්ත පූරනය...';\r
+$messages['checkingmail'] = 'අලුත් පනිවුඩ පරීක්ෂා කිරීම...';\r
+$messages['sendingmessage'] = 'පනිවුඩය යැවීම...';\r
+$messages['messagesent'] = 'පනිවුඩය සාර්ථකව යවන ලදී';\r
+$messages['savingmessage'] = 'පනිවුඩය තැන්පත් කීරීම...';\r
+$messages['messagesaved'] = 'පනිවුඩය කටු සටහනේ තැන්පත් විය';\r
+$messages['successfullysaved'] = 'සාර්ථකව තැන්පත විය';\r
+$messages['addedsuccessfully'] = 'ලිපිනය සාර්ථකව ලිපින පොතට එකතු කරන ලදී';\r
+$messages['contactexists'] = 'ඉහත ලිපිනය සහිත විද්යුත් තැපැල් ලිපිනයක් ලිපින පොතේ ඇත';\r
+$messages['blockedimages'] = 'ඔබගෙ පොද්ගලිකත්වය හේතුවෙන්, දුරස්ථ රූප අවහිර කර ඇත.';\r
+$messages['encryptedmessage'] = 'මෙම පනිවුඩය රහස් කේතනය කර ඇති බැවින් පෙන්විය නොහැක. සමාවන්න!';\r
+$messages['nocontactsfound'] = 'ලිපින සොයා ගත නොහැක';\r
+$messages['contactnotfound'] = 'ඉල්ලූ ලිපිනය සොයාගත නොහැක';\r
+$messages['sendingfailed'] = 'පනිවුඩය යැවීම අසාර්ථකයි';\r
+$messages['errorsaving'] = 'පනිවුඩය තැන්පත් කීරීමේදී දොෂයක් සිදු විය';\r
+$messages['errormoving'] = 'පනිවුඩය ගෙන යාමට නොහැක';\r
+$messages['errordeleting'] = 'පනිවුඩය මකා දැමීමට නොහැක';\r
+$messages['deletecontactconfirm'] = 'තෝරා ඇති ලිපින ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';\r
+$messages['deletemessagesconfirm'] = 'තෝරා ඇත පනිවුඩ ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';\r
+$messages['deletefolderconfirm'] = 'ෆෝල්ඩරය මකා දැමීමට සැබවින්ම වුවමනාද?';\r
+$messages['purgefolderconfirm'] = 'මෙම ෆෝල්ඩරයේ ඇති සියලුම පනිවුඩ ඔබට මකා දැමීමට සැබවින්ම වුවමනාද?';\r
+$messages['formincomplete'] = 'පෝරමය සම්පූර්ණයෙන් පුරවා නොමැත';\r
+$messages['noemailwarning'] = 'කරුණාකර වලංගු විද්යුත් තැපැල් ලිපිනයක් ඇතුලත් කරන්න';\r
+$messages['nonamewarning'] = 'කරුණාකර නම ඇතුලත් කරන්න';\r
+$messages['nopagesizewarning'] = 'කරුණාකර පිටුවේ ප්රමානය ඇතුලත් කරන්න';\r
+$messages['norecipientwarning'] = 'කරුණාකර යටත් පිරිසෙයින් එක් ලබන්නෙකු හෝ ඇතුලත් කරන්න';\r
+$messages['nosubjectwarning'] = '"මාතෘකාව" හිස්. මාතෘකාවක් අතුලත් කිරීමට ඔබ කැමතිද?';\r
+$messages['nobodywarning'] = 'මෙම හිස් පනිවුඩය යවන්නද?';\r
+$messages['notsentwarning'] = 'පනිවුඩය යැවීමට නොහැකි විය. ඔබට එය බැහැර කිරීමට වුවමනාද?';\r
+$messages['noldapserver'] = 'සෙවුම සඳහා කරුණාකර ldap සම්බන්ධතාවයක් තෝරා ගන්න';\r
+$messages['nocontactsreturned'] = 'ලිපින/ය සොයා ගත නොහැක';\r
+$messages['nosearchname'] = 'කරුණාකර ලිපිනයෙහි නම හෝ විද්යුත් තැපැල් ලිපිනය ඇතුලත් කරන්න';\r
+$messages['searchsuccessful'] = '$nr පනිවුඩය හමු විය';\r
+$messages['searchnomatch'] = 'සෙවුමට අදාල ගැලපීමක් නොමැත';\r
+$messages['searching'] = 'සොයමින් පවතී...';\r
+$messages['checking'] = 'පිරික්සමින් පවතී...';\r
+$messages['nospellerrors'] = 'වියාකරන දොෂ නොමැත';\r
+$messages['folderdeleted'] = 'ෆෝල්ඩරය සාර්ථකව මකා දමන ලදී';\r
+$messages['deletedsuccessfully'] = 'සාර්ථකව මකා දමන ලදී';\r
+$messages['converting'] = 'පනිවුඩයෙන් ආකෘතීකරණය ඉවත් කිරීම';\r
+$messages['messageopenerror'] = 'පනිවුඩය පූරනය කිරීමට නොහැක';\r
+$messages['fileuploaderror'] = 'ගොනුව ඇතුලත් කිරීමට නොහැක';\r
+$messages['filesizeerror'] = 'ඇතුලත් කල ගොනුවෙ ප්රමාණය උපරිම අගය $size ඉක්මවා ඇත';\r
+$messages['copysuccess'] = '$nr ලිපිනය සාර්ථකව පිටපත් කරන ලදී';\r
+$messages['copyerror'] = 'කවර ලිපිනයක්වත් හෝ පිටපත් කල නොහැක';\r
+$messages['sourceisreadonly'] = 'මෙම ලිපින මූලාශ්රය කියවීම සඳහා පමනි';\r
+$messages['errorsavingcontact'] = 'ලිපිනය තැන්පත් කීරීමට නොහැක';\r
+$messages['movingmessage'] = 'පනිවුඩය ගෙනයමින් පවතී...';\r
+$messages['receiptsent'] = 'කියවීම් භාර ගැනීම සාර්ථකව යවන ලදී';\r
+$messages['errorsendingreceipt'] = 'කියවීම් භාර ගැනීම යැවීමට නොහැක';\r
+$messages['nodeletelastidentity'] = 'අවසාන අනන්‍යතාවය මකා දැමිය නොහැක';\r
+$messages['addsubfolderhint'] = 'ෆෝල්ඩරය දැනට තෝරාගෙන ඇති ෆෝල්ඩරයෙහි අනු ෆෝල්ඩරයක් ලෙස සෑදේ';\r
+\r
 ?>
\ No newline at end of file
index 624e5c36140b0de6690f5da31d77dec08794a3b4..14ef06d6a34ae0f92262ea1279f69ef4d6ac64f0 100644 (file)
@@ -6,15 +6,15 @@
  | language/sk/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Lukas Kraic <lukas.kraic@truni.sk>                            |
- |         Marek Kutnar marek19@zmail.sk>                                |
+ | Author: Marek Kutnar <marek19@zmail.sk>                               |
+ |         Lukas Kraic  <lukas.kraic@truni.sk>                           |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: labels.inc 1153 2008-02-28 20:04:12Z thomasb $
 
 */
 
@@ -75,7 +75,8 @@ $labels['writenewmessage'] = 'Vytvor novú správu';
 $labels['replytomessage'] = 'Odpovedať';
 $labels['replytoallmessage'] = 'Odpovedať všetkým';
 $labels['forwardmessage'] = 'Poslať ďalej';
-$labels['deletemessage'] = 'Presuň správu do koša';
+$labels['deletemessage'] = 'Zmazať správu';
+$labels['movemessagetotrash'] = 'Presunúť správu do koša';
 $labels['printmessage'] = 'Vytlač správu';
 $labels['previousmessage'] = 'Zobraziť predchádzajúcu správu';
 $labels['previousmessages'] = 'Zobraziť predchádzajúcu stránku správ';
@@ -87,6 +88,9 @@ $labels['lastmessage'] = 'Zobraziť poslednú správu';
 $labels['lastmessages'] = 'Zobraziť poslednú stránku správ';
 $labels['backtolist'] = 'Späť na zoznam správ';
 $labels['viewsource'] = 'Ukáž zdroj správy';
+$labels['markmessages'] = 'Označ správy';
+$labels['markread'] = 'Ako prečítané';
+$labels['markunread'] = 'Ako neprečítané';
 $labels['select'] = 'Výber';
 $labels['all'] = 'Všetky';
 $labels['none'] = 'Žiadnu';
@@ -100,8 +104,8 @@ $labels['unlimited'] = 'neobmedzené';
 $labels['quicksearch'] = 'Rýchle vyhľadávanie';
 $labels['resetsearch'] = 'Vyčisti vyhľadávanie';
 $labels['compose'] = 'Vytvoriť správu';
-$labels['sendmessage'] = 'Odoslať správu';
 $labels['savemessage'] = 'Uložiť do rozpísaných';
+$labels['sendmessage'] = 'Odoslať správu';
 $labels['addattachment'] = 'Pridať prílohu';
 $labels['charset'] = 'Znaková sada';
 $labels['editortype'] = 'Typ editora';
@@ -121,6 +125,13 @@ $labels['nosubject'] = '(bez predmetu)';
 $labels['showimages'] = 'Ukáž obrázky';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Čisty text';
+$labels['addcc'] = 'Pridať kópiu';
+$labels['addbcc'] = 'Pridať skrytú kopiu';
+$labels['addreplyto'] = 'Pridať odpoveď';
+$labels['mdnrequest'] = 'Odosielateľ tejto správy chce byť upozornený na to, že ste správu obdržali. Chcete potvrdiť prijatie správy?';
+$labels['receiptread'] = 'Potvrdenie o prijatí správy';
+$labels['yourmessage'] = 'Toto je potvrdenie o prijatí Vašej správy';
+$labels['receiptnote'] = 'Poznámka: Toto potvrdenie negarantuje, že správa bola príjemcom prečítaná a porozumel jej obsahu.';
 $labels['name'] = 'Celé meno';
 $labels['firstname'] = 'Meno';
 $labels['surname'] = 'Priezvisko';
@@ -168,6 +179,7 @@ $labels['folder'] = 'Zložka';
 $labels['folders'] = 'Zložky';
 $labels['foldername'] = 'Meno zložky';
 $labels['subscribed'] = 'Podpísaný';
+$labels['messagecount'] = 'Počet správ';
 $labels['create'] = 'Vytvoriť';
 $labels['createfolder'] = 'Vytvor novú zložku';
 $labels['rename'] = 'Premenovať';
@@ -178,4 +190,4 @@ $labels['sortby'] = 'Triediť podľa';
 $labels['sortasc'] = 'Triediť vzostupne';
 $labels['sortdesc'] = 'Triediť zostupne';
 
-?>
\ No newline at end of file
+?>
index efad6baeb62e3ea6df731409e0dd08d8e1f76100..955681014902d9f63aeea5f046bf175a1d03997b 100644 (file)
@@ -6,15 +6,15 @@
  | language/sk/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Lukas Kraic <lukas.kraic@truni.sk>                            |
- |         Marek Kutnar marek19@zmail.sk>                                |
+ | Author: Marek Kutnar <marek19@zmail.sk>                               |
+ |         Lukas Kraic  <lukas.kraic@truni.sk>                           |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
+ @version $Id: messages.inc 1153 2008-02-28 20:04:12Z thomasb $
 
 */
 
@@ -74,5 +74,10 @@ $messages['copysuccess'] = 'Úspešne skopírovanie $nr adries';
 $messages['copyerror'] = 'Nemôžem skopírovať žiadnu adresu';
 $messages['sourceisreadonly'] = 'Tento zdroj adries je len na čítanie';
 $messages['errorsavingcontact'] = 'Nemôžem uložit adresu kontaktu';
+$messages['movingmessage'] = 'Presúvam správu...';
+$messages['receiptsent'] = 'Potvrdenie o prijatí správy odoslané';
+$messages['errorsendingreceipt'] = 'Potvrdenie o prijatí správy nebolo možné odoslať';
+$messages['nodeletelastidentity'] = 'Identita sa nedá odstrániť, je posledná a musí zostať.';
+$messages['addsubfolderhint'] = 'Táto zložka bude vytvorená ako podzložka aktualne zvolenej zložky';
 
-?>
\ No newline at end of file
+?>
index 32396286a883c93a63400eec18ec8bfde9e0f97f..98e7fa92e213c26e357a83b724b166b4095feea2 100644 (file)
@@ -2,19 +2,19 @@
 
 /*
 
- +--------------------------------------------------------------------------------------+
- | language/si/labels.inc                                                               |
- |                                                                                      |
- | Language file of the RoundCube Webmail client                                        |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                                |
- | Licensed under the GNU GPL                                                           |
- |                                                                                      |
- +--------------------------------------------------------------------------------------+
- | Author: Andrej Sossi <asossi@dotcom.ts.it>                                           |
- |         Andrej Mocilnik <amocilnik@dotcom.ts.it>                                     |
- +--------------------------------------------------------------------------------------+
++-----------------------------------------------------------------------+
+| language/sl/labels.inc                                                |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Andrej Sossi <asossi@dotcom.ts.it>                            |
+|         Andrej Mocilnik <amocilnik@dotcom.ts.it>                      |
++-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 842 2007-10-01 13:55:02Z tomekp $
+@version $Id: labels.inc 1109 2008-02-17 20:22:05Z thomasb $
 
 */
 
@@ -36,7 +36,7 @@ $labels['junk'] = 'Nezaželena  sporočila';
 $labels['subject'] = 'Zadeva';
 $labels['from'] = 'Pošiljatelj';
 $labels['to'] = 'Prejemnik';
-$labels['cc'] = 'Kopija';
+$labels['cc'] = 'Kp';
 $labels['bcc'] = 'Skp';
 $labels['replyto'] = 'Odgovor na';
 $labels['date'] = 'Datum';
@@ -53,7 +53,7 @@ $labels['filename'] = 'Ime datoteke';
 $labels['filesize'] = 'Velikost datoteke';
 $labels['preferhtml'] = 'Prednostno HTML';
 $labels['htmlmessage'] = 'HTML sporočilo';
-$labels['prettydate'] = 'Čitljivejši datumi';
+$labels['prettydate'] = 'Bolj čitljivi datumi';
 $labels['addtoaddressbook'] = 'Dodaj v stike';
 $labels['sun'] = 'Ned';
 $labels['mon'] = 'Pon';
@@ -76,22 +76,26 @@ $labels['replytomessage'] = 'Odgovori na sporočilo';
 $labels['replytoallmessage'] = 'Odgovori pošiljatelju in vsem prejemnikom';
 $labels['forwardmessage'] = 'Posreduj sporočilo';
 $labels['deletemessage'] = 'Premakni sporočilo v smeti';
-$labels['printmessage'] = 'Tiskaj to sporočilo';
+$labels['movemessagetotrash'] = 'Premakni v smetnjak';
+$labels['printmessage'] = 'Natisni to sporočilo';
 $labels['previousmessage'] = 'Prikaži prejšnje sporočilo';
-$labels['previousmessages'] = 'Prikaži prejšni set sporočil';
+$labels['previousmessages'] = 'Prikaži prejšnja sporočila';
 $labels['firstmessage'] = 'Prikaži prvo sporočilo';
-$labels['firstmessages'] = 'Prikaži prvi set sporočil';
+$labels['firstmessages'] = 'Prikaži prva sporočila';
 $labels['nextmessage'] = 'Prikaži naslednjo sporočilo';
-$labels['nextmessages'] = 'Prikaži naslednji set sporočil';
+$labels['nextmessages'] = 'Prikaži naslednja sporočila';
 $labels['lastmessage'] = 'Prikaži zadnjo sporočilo';
-$labels['lastmessages'] = 'Prikaži zadnji set sporočil';
+$labels['lastmessages'] = 'Prikaži zadnja sporočila';
 $labels['backtolist'] = 'Nazaj na seznam sporočil';
 $labels['viewsource'] = 'Prikaži izvirno kodo';
+$labels['markmessages'] = 'Označi sporočilo';
+$labels['markread'] = 'Kot prebrano';
+$labels['markunread'] = 'Kot neprebrano';
 $labels['select'] = 'Izberi';
 $labels['all'] = 'Vse';
 $labels['none'] = 'Nobenih';
 $labels['unread'] = 'Neprebrano';
-$labels['compact'] = 'Stistni';
+$labels['compact'] = 'Stisni';
 $labels['empty'] = 'Izprazni';
 $labels['purge'] = 'Počisti';
 $labels['quota'] = 'Poraba diska';
@@ -100,8 +104,8 @@ $labels['unlimited'] = 'neomejena';
 $labels['quicksearch'] = 'Hitri iskalnik';
 $labels['resetsearch'] = 'Prekliči iskanje';
 $labels['compose'] = 'Sestavi sporočilo';
-$labels['sendmessage'] = 'Pošlji sporočilo zdaj';
 $labels['savemessage'] = 'Shrani kot osnutek';
+$labels['sendmessage'] = 'Pošlji sporočilo zdaj';
 $labels['addattachment'] = 'Pripni datoteko';
 $labels['charset'] = 'Nabor znakov';
 $labels['editortype'] = 'Vrsta urejevalnika';
@@ -121,6 +125,13 @@ $labels['nosubject'] = '(brez naslova)';
 $labels['showimages'] = 'Prikaži slike';
 $labels['htmltoggle'] = 'Obogateno besedilo (HTML)';
 $labels['plaintoggle'] = 'Samo besedilo';
+$labels['addcc'] = 'Dodaj Kp';
+$labels['addbcc'] = 'Dodaj Skp';
+$labels['addreplyto'] = 'Dodaj naslov za odgovor';
+$labels['mdnrequest'] = 'Pošiljatelj tega sporočila je zaprosil za portdilo, ko vi preberete to sporočilo. Hočete poslati obvestilo?';
+$labels['receiptread'] = 'Potrdilo o prebranem sporočilu';
+$labels['yourmessage'] = 'To je potrdilo, da je bilo vaše sporočilo prebrano';
+$labels['receiptnote'] = 'Pozor: to je samo potrdilo, da vaše sporočilo je bilo prikazano na prejemnikovem računalniku. To še ne pomeni, da je prejemnik prebral ali razumel vsebino vašega sporočila.';
 $labels['name'] = 'Ime za prikaz';
 $labels['firstname'] = 'Ime';
 $labels['surname'] = 'Priimek';
@@ -168,6 +179,7 @@ $labels['folder'] = 'Mapa';
 $labels['folders'] = 'Mape';
 $labels['foldername'] = 'Ime mape';
 $labels['subscribed'] = 'Vpisan';
+$labels['messagecount'] = 'Sporočila';
 $labels['create'] = 'Ustvari';
 $labels['createfolder'] = 'Ustvari novo mapo';
 $labels['rename'] = 'Preimenuj';
@@ -178,4 +190,4 @@ $labels['sortby'] = 'Uredi po';
 $labels['sortasc'] = 'Uredi naraščajoče';
 $labels['sortdesc'] = 'Uredi padajoče';
 
-?>
\ No newline at end of file
+?>
index f19a403db9cb5bb4eb07394e72909461400f4b1e..fab3c208c30b4ed76ec2532150d96e01dbd2a0f2 100644 (file)
@@ -2,19 +2,19 @@
 
 /*
 
- +--------------------------------------------------------------------------------------+
- | language/si/messages.inc                                                             |
- |                                                                                      |
- | Language file of the RoundCube Webmail client                                        |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                                |
- | Licensed under the GNU GPL                                                           |
- |                                                                                      |
- +--------------------------------------------------------------------------------------+
- | Author: Andrej Sossi <asossi@dotcom.ts.it>                                           |
- |         Andrej Mocilnik <amocilnik@dotcom.ts.it>                                     |
- +--------------------------------------------------------------------------------------+
++-----------------------------------------------------------------------+
+| language/sl/messages.inc                                              |
+|                                                                       |
+| Language file of the RoundCube Webmail client                         |
+| Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+| Licensed under the GNU GPL                                            |
+|                                                                       |
++-----------------------------------------------------------------------+
+| Author: Andrej Sossi <asossi@dotcom.ts.it>                            |
+|         Andrej Mocilnik <amocilnik@dotcom.ts.it>                      |
++-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 842 2007-10-01 13:55:02Z tomekp $
+@version $Id: messages.inc 1109 2008-02-17 20:22:05Z thomasb $
 
 */
 
@@ -31,7 +31,7 @@ $messages['loadingdata'] = 'Nalagam podatke...';
 $messages['checkingmail'] = 'Iščem nova sporočila...';
 $messages['sendingmessage'] = 'Pošiljam sporočilo...';
 $messages['messagesent'] = 'Sporočilo uspešno poslano';
-$messages['savingmessage'] = 'Shrenjujem sporočilo';
+$messages['savingmessage'] = 'Shranjujem sporočilo';
 $messages['messagesaved'] = 'Sporočilo shranjeno v osnutke';
 $messages['successfullysaved'] = 'Uspešno shranjeno';
 $messages['addedsuccessfully'] = 'Vizitka uspešno dodana';
@@ -74,5 +74,10 @@ $messages['copysuccess'] = 'Število prepisanih naslovov: $nr';
 $messages['copyerror'] = 'Ne morem prepisati nobenega naslova';
 $messages['sourceisreadonly'] = 'Izvirnik naslova je samo berljiv';
 $messages['errorsavingcontact'] = 'Ne morem shraniti vizitke';
+$messages['movingmessage'] = 'Premakni besedilo...';
+$messages['receiptsent'] = 'Potrdilo o prebranem sporočilu je bilo uspešno poslano';
+$messages['errorsendingreceipt'] = 'Nemogoče poslati potrdilo o prebranem sporočilu';
+$messages['nodeletelastidentity'] = 'Nemogoče zbrisati identitete. Ta je edina, ki imate.';
+$messages['addsubfolderhint'] = 'Mapa bo narejena kot podmapa trenutno izbrane mape';
 
-?>
\ No newline at end of file
+?>
diff --git a/program/localization/sq_AL/labels.inc b/program/localization/sq_AL/labels.inc
new file mode 100644 (file)
index 0000000..127bb88
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/sq_AL/labels.inc                                             |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Dashamir Hoxha <dhoxha@albaniaonline.net>                     |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'Mirëseerdhe te $product';
+$labels['username'] = 'Përdoruesi';
+$labels['password'] = 'Fjalëkalimi';
+$labels['server'] = 'Serveri';
+$labels['login'] = 'Hyr';
+$labels['logout'] = 'Dil';
+$labels['mail'] = 'Mesazhet';
+$labels['settings'] = 'Konfigurimi Personal';
+$labels['addressbook'] = 'Libri i Adresave';
+$labels['inbox'] = 'Ardhjet';
+$labels['drafts'] = 'Drafte';
+$labels['sent'] = 'Dërguar';
+$labels['trash'] = 'Fshirë';
+$labels['junk'] = 'Reklama';
+$labels['subject'] = 'Tema';
+$labels['from'] = 'Dërguesi';
+$labels['to'] = 'Marrësi';
+$labels['cc'] = 'Kopje';
+$labels['bcc'] = 'Bcc';
+$labels['replyto'] = 'Reply-To';
+$labels['date'] = 'Data';
+$labels['size'] = 'Madhësia';
+$labels['priority'] = 'Përparësia';
+$labels['organization'] = 'Organizata';
+$labels['reply-to'] = 'Reply-To';
+$labels['mailboxlist'] = 'Dosjet';
+$labels['messagesfromto'] = 'Mesazhet $from në $to nga $count';
+$labels['messagenrof'] = 'Mesazhi $nr nga $count';
+$labels['moveto'] = 'ço te...';
+$labels['download'] = 'shkarko';
+$labels['filename'] = 'Emër skedari';
+$labels['filesize'] = 'Madhësi skedari';
+$labels['preferhtml'] = 'Shfaq HTML';
+$labels['htmlmessage'] = 'Mesazh HTML';
+$labels['prettydate'] = 'Data të këndshme';
+$labels['addtoaddressbook'] = 'Shto në librin e adresave';
+$labels['sun'] = 'Dje';
+$labels['mon'] = 'Hën';
+$labels['tue'] = 'Mar';
+$labels['wed'] = 'Mër';
+$labels['thu'] = 'Enj';
+$labels['fri'] = 'Pre';
+$labels['sat'] = 'Sht';
+$labels['sunday'] = 'e djelë';
+$labels['monday'] = 'e hënë';
+$labels['tuesday'] = 'e martë';
+$labels['wednesday'] = 'e mërkurë';
+$labels['thursday'] = 'e enjte';
+$labels['friday'] = 'e premte';
+$labels['saturday'] = 'e shtunë';
+$labels['today'] = 'sot';
+$labels['checkmail'] = 'Shiko për mesazhe të reja';
+$labels['writenewmessage'] = 'Krijo një mesazh të ri';
+$labels['replytomessage'] = 'Ktheji përgjigje mesazhit';
+$labels['replytoallmessage'] = 'Ktheji përgjigje dërguesit dhe të gjithë marrësve';
+$labels['forwardmessage'] = 'Pasoje mesazhin';
+$labels['deletemessage'] = 'Fshije mesazhin';
+$labels['movemessagetotrash'] = 'Hidhe mesazhin në kosh';
+$labels['printmessage'] = 'Shtype këtë mesazh';
+$labels['previousmessage'] = 'Shfaq mesazhin e mëparshëm';
+$labels['previousmessages'] = 'Shfaq grupin e mëparshëm të mesazheve';
+$labels['firstmessage'] = 'Shfaq mesazhin e parë';
+$labels['firstmessages'] = 'Shfaq grupin e parë të mesazheve';
+$labels['nextmessage'] = 'Shfaq mesazhin pasardhës';
+$labels['nextmessages'] = 'Shfaq grupin tjetër të mesazheve';
+$labels['lastmessage'] = 'Shfaq mesazhin e fundit';
+$labels['lastmessages'] = 'Shfaq grupin e fundit të mesazheve';
+$labels['backtolist'] = 'Kthehu te lista e mesazheve';
+$labels['viewsource'] = 'Shfaq tekstin';
+$labels['markmessages'] = 'Shëno mesazhet';
+$labels['markread'] = 'Si të lexuara';
+$labels['markunread'] = 'Si të palexuara';
+$labels['select'] = 'Zgjidh';
+$labels['all'] = 'Të gjitha';
+$labels['none'] = 'Asnjë';
+$labels['unread'] = 'Palexuar';
+$labels['compact'] = 'Zvogëlo';
+$labels['empty'] = 'Boshatis';
+$labels['purge'] = 'Pastro';
+$labels['quota'] = 'Përdorimi i diskut';
+$labels['unknown'] = 'i panjohur';
+$labels['unlimited'] = 'i pakufizuar';
+$labels['quicksearch'] = 'Kërkim i shpejtë';
+$labels['resetsearch'] = 'Pastro kërkimin';
+$labels['compose'] = 'Shkruaj një mesazh';
+$labels['savemessage'] = 'Ruaje si draft';
+$labels['sendmessage'] = 'Dërgoje mesazhin tani';
+$labels['addattachment'] = 'Bashkangjit një skedar';
+$labels['charset'] = 'Bashkësi shkronjash';
+$labels['editortype'] = 'Lloj editori';
+$labels['returnreceipt'] = 'Njoftim marrje';
+$labels['checkspelling'] = 'Kontroll gabimesh';
+$labels['resumeediting'] = 'Vazhdo editimin';
+$labels['revertto'] = 'Ktheje te';
+$labels['attachments'] = 'Bashkangjitjet';
+$labels['upload'] = 'Ngarko';
+$labels['close'] = 'Mbyll';
+$labels['low'] = 'I ulët';
+$labels['lowest'] = 'Më i ulëti';
+$labels['normal'] = 'Normal';
+$labels['high'] = 'I lartë';
+$labels['highest'] = 'Më i larti';
+$labels['nosubject'] = '(pa subjekt)';
+$labels['showimages'] = 'Shfaq imazhet';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'TEXT';
+$labels['addcc'] = 'Shto Cc';
+$labels['addbcc'] = 'Shto Bcc';
+$labels['addreplyto'] = 'Shto Reply-To';
+$labels['mdnrequest'] = 'Dërguesi i këtij mesazhi ka kërkuar që të njoftohet kur ju të lexoni këtë mesazh. Dëshironi ta njoftoni dërguesin?';
+$labels['receiptread'] = 'Njoftim Leximi';
+$labels['yourmessage'] = 'Ky është një njoftim leximi për mesazhin tuaj';
+$labels['receiptnote'] = 'Shënim: Ky njoftim tregon vetëm që mesazhi u shfaq në kompjuterin e marrësit. Nuk ka siguri që marrësi e ka lexuar ose e ka kuptuar përmbajtjen e mesazhit.';
+$labels['name'] = 'Emri që thirret';
+$labels['firstname'] = 'Emri';
+$labels['surname'] = 'Mbiemri';
+$labels['email'] = 'E-Mail';
+$labels['addcontact'] = 'Shto një kontakt të ri';
+$labels['editcontact'] = 'Ndrysho kontaktin';
+$labels['edit'] = 'Ndrysho';
+$labels['cancel'] = 'Anullo';
+$labels['save'] = 'Ruaj';
+$labels['delete'] = 'Fshi';
+$labels['newcontact'] = 'Krijo nje kartë të re kontakti';
+$labels['deletecontact'] = 'Fshi kontaktet e zgjedhura';
+$labels['composeto'] = 'Shkruaj email për';
+$labels['contactsfromto'] = 'Kontaktet $from në $to nga $count';
+$labels['print'] = 'Shtyp';
+$labels['export'] = 'Eksporto';
+$labels['previouspage'] = 'Shfaq grupin e mëparshëm';
+$labels['firstpage'] = 'Shfaq grupin e parë';
+$labels['nextpage'] = 'Shfaq grupin tjetër';
+$labels['lastpage'] = 'Shfaq grupin e fundit';
+$labels['groups'] = 'Grupet';
+$labels['personaladrbook'] = 'Adresat Personale';
+$labels['settingsfor'] = 'Konfigurimet për';
+$labels['preferences'] = 'Preferencat';
+$labels['userpreferences'] = 'Preferencat e përdoruesit';
+$labels['editpreferences'] = 'Ndrysho preferencat e përdoruesit';
+$labels['identities'] = 'Identitetet';
+$labels['manageidentities'] = 'Manaxho identitetet per këtë llogari';
+$labels['newidentity'] = 'Identitet i ri';
+$labels['newitem'] = 'Element i ri';
+$labels['edititem'] = 'Ndrysho element';
+$labels['setdefault'] = 'Bëje identitet kryesor';
+$labels['language'] = 'Gjuha';
+$labels['timezone'] = 'Brezi orar';
+$labels['pagesize'] = 'Rreshtat për faqe';
+$labels['signature'] = 'Nënshkrim';
+$labels['dstactive'] = 'Ndryshim ore';
+$labels['htmleditor'] = 'Shkruaj mesazhe HTML';
+$labels['htmlsignature'] = 'Nënshkrimi HTML';
+$labels['previewpane'] = 'Shiko si duket';
+$labels['autosavedraft'] = 'Ruaje automatikisht si draft';
+$labels['everynminutes'] = 'çdo $n minuta';
+$labels['never'] = 'kurrë';
+$labels['folder'] = 'Kutia';
+$labels['folders'] = 'Kutitë';
+$labels['foldername'] = 'Emër kutie';
+$labels['subscribed'] = 'Regjistruar';
+$labels['messagecount'] = 'Mesazhe';
+$labels['create'] = 'Krijo';
+$labels['createfolder'] = 'Krijo kuti të re';
+$labels['rename'] = 'Riemëro';
+$labels['renamefolder'] = 'Riemëro kutinë';
+$labels['deletefolder'] = 'Fshi kutinë';
+$labels['managefolders'] = 'Sistemo kutitë';
+$labels['sortby'] = 'Rradhit sipas';
+$labels['sortasc'] = 'Rradhitje rritëse';
+$labels['sortdesc'] = 'Rradhitje zbritëse';
+
+?>
diff --git a/program/localization/sq_AL/messages.inc b/program/localization/sq_AL/messages.inc
new file mode 100644 (file)
index 0000000..f00e205
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/sq_AL/messages.inc                                           |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Dashamir Hoxha <dhoxha@albaniaonline.net>                     |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$messages = array();
+$messages['loginfailed'] = 'Hyrja dështoi';
+$messages['cookiesdisabled'] = 'Shfletuesi juaj nuk i pranon sheqerkat';
+$messages['sessionerror'] = 'Sesioni juaj është i pavlefshëm ose i ka kaluar afati';
+$messages['imaperror'] = 'Lidhja me serverin IMAP dështoi';
+$messages['nomessagesfound'] = 'Nuk ka mesazhe në këtë kuti postare';
+$messages['loggedout'] = 'Sesionin e mbyllët me sukses. Mirupafshim!';
+$messages['mailboxempty'] = 'Kutia postare është bosh';
+$messages['loading'] = 'Po ngarkohet...';
+$messages['loadingdata'] = 'Po ngarkohen të dhëna...';
+$messages['checkingmail'] = 'Po shoh për mesazhe të reja...';
+$messages['sendingmessage'] = 'Po dërgoj mesazhin...';
+$messages['messagesent'] = 'Mesazhi u dërgua me sukses';
+$messages['savingmessage'] = 'Po ruaj mesazhin...';
+$messages['messagesaved'] = 'Mesazhi u ruajt te kutia Drafte';
+$messages['successfullysaved'] = 'U ruajt me sukses';
+$messages['addedsuccessfully'] = 'Kontakti u shtua me sukses në librin e adresave';
+$messages['contactexists'] = 'Këtë adresë e-mail e ka një kontakt tjetër';
+$messages['blockedimages'] = 'Për të mbrojtur fshehtësinë tuaj, imazhet e largëta të këtij mesazhi janë bllokuar.';
+$messages['encryptedmessage'] = 'Ky është një mesazh i koduar dhe nuk mund te shfaqet. Më vjen keq!';
+$messages['nocontactsfound'] = 'Nuk ka kontakte';
+$messages['contactnotfound'] = 'Kontakti që kërkoni nuk gjendet';
+$messages['sendingfailed'] = 'Dërgimi i mesazhit dështoi';
+$messages['errorsaving'] = 'Pati nje problem gjatë ruajtjes';
+$messages['errormoving'] = 'Nuk e lëviza dot mesazhin';
+$messages['errordeleting'] = 'Nuk e fshiva dot mesazhin';
+$messages['deletecontactconfirm'] = 'Me të vërtetë doni ti fshini kontaktet e zgjedhura?';
+$messages['deletemessagesconfirm'] = 'Me të vërtetë doni ti fshini mesazhet e zgjedhura?';
+$messages['deletefolderconfirm'] = 'Me të vërtetë doni ta fshini këtë kuti?';
+$messages['purgefolderconfirm'] = 'Me të vërtetë doni ti fshini të gjitha mesazhet në këtë kuti?';
+$messages['formincomplete'] = 'Formulari nuk ishte i gjithi i plotësuar';
+$messages['noemailwarning'] = 'Ju lutem jepni një adresë email të rregullt';
+$messages['nonamewarning'] = 'Ju lutem jepni një emër';
+$messages['nopagesizewarning'] = 'Ju lutem jepni nje madhësi për faqen';
+$messages['norecipientwarning'] = 'Ju lutem shënoni të paktën një marrës';
+$messages['nosubjectwarning'] = 'Fusha e temës është bosh. Dëshironi të shënoni një temë tani?';
+$messages['nobodywarning'] = 'Ta dërgoj mesazhin pa tekst?';
+$messages['notsentwarning'] = 'Mesazhi nuk u dërgua. Doni ta hidhni poshtë mesazhin?';
+$messages['noldapserver'] = 'Ju lutem jepni një server ldap për të kërkuar';
+$messages['nocontactsreturned'] = 'Nuk gjeta kontakte';
+$messages['nosearchname'] = 'Ju lutem jepni një adresë email ose një emër kontakti';
+$messages['searchsuccessful'] = 'U gjetën $nr mesazhe';
+$messages['searchnomatch'] = 'Kërkimi nuk gjeti gjë';
+$messages['searching'] = 'Po kërkoj...';
+$messages['checking'] = 'Po kontrolloj...';
+$messages['nospellerrors'] = 'Nuk u gjetën gabime';
+$messages['folderdeleted'] = 'Kutia u fshi me sukses';
+$messages['deletedsuccessfully'] = 'U fshi me sukses';
+$messages['converting'] = 'Po i heq formatimin mesazhit...';
+$messages['messageopenerror'] = 'Nuk marr dot mesazhe nga serveri';
+$messages['fileuploaderror'] = 'Ngarkimi i skedarit dështoi';
+$messages['filesizeerror'] = 'Skedari i ngarkuar e kalon madhësinë kufi prej $size';
+$messages['copysuccess'] = 'U kopjuan me sukses $nr adresa';
+$messages['copyerror'] = 'Nuk munda të kopjoj adresat';
+$messages['sourceisreadonly'] = 'Ky burim adrese është vetëm i lexueshëm';
+$messages['errorsavingcontact'] = 'Nuk e ruajta dot adresën e kontaktit';
+$messages['movingmessage'] = 'Po lëviz mesazhin...';
+$messages['receiptsent'] = 'U dërgua me sukses një njoftim leximi';
+$messages['errorsendingreceipt'] = 'Nuk mund të dërgohet njoftimi';
+$messages['nodeletelastidentity'] = 'Ju nuk mund ta fshini këtë identitet sepse nuk ju ka mbetur tjetër.';
+$messages['addsubfolderhint'] = 'Kjo kuti do të krijohet si një nënkuti e asaj që është e zgjedhur';
+
+?>
diff --git a/program/localization/sr_cyrillic/labels.inc b/program/localization/sr_cyrillic/labels.inc
new file mode 100644 (file)
index 0000000..37ae6ec
--- /dev/null
@@ -0,0 +1,192 @@
+<?php\r
+\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/sr_cyrillic/labels.inc                                       |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Branko Kokanovic <branko.kokanovic@gmail.com                  |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$labels = array();\r
+$labels['welcome'] = 'Добродошли на $product';\r
+$labels['username'] = 'Корисничко име';\r
+$labels['password'] = 'Лозинка';\r
+$labels['server'] = 'Сервер';\r
+$labels['login'] = 'Пријава';\r
+$labels['logout'] = 'Одјава';\r
+$labels['mail'] = 'Сандуче';\r
+$labels['settings'] = 'Подешавања';\r
+$labels['addressbook'] = 'Именик';\r
+$labels['inbox'] = 'Примљене';\r
+$labels['drafts'] = 'Снимљене';\r
+$labels['sent'] = 'Послате';\r
+$labels['trash'] = 'Канта';\r
+$labels['junk'] = 'Смеће';\r
+$labels['subject'] = 'Наслов';\r
+$labels['from'] = 'Од';\r
+$labels['to'] = 'За';\r
+$labels['cc'] = 'Cc';\r
+$labels['bcc'] = 'Bcc';\r
+$labels['replyto'] = 'Reply-To';\r
+$labels['date'] = 'Датум';\r
+$labels['size'] = 'Величина';\r
+$labels['priority'] = 'Приоритет';\r
+$labels['organization'] = 'Организација';\r
+$labels['reply-to'] = 'Reply-To';\r
+$labels['mailboxlist'] = 'Фасцикле';\r
+$labels['messagesfromto'] = 'Поруке од $from за $to од укупно $count';\r
+$labels['messagenrof'] = 'Порука број $nr од $count';\r
+$labels['moveto'] = 'пребаци у...';\r
+$labels['download'] = 'преузми (скидање)';\r
+$labels['filename'] = 'Име датотекеe';\r
+$labels['filesize'] = 'Величина датотеке';\r
+$labels['preferhtml'] = 'Предност дај ХТМЛ формату';\r
+$labels['htmlmessage'] = 'ХТМЛ формат поруке';\r
+$labels['prettydate'] = 'Форматирани датум';\r
+$labels['addtoaddressbook'] = 'Додај у именик';\r
+$labels['sun'] = 'Нед';\r
+$labels['mon'] = 'Пон';\r
+$labels['tue'] = 'Уто';\r
+$labels['wed'] = 'Сре';\r
+$labels['thu'] = 'Чет';\r
+$labels['fri'] = 'Пет';\r
+$labels['sat'] = 'Суб';\r
+$labels['sunday'] = 'Недеља';\r
+$labels['monday'] = 'Понедељак';\r
+$labels['tuesday'] = 'Уторак';\r
+$labels['wednesday'] = 'Среда';\r
+$labels['thursday'] = 'Четвртак';\r
+$labels['friday'] = 'Петак';\r
+$labels['saturday'] = 'Субота';\r
+$labels['today'] = 'данас';\r
+$labels['checkmail'] = 'Провера нових порука';\r
+$labels['writenewmessage'] = 'Нова порука';\r
+$labels['replytomessage'] = 'Одговори на поруку';\r
+$labels['replytoallmessage'] = 'Одговори пошиљаоцу и свим примаоцима';\r
+$labels['forwardmessage'] = 'Проследи поруку';\r
+$labels['deletemessage'] = 'Извриши поруку';\r
+$labels['movemessagetotrash'] = 'Пребаци поруку у канту';\r
+$labels['printmessage'] = 'Одштампај поруку';\r
+$labels['previousmessage'] = 'Прикажи претходну поруку';\r
+$labels['previousmessages'] = 'Прикажи претходни скуп порука';\r
+$labels['firstmessage'] = 'Прикажи прву поруку';\r
+$labels['firstmessages'] = 'Прикажи први скуп порука';\r
+$labels['nextmessage'] = 'Прикажи следећу поруку';\r
+$labels['nextmessages'] = 'Прикажи следећи скуп порука';\r
+$labels['lastmessage'] = 'Прикажи последњу поруку';\r
+$labels['lastmessages'] = 'Прикажи последњи скуп порука';\r
+$labels['backtolist'] = 'Повратак на листу порука';\r
+$labels['viewsource'] = 'Прикажи поруку у изворном облику';\r
+$labels['markmessages'] = 'Обележи поруке';\r
+$labels['markread'] = 'Као прочитане';\r
+$labels['markunread'] = 'Као непрочитане';\r
+$labels['select'] = 'Означи';\r
+$labels['all'] = 'Све';\r
+$labels['none'] = 'Ниједну';\r
+$labels['unread'] = 'Непрочитане';\r
+$labels['compact'] = 'Компакција';\r
+$labels['empty'] = 'Испразни';\r
+$labels['purge'] = 'Oчисти';\r
+$labels['quota'] = 'Квота';\r
+$labels['unknown'] = 'непозната';\r
+$labels['unlimited'] = 'бесконачна';\r
+$labels['quicksearch'] = 'Брза претрага';\r
+$labels['resetsearch'] = 'Прикажи све поруке';\r
+$labels['compose'] = 'Нова порука';\r
+$labels['savemessage'] = 'Сачувај у Снимљене';\r
+$labels['sendmessage'] = 'Пошаљи поруку';\r
+$labels['addattachment'] = 'Приложи датотеку';\r
+$labels['charset'] = 'Скуп карактера';\r
+$labels['editortype'] = 'Врста едитора';\r
+$labels['returnreceipt'] = 'Потврда о приспећу';\r
+$labels['checkspelling'] = 'Провера правописа';\r
+$labels['resumeediting'] = 'Повратак у режим писања';\r
+$labels['revertto'] = 'Врати се на';\r
+$labels['attachments'] = 'Прилози ';\r
+$labels['upload'] = 'Додај';\r
+$labels['close'] = 'Затвори';\r
+$labels['low'] = 'Низак';\r
+$labels['lowest'] = 'Најнижи';\r
+$labels['normal'] = 'Средњи';\r
+$labels['high'] = 'Висок';\r
+$labels['highest'] = 'Највиши';\r
+$labels['nosubject'] = '(без наслова)';\r
+$labels['showimages'] = 'Прикажи слике';\r
+$labels['htmltoggle'] = 'HTML';\r
+$labels['plaintoggle'] = 'Обичан текст';\r
+$labels['addcc'] = 'Додај Cc';\r
+$labels['addbcc'] = 'Додај Bcc';\r
+$labels['addreplyto'] = 'Додај Reply-To';\r
+$labels['mdnrequest'] = 'Пошиљалац ове поруке је замолио да буде обавештен када прочитате ову поруку. Да ли желите да обавестите пошиљаоца?';\r
+$labels['receiptread'] = 'Обавештење о приспећу (прочитана порука)';\r
+$labels['yourmessage'] = 'Ово је обавештење о приспећу за вашу поруку';\r
+$labels['receiptnote'] = 'Пажња: Ово обавештење само потврђује да је порука приказана на рачунару примаоца. Не постоји гаранција да је прималац прочитао или разумео садржај поруке.';\r
+$labels['name'] = 'Пуно име';\r
+$labels['firstname'] = 'Име';\r
+$labels['surname'] = 'Презиме';\r
+$labels['email'] = 'Е-мејл';\r
+$labels['addcontact'] = 'Додај нови контакт';\r
+$labels['editcontact'] = 'Измени контакт';\r
+$labels['edit'] = 'Измени';\r
+$labels['cancel'] = 'Поништи';\r
+$labels['save'] = 'Сачувај';\r
+$labels['delete'] = 'Обриши';\r
+$labels['newcontact'] = 'Додај нови контакт';\r
+$labels['deletecontact'] = 'Обриши одабране контакте';\r
+$labels['composeto'] = 'Напиши поруку...';\r
+$labels['contactsfromto'] = 'Контакти од $from до $to од укупно $count';\r
+$labels['print'] = 'Штампај';\r
+$labels['export'] = 'Извези';\r
+$labels['previouspage'] = 'Прикажи претходну страну';\r
+$labels['firstpage'] = 'Прикажи први скуп';\r
+$labels['nextpage'] = 'Прикажи следећу страну';\r
+$labels['lastpage'] = 'Прикажи последњи скуп';\r
+$labels['groups'] = 'Групе';\r
+$labels['personaladrbook'] = 'Личне адресе';\r
+$labels['settingsfor'] = 'Подешавања за';\r
+$labels['preferences'] = 'Подешавања';\r
+$labels['userpreferences'] = 'Општа подешавања';\r
+$labels['editpreferences'] = 'Измена општих подешавања';\r
+$labels['identities'] = 'Идентитети';\r
+$labels['manageidentities'] = 'Подеси идентитете за овај налог';\r
+$labels['newidentity'] = 'Додај идентитет';\r
+$labels['newitem'] = 'Нова ставка';\r
+$labels['edititem'] = 'Измена ставке';\r
+$labels['setdefault'] = 'Подеси подразумевано';\r
+$labels['language'] = 'Језик';\r
+$labels['timezone'] = 'Временска зона';\r
+$labels['pagesize'] = 'Редова по страни';\r
+$labels['signature'] = 'Потпис';\r
+$labels['dstactive'] = 'Летње померање времена';\r
+$labels['htmleditor'] = 'Састави HTML поруке';\r
+$labels['htmlsignature'] = 'HTML потпис';\r
+$labels['previewpane'] = 'Прикажи панел за преглед';\r
+$labels['autosavedraft'] = 'Аутоматски чувај у Снимљене';\r
+$labels['everynminutes'] = 'сваких $n минута';\r
+$labels['never'] = 'никад';\r
+$labels['folder'] = 'Фасцикла';\r
+$labels['folders'] = 'Фасцикле';\r
+$labels['foldername'] = 'Име фасцикле';\r
+$labels['subscribed'] = 'Потписана';\r
+$labels['messagecount'] = 'Поруке';\r
+$labels['create'] = 'Креирај';\r
+$labels['createfolder'] = 'Креирај нову фасциклу';\r
+$labels['rename'] = 'Преименуј';\r
+$labels['renamefolder'] = 'Преименуј фасциклу';\r
+$labels['deletefolder'] = 'Обриши фасциклу';\r
+$labels['managefolders'] = 'Подеси фасциклу';\r
+$labels['sortby'] = 'Сортирај по';\r
+$labels['sortasc'] = 'Сортирај растуће';\r
+$labels['sortdesc'] = 'Сортирај опадајуће';\r
+\r
+?>\r
diff --git a/program/localization/sr_cyrillic/messages.inc b/program/localization/sr_cyrillic/messages.inc
new file mode 100644 (file)
index 0000000..1e51f81
--- /dev/null
@@ -0,0 +1,82 @@
+<?php\r
+\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/sr_cyrillic/messages.inc                                     |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |\r
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |\r
+ | Licensed under the GNU GPL                                            |\r
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Branko Kokanovic <branko.kokanovic@gmail.com>                 |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed'] = 'Неуспешно пријављивање';\r
+$messages['cookiesdisabled'] = 'Ваш интернет прегледач не подржава колачиће';\r
+$messages['sessionerror'] = 'Сесија није валидна или је истекла';\r
+$messages['imaperror'] = 'Неуспешна конекција на IMAP сервер';\r
+$messages['nomessagesfound'] = 'Немате порука у сандучету';\r
+$messages['loggedout'] = 'Успешно сте се одјавили.';\r
+$messages['mailboxempty'] = 'Сандуче је празно';\r
+$messages['loading'] = 'Учитавање...';\r
+$messages['loadingdata'] = 'Учитавање података...';\r
+$messages['checkingmail'] = 'Провера нових порука у току...';\r
+$messages['sendingmessage'] = 'Порука се шаље...';\r
+$messages['messagesent'] = 'Порука је успешно послата';\r
+$messages['savingmessage'] = 'Порука се снима...';\r
+$messages['messagesaved'] = 'Порука успешно сачувана у Снимљене';\r
+$messages['successfullysaved'] = 'Снимање успешно обављено';\r
+$messages['addedsuccessfully'] = 'Контакт успешно додат у именик';\r
+$messages['contactexists'] = 'Контакт са овом е-мејл адресом већ постоји у именику';\r
+$messages['blockedimages'] = 'Због заштите приватности, слике са удаљених сервера су блокиране';\r
+$messages['encryptedmessage'] = 'Ова порука је шифрована, па се не може приказати';\r
+$messages['nocontactsfound'] = 'Није пронађен ниједан контакт';\r
+$messages['contactnotfound'] = 'Жељени контакт није нађен';\r
+$messages['sendingfailed'] = 'Грешка при слању поруке';\r
+$messages['errorsaving'] = 'Грешка при снимању поруке';\r
+$messages['errormoving'] = 'Грешка при премештању поруке';\r
+$messages['errordeleting'] = 'Грешка при брисању поруке';\r
+$messages['deletecontactconfirm'] = 'Да ли стварно желите да обришете изабране контакте?';\r
+$messages['deletemessagesconfirm'] = 'Да ли стварно желите да обришете изабране поруке?';\r
+$messages['deletefolderconfirm'] = 'Да ли заиста желите да обришете изабрану фасциклу?';\r
+$messages['purgefolderconfirm'] = 'Да ли заиста желите да обришете све поруке у фасцикли?';\r
+$messages['formincomplete'] = 'Формулар није у целости попуњен';\r
+$messages['noemailwarning'] = 'Унесите валидну е-мејл адресу';\r
+$messages['nonamewarning'] = 'Унесите име';\r
+$messages['nopagesizewarning'] = 'Унесите величину странице';\r
+$messages['norecipientwarning'] = 'Унесите примаоца/примаоце (За)';\r
+$messages['nosubjectwarning'] = 'Поље \'Наслов\' је празно. Желите ли да унесете наслов?';\r
+$messages['nobodywarning'] = 'Да ли желите да пошаљете поруку без текста?';\r
+$messages['notsentwarning'] = 'Порука није послата. Да ли желите да одбаците ову поруку?';\r
+$messages['noldapserver'] = 'Унесите LDAP сервер за претрагу';\r
+$messages['nocontactsreturned'] = 'Није пронађен ниједан контакт';\r
+$messages['nosearchname'] = 'Унесите име или е-мејл адресу';\r
+$messages['searchsuccessful'] = 'Број пронађених порука: $nr';\r
+$messages['searchnomatch'] = 'Тражена фраза није пронађена ни у једној поруци';\r
+$messages['searching'] = 'Претрага у току...';\r
+$messages['checking'] = 'Провера у току...';\r
+$messages['nospellerrors'] = 'Није пронађена ниједна правописна грешка';\r
+$messages['folderdeleted'] = 'Фасцикла успешно обрисана';\r
+$messages['deletedsuccessfully'] = 'Брисање успешно';\r
+$messages['converting'] = 'Уклањање форматирања из поруке...';\r
+$messages['messageopenerror'] = 'Порука се не може учитати са сервера';\r
+$messages['fileuploaderror'] = 'Слање датотеке неуспешно';\r
+$messages['filesizeerror'] = 'Послата датотека не може да прекорачи величину од $size';\r
+$messages['copysuccess'] = 'Успешно копирано $nr адреса';\r
+$messages['copyerror'] = 'Немогуће је ископирати иједну адресу';\r
+$messages['sourceisreadonly'] = 'Овај извор адресе је само за читање';\r
+$messages['errorsavingcontact'] = 'Неуспело снимање адресе контакта';\r
+$messages['movingmessage'] = 'Премештам поруку...';\r
+$messages['receiptsent'] = 'Успешно послато обавештење о приспећу';\r
+$messages['errorsendingreceipt'] = 'Неуспело слање обавештења о приспећу';\r
+$messages['nodeletelastidentity'] = 'Не можете обрисати овај идентитет, он Вам је последњи.';\r
+$messages['addsubfolderhint'] = 'Ова фасцикла ће бити креирана као подфасцикла тренутне';\r
+\r
+?>\r
diff --git a/program/localization/sr_latin/labels.inc b/program/localization/sr_latin/labels.inc
new file mode 100644 (file)
index 0000000..565ba9c
--- /dev/null
@@ -0,0 +1,217 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/sr_latin/labels.inc                                          |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Viktor Varga <vile@neobee.net>                                |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$labels = array();
+
+// login page
+$labels['welcome']   = 'Dobrodošli na $product';
+$labels['username']  = 'Korisničko ime';
+$labels['password']  = 'Lozinka';
+$labels['server']    = 'Server';
+$labels['login']     = 'Prijava';
+
+// taskbar
+$labels['logout']   = 'Odjava';
+$labels['mail']     = 'Sanduče';
+$labels['settings'] = 'Podešavanja';
+$labels['addressbook'] = 'Imenik';
+
+// mailbox names
+$labels['inbox']  = 'Inbox';
+$labels['drafts'] = 'Drafts';
+$labels['sent']   = 'Sent';
+$labels['trash']  = 'Trash';
+$labels['junk']   = 'Junk';
+
+// message listing
+$labels['subject'] = 'Naslov';
+$labels['from']    = 'Od';
+$labels['to']      = 'Za';
+$labels['cc']      = 'Cc';
+$labels['bcc']     = 'Bcc';
+$labels['replyto'] = 'Reply-To';
+$labels['date']    = 'Datum';
+$labels['size']    = 'Veličina';
+$labels['priority'] = 'Prioritet';
+$labels['organization'] = 'Organizacija';
+
+// aliases
+$labels['reply-to'] = $labels['replyto'];
+
+$labels['mailboxlist'] = 'Fascikle';
+$labels['messagesfromto'] = 'Poruke od $from do $to od ukupno $count';
+$labels['messagenrof'] = 'Poruka broj $nr od $count';
+
+$labels['moveto']   = 'prebaci u...';
+$labels['download'] = 'preuzmi (download)';
+
+$labels['filename'] = 'Ime datoteke';
+$labels['filesize'] = 'Veličina datoteke';
+
+$labels['preferhtml'] = 'HTML format u prednosti';
+$labels['htmlmessage'] = 'HTML format poruke';
+$labels['prettydate'] = 'Formatiran datum';
+
+$labels['addtoaddressbook'] = 'Dodaj u imenik';
+
+// weekdays short
+$labels['sun'] = 'Ned';
+$labels['mon'] = 'Pon';
+$labels['tue'] = 'Uto';
+$labels['wed'] = 'Sre';
+$labels['thu'] = 'Čet';
+$labels['fri'] = 'Pet';
+$labels['sat'] = 'Sub';
+
+// weekdays long
+$labels['sunday']    = 'Nedelja';
+$labels['monday']    = 'Ponedeljak';
+$labels['tuesday']   = 'Utorak';
+$labels['wednesday'] = 'Sreda';
+$labels['thursday']  = 'Četvrtak';
+$labels['friday']    = 'Petak';
+$labels['saturday']  = 'Subota';
+
+$labels['today'] = 'danas';
+
+// toolbar buttons
+$labels['checkmail']        = 'Provera novih poruka';
+$labels['writenewmessage']  = 'Nova poruka';
+$labels['replytomessage']   = 'Odgovori na poruku';
+$labels['replytoallmessage'] = 'Odgovori pošiljaocu i svim primaocima';
+$labels['forwardmessage']   = 'Prosledi poruku';
+$labels['deletemessage']    = 'Prebaci poruku u korpu (Trash)';
+$labels['printmessage']     = 'Odštampaj poruku';
+$labels['previousmessages'] = 'Prikaži prethodni skup poruka';
+$labels['nextmessages']     = 'Prikaži sledeći skup poruka';
+$labels['backtolist']       = 'Povratak na listu poruka';
+$labels['viewsource']       = 'Prikaži poruku u izvornom obliku';
+
+$labels['select'] = 'Obeleži';
+$labels['all'] = 'Sve';
+$labels['none'] = 'Nijednu';
+$labels['unread'] = 'Nepročitane';
+
+$labels['compact'] = 'Kompakcija';
+$labels['empty'] = 'Izprazni';
+$labels['purge'] = 'Očisti';
+
+$labels['quota'] = 'Kvota';
+$labels['unknown']  = 'nepoznato';
+$labels['unlimited']  = 'beskonačna';
+
+$labels['quicksearch']  = 'Brza pretraga';
+$labels['resetsearch']  = 'Prikaži sve poruke';
+
+// message compose
+$labels['compose']  = 'Nova poruka';
+$labels['savemessage']  = 'Sačuvaj u \'Drafts\'';
+$labels['sendmessage']  = 'Pošalji poruku';
+$labels['addattachment']  = 'Priloži datoteku';
+$labels['charset']  = 'Karakter-set';
+$labels['returnreceipt'] = 'Potvrda o prispeću poruke';
+
+$labels['checkspelling'] = 'Provera pravopisa';
+$labels['resumeediting'] = 'Povratak u režim pisanja';
+$labels['revertto'] = 'Revert to';
+
+$labels['attachments'] = 'Prilozi (Attachments)';
+$labels['upload'] = 'Dodaj';
+$labels['close']  = 'Zatvori';
+
+$labels['low']     = 'Nizak';
+$labels['lowest']  = 'Najniži';
+$labels['normal']  = 'Srednji';
+$labels['high']    = 'Visok';
+$labels['highest'] = 'Najviši';
+
+$labels['nosubject']  = '(bez naslova)';
+$labels['showimages'] = 'Prikaži slike';
+
+// address boook
+$labels['name']      = 'Puno ime';
+$labels['firstname'] = 'Ime';
+$labels['surname']   = 'Prezime';
+$labels['email']     = 'E-Mail';
+
+$labels['addcontact'] = 'Dodaj novi kontakt';
+$labels['editcontact'] = 'Izmeni kontakt';
+
+$labels['edit']   = 'Izmeni';
+$labels['cancel'] = 'Otkaži';
+$labels['save']   = 'Sačuvaj';
+$labels['delete'] = 'Obriši';
+
+$labels['newcontact']     = 'Dodaj novi kontakt';
+$labels['deletecontact']  = 'Obriši odabrane kontakte';
+$labels['composeto']      = 'Napiši mail...';
+$labels['contactsfromto'] = 'Kontakti od $from do $to od ukupno $count';
+$labels['print']          = 'Štampaj';
+$labels['export']         = 'Izvezi';
+
+$labels['previouspage']   = 'Prikaži predhodni skup';
+$labels['nextpage']       = 'Prikaži sledeći skup';
+
+// LDAP search
+$labels['ldapsearch'] = 'Pretraga LDAP imenika';
+
+$labels['ldappublicsearchname']    = 'Ime kontakta';
+$labels['ldappublicsearchtype'] = 'Potpuna fraza?';
+$labels['ldappublicserverselect'] = 'Odaberi servere';
+$labels['ldappublicsearchfield'] = 'Pretraži na';
+$labels['ldappublicsearchform'] = 'Pretraži kontakte';
+$labels['ldappublicsearch'] = 'Pretraga';
+
+// settings
+$labels['settingsfor']  = 'Podešavanja za';
+
+$labels['preferences']  = 'Podešavanja';
+$labels['userpreferences']  = 'Opšta podešavanja';
+$labels['editpreferences']  = 'Izmena opštih podešavanja';
+
+$labels['identities']  = 'Identiteti';
+$labels['manageidentities']  = 'Podesi identitete za ovaj nalog';
+$labels['newidentity']  = 'Dodaj identitet';
+
+$labels['newitem']  = 'New item';
+$labels['edititem']  = 'Edit item';
+
+$labels['setdefault']  = 'Set default';
+$labels['language']  = 'Jezik';
+$labels['timezone']  = 'Vremenska zona';
+$labels['pagesize']  = 'Redova po stranici';
+$labels['signature'] = 'Potpis';
+$labels['dstactive']  = 'Letnje pomeranje vremena';
+
+$labels['folder']  = 'Fascikla';
+$labels['folders']  = 'Fascikle';
+$labels['foldername']  = 'Ime fascikle';
+$labels['subscribed']  = 'Subscribed';
+$labels['create']  = 'Kreiraj';
+$labels['createfolder']  = 'Kreiraj novu fasciklu';
+$labels['rename'] = 'Preimenuj';
+$labels['renamefolder'] = 'Preimenuj Fasciklu';
+$labels['deletefolder']  = 'Obriši Fasciklu';
+$labels['managefolders']  = 'Podesi Fasciklu';
+
+$labels['sortby'] = 'Sortiraj po';
+$labels['sortasc']  = 'Sortiraj rastućim nizom';
+$labels['sortdesc'] = 'Sortiraj opadajućim nizom';
+
+?>
\ No newline at end of file
diff --git a/program/localization/sr_latin/messages.inc b/program/localization/sr_latin/messages.inc
new file mode 100644 (file)
index 0000000..dfdbcc3
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/sr_latin/messages.inc                                        |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Viktor Varga <vile@neobee.net>                                |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$messages = array();
+$messages['loginfailed']  = 'Prijava neuspešna';
+$messages['cookiesdisabled'] = 'Vaš pretraživač ne podržava kolačiće (cookies)';
+$messages['sessionerror'] = 'Sesija je nije validna ili je istekla';
+$messages['imaperror'] = 'Neuspešna konekcija na IMAP server';
+$messages['nomessagesfound'] = 'Nema poruka u sandučetu';
+$messages['loggedout'] = 'Uspešno ste se odjavili.';
+$messages['mailboxempty'] = 'Sanduše je prazno';
+$messages['loading'] = 'Učitavanje...';
+$messages['loadingdata'] = 'Učitavanje podataka...';
+$messages['checkingmail'] = 'Provera novih poruka u toku...';
+$messages['sendingmessage'] = 'Poruka se šalje...';
+$messages['messagesent'] = 'Poruka je uspešno poslana';
+$messages['savingmessage'] = 'Poruka se snima...';
+$messages['messagesaved'] = 'Poruka uspešno sačuvana u \'Drafts\'';
+$messages['successfullysaved'] = 'Snimanje uspešno obavljeno';
+$messages['addedsuccessfully'] = 'Kontakt uspešno dodat u imenik';
+$messages['contactexists'] = 'Kontakt sa ovom e-mail adresom već postoji u imeniku';
+$messages['blockedimages'] = 'Zbog zaštite privatnosti, slike sa udaljenih servera su blokirane.';
+$messages['encryptedmessage'] = 'Ova poruka je šifrovana pa se ne može prikazati';
+$messages['nocontactsfound'] = 'Imenik je prazan';
+$messages['sendingfailed'] = 'Greška pri slanju poruke';
+$messages['errorsaving'] = 'Greška pri snimanju';
+$messages['errormoving'] = 'Greška pri premeštanju poruke';
+$messages['errordeleting'] = 'Greška pri brisanju poruke';
+$messages['deletecontactconfirm']  = 'Da li želite da obrišete izabrane kontakte?';
+$messages['deletefolderconfirm']  = 'Da li zaista želite da obrišete ovu fasciklu?';
+$messages['purgefolderconfirm']  = 'Da li zaista želite da obrišete sve poruke u fascilli?';
+$messages['formincomplete'] = 'Forma nije u celosti popunjena';
+$messages['noemailwarning'] = 'Unesite validnu e-mail adresu';
+$messages['nonamewarning']  = 'Unesite ime';
+$messages['nopagesizewarning'] = 'Unesite veličinu stranice';
+$messages['norecipientwarning'] = 'Unesite primaoca / primaoce (ZA)';
+$messages['nosubjectwarning']  = 'Polje \'Naslov\' je prazno. Želite li da unesete naslov?';
+$messages['nobodywarning'] = 'Da li želite da pošaljete poruku bez teksta?';
+$messages['notsentwarning'] = 'Poruka nije poslana. Da li želite da odbacite ovu poruku?';
+$messages['noldapserver'] = 'Unesite LDAP server za pretragu';
+$messages['nocontactsreturned'] = 'Nije pronađen ni jedan kontakt';
+$messages['nosearchname'] = 'Unesite ime ili e-mail adresu';
+$messages['searchsuccessful'] = 'Broj pronađenih poruka: $nr';
+$messages['searchnomatch'] = 'Tražena fraza nije pronađena ni u jednoj poruci';
+$messages['searching'] = 'Pretraga u toku...';
+$messages['checking'] = 'Provera u toku...';
+$messages['nospellerrors'] = 'Nije pronađena ni jedna pravopisna greška';
+$messages['folderdeleted'] = 'Fascikla uspešno obrisana';
+
+?>
\ No newline at end of file
diff --git a/program/localization/th_TH/labels.inc b/program/localization/th_TH/labels.inc
new file mode 100644 (file)
index 0000000..56e30b4
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/th_TH/labels.inc                                             |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Wiraphan Treeratphan <webmaster@modoeye.com>                  |
+ +-----------------------------------------------------------------------+
+
+ @version $Id$
+
+*/
+
+$labels = array();
+$labels['welcome'] = 'ยินดีต้อนรับสู่ $product';
+$labels['username'] = 'บัญชีผู้ใช้';
+$labels['password'] = 'รหัสผ่าน';
+$labels['server'] = 'เซิร์ฟเวอร์';
+$labels['login'] = 'เข้าสู่ระบบ';
+$labels['logout'] = 'ออกจากระบบ';
+$labels['mail'] = 'อีเมล์';
+$labels['settings'] = 'ปรับแต่งค่าส่วนตัว';
+$labels['addressbook'] = 'สมุดรายชื่อ';
+$labels['inbox'] = 'กล่องขาเข้า';
+$labels['drafts'] = 'กล่องจดหมายร่าง';
+$labels['sent'] = 'กล่องขาออก';
+$labels['trash'] = 'ถังขยะ';
+$labels['junk'] = 'กล่องจดหมายขยะ';
+$labels['spam'] = 'กล่องจดหมายขยะ';
+$labels['subject'] = 'หัวจดหมาย';
+$labels['from'] = 'ผู้ส่ง';
+$labels['to'] = 'ผู้รับ';
+$labels['cc'] = 'คัดลอก';
+$labels['bcc'] = 'แอบสำเนาถึง';
+$labels['replyto'] = 'ตอบกลับ';
+$labels['date'] = 'วันที่';
+$labels['size'] = 'ขนาด';
+$labels['priority'] = 'ระดับความสำคัญ';
+$labels['organization'] = 'องค์กร';
+$labels['reply-to'] = 'ตอบกลับ';
+$labels['mailboxlist'] = 'กล่องจดหมาย';
+$labels['messagesfromto'] = 'จดหมายจาก $from ถึง $to จำนวน $count ฉบับ';
+$labels['messagenrof'] = 'จดหมายฉบับที่ $nr จาก $count ฉบับ';
+$labels['moveto'] = 'ย้ายไป...';
+$labels['download'] = 'ดาวน์โหลด';
+$labels['filename'] = 'ชื่อไฟล์';
+$labels['filesize'] = 'ขนาดไฟล์';
+$labels['preferhtml'] = 'อ่านแบบ HTML';
+$labels['htmlmessage'] = 'จดหมาย HTML';
+$labels['prettydate'] = 'แสดงวันที่แบบย่อ';
+$labels['addtoaddressbook'] = 'บันทึกในสมุดรายชื่อ';
+$labels['sun'] = 'อ';
+$labels['mon'] = 'จ';
+$labels['tue'] = 'อ';
+$labels['wed'] = 'พ';
+$labels['thu'] = 'พฤ';
+$labels['fri'] = 'ศ';
+$labels['sat'] = 'ส';
+$labels['sunday'] = 'วันอาทิตย์';
+$labels['monday'] = 'วันจันทร์';
+$labels['tuesday'] = 'วันอังคาร';
+$labels['wednesday'] = 'วันพุธ';
+$labels['thursday'] = 'วันพฤหัสบดี';
+$labels['friday'] = 'วันศุกร์';
+$labels['saturday'] = 'วันเสาร์';
+$labels['today'] = 'วันนี้';
+$labels['checkmail'] = 'ตรวจสอบจดหมายใหม่';
+$labels['writenewmessage'] = 'สร้างจดหมายใหม่';
+$labels['replytomessage'] = 'ตอบกลับจดหมาย';
+$labels['replytoallmessage'] = 'ตอบกลับถึงทุกคนในจดหมาย';
+$labels['forwardmessage'] = 'ส่งต่อจดหมาย';
+$labels['deletemessage'] = 'ลบจดหมาย';
+$labels['printmessage'] = 'พิมพ์จดหมาย';
+$labels['previousmessage'] = 'แสดงจดหมายฉบับที่แล้ว';
+$labels['previousmessages'] = 'จดหมายฉบับก่อนหน้า';
+$labels['firstmessage'] = 'แสดงจดหมายฉบับแรก';
+$labels['nextmessage'] = 'แสดงจดหมายฉบับต่อไป';
+$labels['nextmessages'] = 'จดหมายฉบับถัดไป';
+$labels['lastmessage'] = 'แสดงจดหมายฉบับล่าสุด';
+$labels['backtolist'] = 'กลับไปยังรายการจดหมาย';
+$labels['viewsource'] = 'แสดง source';
+$labels['select'] = 'เลือก';
+$labels['all'] = 'ทั้งหมด';
+$labels['none'] = 'ไม่เลือก';
+$labels['unread'] = 'จดหมายที่ไม่ได้อ่าน';
+$labels['compact'] = 'แบบย่อ';
+$labels['empty'] = 'ว่างเปล่า';
+$labels['purge'] = 'ลบทั้งหมด';
+$labels['quota'] = 'พื้นที่ใช้งาน';
+$labels['unknown'] = 'ไม่ทราบ';
+$labels['unlimited'] = 'ไม่จำกัด';
+$labels['quicksearch'] = 'ค้นหาแบบด่วน';
+$labels['resetsearch'] = 'ล้างการค้นหา';
+$labels['compose'] = 'เขียนจดหมายใหม่';
+$labels['savemessage'] = 'บันทึกฉบับร่าง';
+$labels['sendmessage'] = 'ส่งจดหมาย';
+$labels['addattachment'] = 'แนบไฟล์';
+$labels['charset'] = 'Charset';
+$labels['returnreceipt'] = 'ตอบกลับผู้รับ';
+$labels['checkspelling'] = 'ตรวจสอบคำผิด';
+$labels['resumeediting'] = 'แก้ไขต่อ';
+$labels['revertto'] = 'ย้นกลับไปยัง';
+$labels['attachments'] = 'ไฟล์แนบ';
+$labels['upload'] = 'อัพโหลด';
+$labels['close'] = 'ปิด';
+$labels['low'] = 'ต่ำ';
+$labels['lowest'] = 'ต่ำสุด';
+$labels['normal'] = 'ปกติ';
+$labels['high'] = 'สูง';
+$labels['highest'] = 'สูงสุด';
+$labels['nosubject'] = '(ไม่มีหัวข้อ)';
+$labels['showimages'] = 'แสดงรูป';
+$labels['htmltoggle'] = 'HTML';
+$labels['plaintoggle'] = 'Plain text';
+$labels['name'] = 'ชื่อแสดง';
+$labels['firstname'] = 'ชื่อ';
+$labels['surname'] = 'สกุล';
+$labels['email'] = 'อีเมล์';
+$labels['addcontact'] = 'เพิ่มรายชื่อ';
+$labels['editcontact'] = 'แก้ไขรายชื่อ';
+$labels['edit'] = 'แก้ไข';
+$labels['cancel'] = 'ยกเลิก';
+$labels['save'] = 'บันทึก';
+$labels['delete'] = 'ลบ';
+$labels['newcontact'] = 'สร้างรายชื่อใหม่';
+$labels['deletecontact'] = 'ลบรายชื่อที่เลือก';
+$labels['composeto'] = 'เขียนจดหมายถึง';
+$labels['contactsfromto'] = 'รายชื่อ $from ถึง $to จำนวน $count';
+$labels['print'] = 'พิมพ์';
+$labels['export'] = 'ส่งออก';
+$labels['previouspage'] = 'หน้าที่แล้ว';
+$labels['nextpage'] = 'หน้าถัดไป';
+$labels['settingsfor'] = 'ตั้งค่าสำหรับ';
+$labels['preferences'] = 'ปรับแต่ง';
+$labels['userpreferences'] = 'ข้อมูลส่วนตัว';
+$labels['editpreferences'] = 'แก้ไขข้อมูลส่วนตัว';
+$labels['identities'] = 'ชื่อแสดงตัว';
+$labels['manageidentities'] = 'จัดการชื่อแสดงตัวสำหรับรายชื่อนี้';
+$labels['newidentity'] = 'ชื่อแสดงตัวใหม่';
+$labels['newitem'] = 'New item';
+$labels['edititem'] = 'Edit item';
+$labels['setdefault'] = 'ตั้งเป็นค่าใช้งาน';
+$labels['language'] = 'ภาษา';
+$labels['timezone'] = 'เขตเวลา';
+$labels['pagesize'] = 'จำนวนจดหมายต่อหน้า';
+$labels['signature'] = 'ลายมือชื่อ';
+$labels['dstactive'] = 'Daylight savings';
+$labels['htmleditor'] = 'เขียนจดหมายแบบ HTML';
+$labels['htmlsignature'] = 'ลายมือชื่อแบบ HTML';
+$labels['previewpane'] = 'แสดงหน้าต่างตัวอย่างแสดงผล';
+$labels['autosavedraft'] = 'บันทึกเป็นจดหมายร่างอัตโนมัติ';
+$labels['everynminutes'] = 'ทุกๆ $n นาที';
+$labels['never'] = 'ไม่ใช้';
+$labels['folder'] = 'กล่องจดหมาย';
+$labels['folders'] = 'กล่องจดหมาย';
+$labels['foldername'] = 'ชื่อกล่องจดหมาย';
+$labels['subscribed'] = 'ลงชื่อ';
+$labels['create'] = 'สร้าง';
+$labels['createfolder'] = 'สร้างกล่องจดหมาย';
+$labels['rename'] = 'เปลื่ยนชื่อ';
+$labels['renamefolder'] = 'เปลี่ยนชื่อกล่องจดหมาย';
+$labels['deletefolder'] = 'ลบกล่องจดหมาย';
+$labels['managefolders'] = 'จัดการกล่องจดหมาย';
+$labels['sortby'] = 'เรียงตาม';
+$labels['sortasc'] = 'เรียงจากหน้าไปหลัง';
+$labels['sortdesc'] = 'เรียงจากหลังไปหน้า';
+
+?>
\ No newline at end of file
diff --git a/program/localization/th_TH/messages.inc b/program/localization/th_TH/messages.inc
new file mode 100644 (file)
index 0000000..07886ce
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+
+/*
+
+ +-----------------------------------------------------------------------+
+ | language/th_TH/messages.inc                                           |
+ |                                                                       |
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Wiraphan Treeratphan <webmaster@modoeye.com>                  |
+ +-----------------------------------------------------------------------+
+
+ @version $Id: messages.inc 543 2007-04-28 18:07:12Z thomasb $
+
+*/
+
+$messages = array();
+$messages['loginfailed']  = 'ไม่สามารถเข้าสู่ระบบได้';
+$messages['cookiesdisabled'] = 'Browser ของคุณไม่ได้เปิดการใช้งาน Cookie ไว้';
+$messages['sessionerror'] = 'Your session is invalid or expired';
+$messages['imaperror'] = 'ไม่สามารถติดต่อ IMAP Server ได้';
+$messages['nomessagesfound'] = 'ไม่มีจดหมายในกล่องจดหมายนี้';
+$messages['loggedout'] = 'ทำการออกจากระบบเรียบร้อย';
+$messages['mailboxempty'] = 'กล่องจดหมายนี้ว่างเปล่า';
+$messages['loading'] = 'Loading...';
+$messages['loadingdata'] = 'กำลังโหลดข้อมูล...';
+$messages['checkingmail'] = 'กำลังเช็คจดหมายใหม่...';
+$messages['sendingmessage'] = 'กำลังส่งจดหมาย...';
+$messages['messagesent'] = 'จดหมายถูกส่งเรียบร้อยแล้ว';
+$messages['savingmessage'] = 'กำลังบันทึกจดหมาย...';
+$messages['messagesaved'] = 'จดหมายถูกบันทึกเป็นจดหมายร่าง';
+$messages['successfullysaved'] = 'บันทึกเรียบร้อยแล้ว';
+$messages['addedsuccessfully'] = 'รายชื่อถูกบันทึกเรียบร้อยแล้ว';
+$messages['contactexists'] = 'อีเมล์นี้มีอยู่แล้ว';
+$messages['blockedimages'] = 'เพื่อปกป้องความส่วนตัว รูปจากภายนอกในจดหมายนี้จะถูกปิดบังไว้';
+$messages['encryptedmessage'] = 'จดหมายถูกเข้ารหัสไม่สามารถแสดงผลได้';
+$messages['nocontactsfound'] = 'ไม่พบรายชื่อที่ค้นหา';
+$messages['contactnotfound'] = 'ไม่พบรายชื่อที่ค้นหา';
+
+$messages['sendingfailed'] = 'การส่งจดหมายล้มเหลว';
+$messages['errorsaving'] = 'เกิดข้อผิดพลาดระหว่างการบันทึก';
+$messages['errormoving'] = 'ไม่สามารถย้ายจดหมายได้';
+$messages['errordeleting'] = 'ไม่สามารถลบจดหมายได้';
+$messages['deletecontactconfirm']  = 'คุณมั่นใจที่ต้องการลบรายชื่อที่เลือกใช่หรือไม่?';
+$messages['deletemessagesconfirm'] = 'คุณมั่นใจที่ต้องการลบจดหมายที่เลือกใช่หรือไม่?';
+$messages['deletefolderconfirm']  = 'คุณมั่นใจที่ต้องการลบแฟ้มนี้หรือไม่?';
+$messages['purgefolderconfirm']  = 'คุณมั่นใจที่ต้องการลบจดหมายทั้งหมดในแฟ้มนี้ใช่หรือไม่?';
+$messages['formincomplete'] = 'ฟอร์มยังไม่ครบถ้วนสมบูรณ์';
+$messages['noemailwarning'] = 'โปรดใส่อีเมล์ให้ถูกต้อง';
+$messages['nonamewarning']  = 'โปรดใส่ชื่อ';
+$messages['nopagesizewarning'] = 'โปรดใส่จำนวนหน้า';
+$messages['norecipientwarning'] = 'โปรดใส่ผู้รับอย่างน้อย 1 ชื่อ';
+$messages['nosubjectwarning']  = 'หัวจดหมายว่างเปล่า คุณต้องการใส่หัวจดหมายเดี๋ยวนี้หรือไม่?';
+$messages['nobodywarning'] = 'คุณต้องการส่งจดหมายโดยไม่มีข้อความใช่หรือไม่?';
+$messages['notsentwarning'] = 'จดหมายยังไม่ถูกส่ง คุณต้องการยกเลิกหรือไม่?';
+$messages['noldapserver'] = 'โปรดเลือก LDAP Server เพื่อค้นหา';
+$messages['nocontactsreturned'] = 'ไม่พบรายชื่อ';
+$messages['nosearchname'] = 'โปรดใสชื่อหรืออีเมล์';
+$messages['searchsuccessful'] = 'พบจดหมายจำนวน $nr ฉบับ';
+$messages['searchnomatch'] = 'การค้นหาไม่พบ';
+$messages['searching'] = 'กำลังค้นหา...';
+$messages['checking'] = 'กำลังตรวจสอบ...';
+$messages['nospellerrors'] = 'ไม่พบคำที่สะกดผิด';
+$messages['folderdeleted'] = 'ลบแฟ้มเสร็จสมบูรณ์';
+$messages['deletedsuccessfully'] = "ลบเสร็จสมบูรณ์";
+$messages['converting'] = 'นำเอาหารจัดรูปแบบในจดหมายออก...';
+$messages['messageopenerror'] = 'ไม่สามารถอ่านจดหมายจาก Server ได้';
+$messages['fileuploaderror'] = 'การอัพโหลดล้มเหลว';
+$messages['filesizeerror'] = 'ไฟล์มีขนาดใหญ่เกิน $size';
+
+$messages['copysuccess'] = 'คัดลอกจดหมายจำนวน $nr ฉบับเรียบร้อย';
+$messages['copyerror'] = 'ไม่สามารถคัดลอกได้';
+$messages['sourceisreadonly'] = 'จดหมายนี้เป็นแบบอ่านอย่างเดียว';
+$messages['errorsavingcontact'] = 'ไม่สามารถบันทึกรายชื่อได้';
+
+?>
\ No newline at end of file
index b1fe6554a6539743cf00f96ff23f5fa4dca8171c..401c520fa4b1ae0c3a7f7cefcb0cec964dd4a489 100644 (file)
@@ -6,14 +6,14 @@
  | language/tr/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Hasan Cansız <hasancansiz@yahoo.com>                          |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 837 2007-09-27 13:31:57Z thomasb $
+ @version $Id: labels.inc 950 2008-01-04 08:04:53Z tomekp $
 
 */
 
index 151bff6c343e962072b2d05415fc0ee979097c08..68554f8429bf2421b324f613cf8b68d475ed7eb7 100644 (file)
@@ -6,14 +6,14 @@
  | language/tr/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Hasan Cansız <hasancansiz@yahoo.com>                          |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 837 2007-09-27 13:31:57Z thomasb $
+ @version $Id: messages.inc 950 2008-01-04 08:04:53Z tomekp $
 
 */
 
index 2c5f192a1a6dc9449152f9215e1f90c2992f7d14..826993489cc79f79e0f1d27ddd265cd776356027 100644 (file)
@@ -6,38 +6,32 @@
  | language/uk/labels.inc                                                |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Natali Stasyuk <natali@onlineua.net>                          |
  +-----------------------------------------------------------------------+
 
+ @version $Id$
+
 */
 
 $labels = array();
-
-// login page
 $labels['welcome'] = 'Ласкаво просимо в $product!';
 $labels['username'] = 'Ім`я користувача';
 $labels['password'] = 'Пароль';
 $labels['server'] = 'Сервер';
 $labels['login'] = 'Увійти';
-
-// taskbar
 $labels['logout'] = 'Вийти';
 $labels['mail'] = 'Пошта';
 $labels['settings'] = 'Налаштування';
 $labels['addressbook'] = 'Контакти';
-
-// mailbox names
 $labels['inbox'] = 'Вхідні';
 $labels['drafts'] = 'Чернетки';
 $labels['sent'] = 'Відправлені';
 $labels['trash'] = 'Смітник';
-$labels['spam'] = 'Спам';
-
-// message listing
+$labels['junk'] = 'Спам';
 $labels['subject'] = 'Тема';
 $labels['from'] = 'Від';
 $labels['to'] = 'Кому';
@@ -48,8 +42,6 @@ $labels['date'] = 'Дата';
 $labels['size'] = 'Розмір';
 $labels['priority'] = 'Пріоритет';
 $labels['organization'] = 'Організація';
-
-// aliases
 $labels['reply-to'] = 'Зворотня адреса';
 $labels['mailboxlist'] = 'Теки';
 $labels['messagesfromto'] = 'Повідомлення з $from по $to із $count';
@@ -62,8 +54,6 @@ $labels['preferhtml'] = 'Переважно HTML';
 $labels['htmlmessage'] = 'Повідомлення HTML';
 $labels['prettydate'] = 'Красиві дати';
 $labels['addtoaddressbook'] = 'Додати до контактів';
-
-// weekdays short
 $labels['sun'] = 'Нд';
 $labels['mon'] = 'Пн';
 $labels['tue'] = 'Вт';
@@ -71,8 +61,6 @@ $labels['wed'] = 'Ср';
 $labels['thu'] = 'Чт';
 $labels['fri'] = 'Пт';
 $labels['sat'] = 'Сб';
-
-// weekdays long
 $labels['sunday'] = 'Неділя';
 $labels['monday'] = 'Понеділок';
 $labels['tuesday'] = 'Вівторок';
@@ -80,16 +68,14 @@ $labels['wednesday'] = 'Середа';
 $labels['thursday'] = 'Четвер';
 $labels['friday'] = 'П`ятниця';
 $labels['saturday'] = 'Субота';
-
 $labels['today'] = 'Сьогодні';
-
-// toolbar buttons
 $labels['checkmail'] = 'Перевірити пошту';
 $labels['writenewmessage'] = 'Нове повідомлення';
 $labels['replytomessage'] = 'Відповісти';
 $labels['replytoallmessage'] = 'Відповісти усім';
 $labels['forwardmessage'] = 'Переслати';
 $labels['deletemessage'] = 'У смітник';
+$labels['movemessagetotrash'] = 'Перемістити повідомлення у смітник';
 $labels['printmessage'] = 'Друкувати';
 $labels['previousmessage'] = 'Показати попереднє повідомлення';
 $labels['previousmessages'] = 'Попередня сторінка повідомлень';
@@ -113,11 +99,9 @@ $labels['unknown'] = 'невідомо';
 $labels['unlimited'] = 'без обмеження';
 $labels['quicksearch'] = 'Швидкий пошук';
 $labels['resetsearch'] = 'Очистити пошук';
-
-// message compose
 $labels['compose'] = 'Написати повідомлення';
-$labels['sendmessage'] = 'Відіслати зараз';
 $labels['savemessage'] = 'Зберегти чернетку';
+$labels['sendmessage'] = 'Відіслати зараз';
 $labels['addattachment'] = 'Додати вкладення';
 $labels['charset'] = 'Набір символів';
 $labels['editortype'] = 'Редактор';
@@ -137,8 +121,9 @@ $labels['nosubject'] = '(без теми)';
 $labels['showimages'] = 'Показати зображення';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = 'Звичайний текст';
-
-// address boook
+$labels['addcc'] = 'Додати Cc';
+$labels['addbcc'] = 'Додати Bcc';
+$labels['addreplyto'] = 'Додати Reply-To';
 $labels['name'] = 'Відображуване ім`я';
 $labels['firstname'] = 'Ім`я';
 $labels['surname'] = 'Прізвище';
@@ -161,8 +146,6 @@ $labels['nextpage'] = 'Показати наступний';
 $labels['lastpage'] = 'Показати останній';
 $labels['groups'] = 'Групи';
 $labels['personaladrbook'] = 'Персональні адреси';
-
-// settings
 $labels['settingsfor'] = 'Налаштування для';
 $labels['preferences'] = 'Уподобання';
 $labels['userpreferences'] = 'Уподобання користувача';
index c1783f495325e36edd1e42f5b4364ef30181b2f7..6abef04583c1f37e7321da6d5155e8b514e35700 100644 (file)
@@ -6,13 +6,15 @@
  | language/uk/messages.inc                                              |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2007, RoundQube Dev. - Switzerland                      |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Natali Stasyuk <natali@onlineua.net>                          |
  +-----------------------------------------------------------------------+
 
+ @version $Id$
+
 */
 
 $messages = array();
@@ -71,5 +73,6 @@ $messages['copysuccess'] = 'Скопійовано $nr адрес';
 $messages['copyerror'] = 'Неможливо скопіювати адресу';
 $messages['sourceisreadonly'] = 'Дане джерело адрес лише для читання';
 $messages['errorsavingcontact'] = 'Неможливо зберегти адресу контакта';
+$messages['movingmessage'] = 'Переміщую повідомлення...';
 
 ?>
\ No newline at end of file
diff --git a/program/localization/vn/labels.inc b/program/localization/vn/labels.inc
new file mode 100644 (file)
index 0000000..e4335ec
--- /dev/null
@@ -0,0 +1,217 @@
+<?php\r
+\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/vn/labels.inc                                                |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Vinh Bui <bqvinh@buivinh.info>                                |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$labels = array();\r
+\r
+// login page\r
+$labels['welcome']   = 'Xin mời sử dụng $product';\r
+$labels['username']  = 'Tên người dùng';\r
+$labels['password']  = 'Mật khẩu';\r
+$labels['server']    = 'Máy chủ?';\r
+$labels['login']     = 'Đăng nhập';\r
+\r
+// taskbar\r
+$labels['logout']   = 'Đăng xuất';\r
+$labels['mail']     = 'E-Mail';\r
+$labels['settings'] = 'Thiết lập';\r
+$labels['addressbook'] = 'Sổ địa chỉ';\r
+\r
+// mailbox names\r
+$labels['inbox']  = 'Inbox';\r
+$labels['drafts'] = 'Drafts';\r
+$labels['sent']   = 'Sent';\r
+$labels['trash']  = 'Trash';\r
+$labels['junk']   = 'Junk';\r
+\r
+// message listing\r
+$labels['subject'] = 'Tiêu đề';\r
+$labels['from']    = 'Người gửi';\r
+$labels['to']      = 'Người nhận';\r
+$labels['cc']      = 'Đồng nhận';\r
+$labels['bcc']     = 'Đồng nhận (2)';\r
+$labels['replyto'] = 'Trả lời vào';\r
+$labels['date']    = 'Ngày';\r
+$labels['size']    = 'D.Lượng';\r
+$labels['priority'] = 'Ưu tiên';\r
+$labels['organization'] = 'Cơ quan';\r
+\r
+// aliases\r
+$labels['reply-to'] = $labels['replyto'];\r
+\r
+$labels['mailboxlist'] = 'Thư mục';\r
+$labels['messagesfromto'] = 'Thư $from - $to / $count';\r
+$labels['messagenrof'] = 'Thư $nr / $count';\r
+\r
+$labels['moveto']   = 'chuyển đến...';\r
+$labels['download'] = 'tải xuống';\r
+\r
+$labels['filename'] = 'Tên file';\r
+$labels['filesize'] = 'Dung lượng';\r
+\r
+$labels['preferhtml'] = 'Dùng HTML';\r
+$labels['htmlmessage'] = 'Thư kiểu HTML';\r
+$labels['prettydate'] = 'Hiển thị ngày đầy đủ';\r
+\r
+$labels['addtoaddressbook'] = 'Thêm và sổ địa chỉ';\r
+\r
+// weekdays short\r
+$labels['sun'] = 'CN';\r
+$labels['mon'] = 'T2';\r
+$labels['tue'] = 'T3';\r
+$labels['wed'] = 'T4';\r
+$labels['thu'] = 'T5';\r
+$labels['fri'] = 'T6';\r
+$labels['sat'] = 'T7';\r
+\r
+// weekdays long\r
+$labels['sunday']    = 'Chủ nhật';\r
+$labels['monday']    = 'Thứ hai';\r
+$labels['tuesday']   = 'Thứ ba';\r
+$labels['wednesday'] = 'Thứ tư';\r
+$labels['thursday']  = 'Thứ năm';\r
+$labels['friday']    = 'Thứ sáu';\r
+$labels['saturday']  = 'Thứ bẩy';\r
+\r
+$labels['today'] = 'Hôm nay';\r
+\r
+// toolbar buttons\r
+$labels['checkmail']        = 'Kiểm tra thư mới';\r
+$labels['writenewmessage']  = 'Soạn thư mới';\r
+$labels['replytomessage']   = 'Trả lời thư';\r
+$labels['replytoallmessage'] = 'Trả lời tất cả';\r
+$labels['forwardmessage']   = 'Chuyển thư';\r
+$labels['deletemessage']    = 'Xóa thư';\r
+$labels['printmessage']     = 'In thư';\r
+$labels['previousmessages'] = 'Hiển thị các thư trước';\r
+$labels['nextmessages']     = 'Hiển thị các thư sau';\r
+$labels['backtolist']       = 'Trở về danh sách thư';\r
+$labels['viewsource']       = 'Hiển thị mã nguồn';\r
+\r
+$labels['select'] = 'Chọn';\r
+$labels['all'] = 'Toàn bộ';\r
+$labels['none'] = 'Bỏ chọn';\r
+$labels['unread'] = 'Chưa đọc';\r
+\r
+$labels['compact'] = 'Rút gọn';\r
+$labels['empty'] = 'Xóa rỗng';\r
+$labels['purge'] = 'Tối giản';\r
+\r
+$labels['quota'] = 'Hạn mức';\r
+$labels['unknown']  = 'không rõ';\r
+$labels['unlimited']  = 'không hạn chế';\r
+\r
+$labels['quicksearch']  = 'Tìm nhanh';\r
+$labels['resetsearch']  = 'Xóa bỏ tìm kiếm';\r
+\r
+// message compose\r
+$labels['compose']  = 'Soạn thư';\r
+$labels['savemessage']  = 'Lưu thư đang soạn';\r
+$labels['sendmessage']  = 'Gửi thư';\r
+$labels['addattachment']  = 'Gửi kèm';\r
+$labels['charset']  = 'Bộ ký tự';\r
+$labels['returnreceipt'] = 'Báo nhận';\r
+\r
+$labels['checkspelling'] = 'Kiểm tra chính tả';\r
+$labels['resumeediting'] = 'Soạn thảo';\r
+$labels['revertto'] = 'Chuyển về';\r
+\r
+$labels['attachments'] = 'Gửi kèm';\r
+$labels['upload'] = 'Tải lên';\r
+$labels['close']  = 'Đóng';\r
+\r
+$labels['low']     = 'Thấp';\r
+$labels['lowest']  = 'Thấp nhất';\r
+$labels['normal']  = 'Bình thường';\r
+$labels['high']    = 'Khẩn';\r
+$labels['highest'] = 'Thượng khẩn';\r
+\r
+$labels['nosubject']  = '(no subject)';\r
+$labels['showimages'] = 'Hiển thị ảnh';\r
+\r
+// address boook\r
+$labels['name']      = 'Tên hiển thị';\r
+$labels['firstname'] = 'Tên';\r
+$labels['surname']   = 'Họ';\r
+$labels['email']     = 'E-Mail';\r
+\r
+$labels['addcontact'] = 'Thêm mới địa chỉ';\r
+$labels['editcontact'] = 'Sửa địa chỉ cũ';\r
+\r
+$labels['edit']   = 'Sửa đổi';\r
+$labels['cancel'] = 'Ngưng';\r
+$labels['save']   = 'Lưu';\r
+$labels['delete'] = 'Xóa';\r
+\r
+$labels['newcontact']     = 'Thêm mới địa chỉ liên hệ';\r
+$labels['deletecontact']  = 'Xóa địa chỉ được chọn';\r
+$labels['composeto']      = 'Soạn thư cho';\r
+$labels['contactsfromto'] = 'Địa chỉ từ $from - $to / $count';\r
+$labels['print']          = 'In thư';\r
+$labels['export']         = 'Export';\r
+\r
+$labels['previouspage']   = 'Trang trước';\r
+$labels['nextpage']       = 'Trang tiếp';\r
+\r
+// LDAP search\r
+$labels['ldapsearch'] = 'LDAP directory search';\r
+\r
+$labels['ldappublicsearchname']    = 'Tên địa chỉ';\r
+$labels['ldappublicsearchtype'] = 'Khớp toàn bộ?';\r
+$labels['ldappublicserverselect'] = 'Chọn máy chủ';\r
+$labels['ldappublicsearchfield'] = 'Tìm trên';\r
+$labels['ldappublicsearchform'] = 'Tìm địa chỉ liên hệ';\r
+$labels['ldappublicsearch'] = 'Tìm kiếm';\r
+\r
+// settings\r
+$labels['settingsfor']  = 'Thiết lập cho';\r
+\r
+$labels['preferences']  = 'Tham số';\r
+$labels['userpreferences']  = 'Tham số người dùng';\r
+$labels['editpreferences']  = 'Sửa đổi';\r
+\r
+$labels['identities']  = 'Người dùng';\r
+$labels['manageidentities']  = 'Quản trị người dùng';\r
+$labels['newidentity']  = 'Người dùng mới';\r
+\r
+$labels['newitem']  = 'Thêm mới';\r
+$labels['edititem']  = 'Sửa đổi';\r
+\r
+$labels['setdefault']  = 'Thiết lập mặc định';\r
+$labels['language']  = 'Ngôn ngữ';\r
+$labels['timezone']  = 'Múi giờ';\r
+$labels['pagesize']  = 'Số dòng trên trang';\r
+$labels['signature'] = 'Chữ ký';\r
+$labels['dstactive']  = 'Giờ mùa hè';\r
+\r
+$labels['folder']  = 'Thư mục';\r
+$labels['folders']  = 'Thư mục';\r
+$labels['foldername']  = 'Tên thư mục';\r
+$labels['subscribed']  = 'Cho sử dụng';\r
+$labels['create']  = 'Tạo';\r
+$labels['createfolder']  = 'Tạo thư mục mới';\r
+$labels['rename'] = 'Đổi tên';\r
+$labels['renamefolder'] = 'Đổi tên thư mục';\r
+$labels['deletefolder']  = 'Xóa thư mục';\r
+$labels['managefolders']  = 'Quản trị thư mục';\r
+\r
+$labels['sortby'] = 'Sắp xếp';\r
+$labels['sortasc']  = 'Xếp tăng dần';\r
+$labels['sortdesc'] = 'Xếp giảm dần';\r
+\r
+?>
\ No newline at end of file
diff --git a/program/localization/vn/messages.inc b/program/localization/vn/messages.inc
new file mode 100644 (file)
index 0000000..9cf2fdb
--- /dev/null
@@ -0,0 +1,66 @@
+<?php\r
+\r
+/*\r
+\r
+ +-----------------------------------------------------------------------+\r
+ | language/vn/messages.inc                                              |\r
+ |                                                                       |\r
+ | Language file of the RoundCube Webmail client                         |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |\r
+ +-----------------------------------------------------------------------+\r
+ | Author: Vinh Bui <bqvinh@buivinh.info>                                |\r
+ +-----------------------------------------------------------------------+\r
+\r
+ @version $Id$\r
+\r
+*/\r
+\r
+$messages = array();\r
+$messages['loginfailed']  = 'Không đăng nhập được';\r
+$messages['cookiesdisabled'] = 'Trình duyệt không hỗ trợ cookies';\r
+$messages['sessionerror'] = 'Phiên làm việc không hợp lệ hoặc đã hết hạn';\r
+$messages['imaperror'] = 'Không kết nối được với máy chủ IMAP';\r
+$messages['nomessagesfound'] = 'Không có thư trong hòm thư này';\r
+$messages['loggedout'] = 'Phiên làm việc đã kết thúc. Hẹn gặp lại!';\r
+$messages['mailboxempty'] = 'Hộp thư rỗng';\r
+$messages['loading'] = 'Vui lòng chờ trong giây lát...';\r
+$messages['loadingdata'] = 'Đang nạp dữ liệu...';\r
+$messages['checkingmail'] = 'Kiểm tra thư mới...';\r
+$messages['sendingmessage'] = 'Đang gửi thư...';\r
+$messages['messagesent'] = 'Thư đã được gửi';\r
+$messages['savingmessage'] = 'Đang lưu thư...';\r
+$messages['messagesaved'] = 'Thư đã được gửi vào ngăn Drafts';\r
+$messages['successfullysaved'] = 'Đã lưu thành công';\r
+$messages['addedsuccessfully'] = 'Địa chỉ liên hệ đã được lưu';\r
+$messages['contactexists'] = 'Địa chỉ liên hệ với e-mail này đã được lưu trước đây';\r
+$messages['blockedimages'] = 'Để bảo vệ tính riêng tư, chức năng hiện ảnh từ xa bị cấm trong thư này.';\r
+$messages['encryptedmessage'] = 'Thư này được mã hóa, không thể xem. Rất tiếc!';\r
+$messages['nocontactsfound'] = 'Không tìm thấy địa chỉ liên hệ';\r
+$messages['sendingfailed'] = 'Không gửi được thư';\r
+$messages['errorsaving'] = 'Lỗi khi lưu';\r
+$messages['errormoving'] = 'Không thể chuyển được thư';\r
+$messages['errordeleting'] = 'Không thể xóa được thư';\r
+$messages['deletecontactconfirm']  = 'Xóa bỏ các địa chỉ được chọn?';\r
+$messages['deletefolderconfirm']  = 'Xóa bỏ thư mục này?';\r
+$messages['purgefolderconfirm']  = 'Xóa toàn bộ thư trong thư mục nào?';\r
+$messages['formincomplete'] = 'Mẫu chưa được điền xong';\r
+$messages['noemailwarning'] = 'Nhập địa chỉ email';\r
+$messages['nonamewarning']  = 'Nhập tên';\r
+$messages['nopagesizewarning'] = 'Nhập kích cỡ của trang';\r
+$messages['norecipientwarning'] = 'Thư cần có it nhất 1 người nhận';\r
+$messages['nosubjectwarning']  = 'Mục "Tiêu đề" chưa có. Điền tiêu đề ?';\r
+$messages['nobodywarning'] = 'Thư không nội dung, vẫn tiếp tục gửi?';\r
+$messages['notsentwarning'] = 'Thư chưa được gửi. Bỏ qua thư đang soạn?';\r
+$messages['noldapserver'] = 'Chọn máy chủ ldap server để tìm';\r
+$messages['nocontactsreturned'] = 'Không tìm thấy địa chỉ';\r
+$messages['nosearchname'] = 'Nhập địa chỉ hoặc email';\r
+$messages['searchsuccessful'] = '$nr messages found';\r
+$messages['searchnomatch'] = 'Không tìm thấy';\r
+$messages['searching'] = 'Tìm kiếm...';\r
+$messages['checking'] = 'Kiểm tra...';\r
+$messages['nospellerrors'] = 'Không có lỗi chính tả';\r
+$messages['folderdeleted'] = 'Thư mục đã được xóa';\r
+\r
+?>
\ No newline at end of file
index aa88a1106b927df563b364c960efcee590e6af58..a462589e25a95fac71cae52f776394f9206c820c 100644 (file)
@@ -6,15 +6,14 @@
  | localization/zh_CN/labels.inc                                         |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: kourge <kourge@gmail.com>                                     |
- |         Xue zhong sheng <xue.zhongsheng@gmail.com>                    |
+ | Author: Xue zhong sheng <xue.zhongsheng@gmail.com>                    |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 672 2007-08-10 14:46:53Z thomasb $
+ @version $Id: labels.inc 1143 2008-02-26 20:50:10Z yllar $
 
 */
 
@@ -178,4 +177,4 @@ $labels['sortby'] = '排序';
 $labels['sortasc'] = '递增排序';
 $labels['sortdesc'] = '递减排序';
 
-?>
\ No newline at end of file
+?>
index 65c46e952d81b109b187e97487318f9763563a83..94c524a68765caa0e7f707761ded22750938fa2d 100644 (file)
@@ -6,15 +6,14 @@
  | localization/zh_CN/messages.inc                                       |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: kourge <kourge@gmail.com>                                     |
- |         Xue zhong sheng <xue.zhongsheng@gmail.com>                    |
+ | Author: Xue zhong sheng <xue.zhongsheng@gmail.com>                    |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 672 2007-08-10 14:46:53Z thomasb $
+ @version $Id: messages.inc 1143 2008-02-26 20:50:10Z yllar $
 
 */
 
@@ -75,4 +74,4 @@ $messages['copyerror'] = '无法复制地址';
 $messages['sourceisreadonly'] = '源地址为只读';
 $messages['errorsavingcontact'] = '无法保存联系人的地址';
 
-?>
\ No newline at end of file
+?>
index 93317893bc412788d402937bfbcc1aae15d4ed9d..3d256b9efbf9cd57e7146b477c29c03696d22dc1 100644 (file)
@@ -6,7 +6,7 @@
  | localization/tw/labels.inc                                            |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Ting-Hung Chiu <earrl@mmlab.cse.yzu.edu.tw>                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: labels.inc 584 2007-05-24 03:49:19Z estadtherr $
+ @version $Id: labels.inc 1086 2008-02-15 05:43:32Z tomekp $
 
 */
 
@@ -45,7 +45,7 @@ $labels['priority'] = '優先順序';
 $labels['organization'] = '組織';
 $labels['reply-to'] = '回覆至';
 $labels['mailboxlist'] = '資料夾';
-$labels['messagesfromto'] = '郵件 $from 至 $to,共有 $count 郵件';
+$labels['messagesfromto'] = '郵件 $from 至 $to,共有 $count 郵件';
 $labels['messagenrof'] = '第 $nr 封郵件,共有 $count 封';
 $labels['moveto'] = '移至...';
 $labels['download'] = '下載';
@@ -75,7 +75,8 @@ $labels['writenewmessage'] = '撰寫新郵件';
 $labels['replytomessage'] = '回覆';
 $labels['replytoallmessage'] = '全部回覆';
 $labels['forwardmessage'] = '轉寄';
-$labels['deletemessage'] = '移至垃圾郵件';
+$labels['deletemessage'] = '刪除郵件';
+$labels['movemessagetotrash'] = '移動郵件至垃圾桶';
 $labels['printmessage'] = '列印此郵件';
 $labels['previousmessage'] = '顯示上一封郵件';
 $labels['previousmessages'] = '顯示上一頁';
@@ -87,6 +88,9 @@ $labels['lastmessage'] = '顯示最後一封郵件';
 $labels['lastmessages'] = '顯示最後一頁';
 $labels['backtolist'] = '回到郵件清單';
 $labels['viewsource'] = '顯示原始郵件';
+$labels['markmessages'] = '標記郵件為';
+$labels['markread'] = '已讀';
+$labels['markunread'] = '未讀';
 $labels['select'] = '選擇';
 $labels['all'] = '全部';
 $labels['none'] = '無';
@@ -96,12 +100,12 @@ $labels['empty'] = '清空';
 $labels['purge'] = '清除';
 $labels['quota'] = '磁碟使用量';
 $labels['unknown'] = '未知';
-$labels['unlimited'] = '沒有限制';
+$labels['unlimited'] = '限制';
 $labels['quicksearch'] = '快速搜尋';
 $labels['resetsearch'] = '重設搜尋';
 $labels['compose'] = '撰寫新郵件';
-$labels['sendmessage'] = '立即寄出';
 $labels['savemessage'] = '存至草稿匣';
+$labels['sendmessage'] = '立即寄出';
 $labels['addattachment'] = '增加附件檔案';
 $labels['charset'] = '字元集';
 $labels['editortype'] = '編輯器類型';
@@ -121,6 +125,13 @@ $labels['nosubject'] = '(沒有主旨)';
 $labels['showimages'] = '顯示圖片';
 $labels['htmltoggle'] = 'HTML';
 $labels['plaintoggle'] = '純文字';
+$labels['addcc'] = '新增副本';
+$labels['addbcc'] = '新增密件副本';
+$labels['addreplyto'] = '新增回覆地址';
+$labels['mdnrequest'] = '此郵件的寄件者希望在你閱讀此郵件時受到通知。你想要通知寄件者嗎?';
+$labels['receiptread'] = '郵件回條(已閱讀)';
+$labels['yourmessage'] = '這是你郵件的郵件回條';
+$labels['receiptnote'] = '注意:此回條只能確認收件者的電腦顯示了郵件,並不能保證收件者已閱讀或了解郵件的內容。';
 $labels['name'] = '顯示名稱';
 $labels['firstname'] = '名稱';
 $labels['surname'] = '姓氏';
@@ -132,7 +143,7 @@ $labels['cancel'] = '取消';
 $labels['save'] = '儲存';
 $labels['delete'] = '刪除';
 $labels['newcontact'] = '建立新聯絡人卡片';
-$labels['deletecontact'] = '刪除所選擇聯絡人';
+$labels['deletecontact'] = '刪除所選擇聯絡人';
 $labels['composeto'] = '寄信至';
 $labels['contactsfromto'] = '聯絡人 $from 至 $to,共有 $count 人';
 $labels['print'] = '列印';
@@ -148,7 +159,7 @@ $labels['preferences'] = '設定';
 $labels['userpreferences'] = '個人設定';
 $labels['editpreferences'] = '編輯個人設定';
 $labels['identities'] = '身份資訊';
-$labels['manageidentities'] = '管理此帳號之身分資訊';
+$labels['manageidentities'] = '管理此帳號的身份資訊';
 $labels['newidentity'] = '新增身份資訊';
 $labels['newitem'] = '新增項目';
 $labels['edititem'] = '編輯項目';
@@ -168,6 +179,7 @@ $labels['folder'] = '資料夾';
 $labels['folders'] = '資料夾';
 $labels['foldername'] = '資料夾名稱';
 $labels['subscribed'] = '已訂閱';
+$labels['messagecount'] = '個郵件';
 $labels['create'] = '建立';
 $labels['createfolder'] = '建立新資料夾';
 $labels['rename'] = '重新命名';
index 6de331b3ef121a2e05290ef83483776f17821a1b..bc348a1ec4a53bc36831732e782b044485f89aa0 100644 (file)
@@ -6,7 +6,7 @@
  | localization/tw/messages.inc                                          |
  |                                                                       |
  | Language file of the RoundCube Webmail client                         |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  +-----------------------------------------------------------------------+
@@ -14,7 +14,7 @@
  |         Ting-Hung Chiu <earrl@mmlab.cse.yzu.edu.tw>                   |
  +-----------------------------------------------------------------------+
 
- @version $Id: messages.inc 584 2007-05-24 03:49:19Z estadtherr $
+ @version $Id: messages.inc 1086 2008-02-15 05:43:32Z tomekp $
 
 */
 
@@ -41,7 +41,7 @@ $messages['encryptedmessage'] = '此郵件經過加密,因此無法顯示。
 $messages['nocontactsfound'] = '沒有找到任何聯絡人';
 $messages['contactnotfound'] = '找不到要求的聯絡人';
 $messages['sendingfailed'] = '郵件寄出失敗';
-$messages['errorsaving'] = '儲存過程當中發生錯誤';
+$messages['errorsaving'] = '儲存發生錯誤';
 $messages['errormoving'] = '無法移動此郵件';
 $messages['errordeleting'] = '無法刪除此郵件';
 $messages['deletecontactconfirm'] = '你確定要刪除已選擇的聯絡人?';
@@ -74,5 +74,10 @@ $messages['copysuccess'] = '複製 $nr 個位址成功';
 $messages['copyerror'] = '無法複製任何位址';
 $messages['sourceisreadonly'] = '此來源位址是唯讀的';
 $messages['errorsavingcontact'] = '無法儲存連絡人的位址';
+$messages['movingmessage'] = '移動郵件中...';
+$messages['receiptsent'] = '閱讀回條傳送成功';
+$messages['errorsendingreceipt'] = '無法傳送回條';
+$messages['nodeletelastidentity'] = '你不能刪除此身份,因為只剩一個身份。';
+$messages['addsubfolderhint'] = '此資料夾會成為目前所選資料夾的子資料夾';
 
 ?>
\ No newline at end of file
index 56a9d639dd8810bed62e542638e6b3c0704d729a..44468d15ff99541367f624dde9823b83ad1fa985 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 582 2007-05-18 14:38:11Z thomasb $
+ $Id: func.inc 930 2007-11-25 17:34:19Z thomasb $
 
 */
 
@@ -32,10 +32,7 @@ $CONTACTS->set_pagesize($CONFIG['pagesize']);
 
 // set list properties and session vars
 if (!empty($_GET['_page']))
-  {
-  $CONTACTS->set_page(intval($_GET['_page']));
-  $_SESSION['page'] = $_GET['_page'];
-  }
+  $CONTACTS->set_page(($_SESSION['page'] = intval($_GET['_page'])));
 else
   $CONTACTS->set_page(isset($_SESSION['page']) ?$_SESSION['page'] : 1);
 
index a2100f1d24a5386262ab537dd3a6debf44208f79..3e0301613171cd376602bb4c5bbcf1f40410161d 100644 (file)
@@ -27,18 +27,26 @@ foreach ($a_mailboxes as $mbox_name)
     {
     if ($recent_count = $IMAP->messagecount(NULL, 'RECENT', TRUE))
       {
-      $count = $IMAP->messagecount(NULL, 'ALL', TRUE);
+      // refresh saved search set
+      if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && $IMAP->search_set)
+        $_SESSION['search'][$search_request] = $IMAP->refresh_search();
+        
+      $count_all = $IMAP->messagecount(NULL, 'ALL', TRUE);
       $unread_count = $IMAP->messagecount(NULL, 'UNSEEN', TRUE);
 
-      $OUTPUT->set_env('messagecount', $count);
-      $OUTPUT->command('set_unread_count', $mbox_name, $unread_count, true);
+      $OUTPUT->set_env('messagecount', $IMAP->messagecount());
+      $OUTPUT->command('set_unread_count', $mbox_name, $unread_count, ($mbox_name == 'INBOX'));
       $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text());
       $OUTPUT->command('set_quota', $IMAP->get_quota());
 
       // add new message headers to list
       $a_headers = array();
-      for ($i=$recent_count, $id=$count-$recent_count+1; $i>0; $i--, $id++)
+      for ($i=$recent_count, $id=$count_all-$recent_count+1; $i>0; $i--, $id++)
         {
+        // skip message if it does not match the current search
+        if (!$IMAP->in_searchset($id))
+          continue;
+        
         $header = $IMAP->get_headers($id, NULL, FALSE);
         if ($header->recent)
           $a_headers[] = $header;
index be3ef207032ae1f1bbf3696bdef5d774e3473f0b..71dcbba4779f3efc5d9366ff40eb05290a5d9d23 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: compose.inc 892 2007-10-20 21:47:11Z thomasb $
+ $Id: compose.inc 1039 2008-02-11 17:39:31Z till $
 
 */
 
@@ -30,18 +30,30 @@ define('RCUBE_COMPOSE_DRAFT', 0x0108);
 
 // remove an attachment
 if ($_action=='remove-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_POST['_file'], $regs))
-  {
+{
   $id = $regs[1];
   if (is_array($_SESSION['compose']['attachments'][$id]))
-    {
+  {
     @unlink($_SESSION['compose']['attachments'][$id]['path']);
     $_SESSION['compose']['attachments'][$id] = NULL;
     $OUTPUT->command('remove_from_attachment_list', "rcmfile$id");
     $OUTPUT->send();
     exit;
-    }
   }
+}
 
+if ($_action=='display-attachment' && preg_match('/^rcmfile([0-9]+)$/', $_GET['_file'], $regs))
+{
+  $id = $regs[1];
+  if (is_array($_SESSION['compose']['attachments'][$id]))
+  {
+    $apath = $_SESSION['compose']['attachments'][$id]['path'];
+    header('Content-Type: ' . $_SESSION['compose']['attachments'][$id]['mimetype']);
+    header('Content-Length: ' . filesize($apath));
+    readfile($apath);
+  }
+  exit;
+}
 
 $MESSAGE_FORM = NULL;
 $MESSAGE = NULL;
@@ -52,10 +64,10 @@ $MESSAGE = NULL;
 // compose when a "new/forward/reply/draft" is called - otherwise the old session attachments will appear
 
 if (!is_array($_SESSION['compose']) || $_SESSION['compose']['id'] != get_input_value('_id', RCUBE_INPUT_GET))
-  {
+{
   rcmail_compose_cleanup();
   $_SESSION['compose'] = array('id' => uniqid(rand()));
-  }
+}
 
 // add some labels to client
 rcube_add_label('nosubject', 'norecipientwarning', 'nosubjectwarning', 'nobodywarning', 'notsentwarning', 'savingmessage', 'sendingmessage', 'messagesaved', 'converting');
@@ -63,9 +75,6 @@ rcube_add_label('nosubject', 'norecipientwarning', 'nosubjectwarning', 'nobodywa
 // add config parameter to client script
 $OUTPUT->set_env('draft_autosave', !empty($CONFIG['drafts_mbox']) ? $CONFIG['draft_autosave'] : 0);
 
-// no html editor if globally disabled
-if (!$CONFIG['enable_htmleditor'])
-  $CONFIG['htmleditor'] = false;
 
 // get reference message and set compose mode
 if ($msg_uid = get_input_value('_reply_uid', RCUBE_INPUT_GET))
@@ -77,7 +86,7 @@ else if ($msg_uid = get_input_value('_draft_uid', RCUBE_INPUT_GET))
 
 
 if (!empty($msg_uid))
-  {
+{
   // similar as in program/steps/mail/show.inc
   $MESSAGE = array('UID' => $msg_uid);
   $MESSAGE['headers'] = &$IMAP->get_headers($msg_uid);
@@ -86,32 +95,29 @@ if (!empty($msg_uid))
   $MESSAGE['parts'] = $IMAP->get_mime_numbers($MESSAGE['structure']);
   
   if ($compose_mode == RCUBE_COMPOSE_REPLY)
-    {
+  {
     $_SESSION['compose']['reply_uid'] = $msg_uid;
     $_SESSION['compose']['reply_msgid'] = $MESSAGE['headers']->messageID;
-    $_SESSION['compose']['references']  = $MESSAGE['headers']->reference;
-    $_SESSION['compose']['references'] .= !empty($MESSAGE['headers']->reference) ? ' ' : '';
-    $_SESSION['compose']['references'] .= $MESSAGE['headers']->messageID;
+    $_SESSION['compose']['references']  = trim($MESSAGE['headers']->references . " " . $MESSAGE['headers']->messageID);
 
     if (!empty($_GET['_all']))
       $MESSAGE['reply_all'] = 1;
-    }
+  }
   else if ($compose_mode == RCUBE_COMPOSE_FORWARD)
-    {
+  {
     $_SESSION['compose']['forward_uid'] = $msg_uid;
-    }
+  }
   else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
-    {
+  {
     $_SESSION['compose']['draft_uid'] = $msg_uid;
-    }
-
   }
+}
 
 /****** compose mode functions ********/
 
 
 function rcmail_compose_headers($attrib)
-  {
+{
   global $IMAP, $MESSAGE, $DB, $compose_mode;
   static $sa_recipients = array();
 
@@ -121,7 +127,7 @@ function rcmail_compose_headers($attrib)
   $part = strtolower($attrib['part']);
   
   switch ($part)
-    {
+  {
     case 'from':
       return rcmail_compose_header_from($attrib);
 
@@ -137,16 +143,16 @@ function rcmail_compose_headers($attrib)
         
     case 'cc':
       if (!$fname)
-        {
+      {
         $fname = '_cc';
         $header = 'cc';
-        }
+      }
     case 'bcc':
       if (!$fname)
-        {
+      {
         $fname = '_bcc';
         $header = 'bcc';
-        }
+      }
         
       $allow_attrib = array('id', 'class', 'style', 'cols', 'rows', 'tabindex');
       $field_type = 'textarea';            
@@ -157,15 +163,14 @@ function rcmail_compose_headers($attrib)
       $fname = '_replyto';
       $allow_attrib = array('id', 'class', 'style', 'size', 'tabindex');
       $field_type = 'textfield';
-      break;
-    
-    }
+      break;    
+  }
  
   if ($fname && !empty($_POST[$fname]))
     $fvalue = get_input_value($fname, RCUBE_INPUT_POST, TRUE);
 
   else if ($header && $compose_mode == RCUBE_COMPOSE_REPLY)
-    {
+  {
     // get recipent address(es) out of the message headers
     if ($header=='to' && !empty($MESSAGE['headers']->replyto))
       $fvalue = $MESSAGE['headers']->replyto;
@@ -175,31 +180,31 @@ function rcmail_compose_headers($attrib)
 
     // add recipent of original message if reply to all
     else if ($header=='cc' && !empty($MESSAGE['reply_all']))
-      {
+    {
       if ($v = $MESSAGE['headers']->to)
         $fvalue .= $v;
 
       if ($v = $MESSAGE['headers']->cc)
         $fvalue .= (!empty($fvalue) ? ', ' : '') . $v;
-      }
+    }
 
     // split recipients and put them back together in a unique way
     if (!empty($fvalue))
-      {
+    {
       $to_addresses = $IMAP->decode_address_list($fvalue);
       $fvalue = '';
       foreach ($to_addresses as $addr_part)
-        {
+      {
         if (!empty($addr_part['mailto']) && !in_array($addr_part['mailto'], $sa_recipients) && (!$MESSAGE['FROM'] || !in_array($addr_part['mailto'], $MESSAGE['FROM'])))
-          {
+        {
           $fvalue .= (strlen($fvalue) ? ', ':'').$addr_part['string'];
           $sa_recipients[] = $addr_part['mailto'];
-          }
         }
       }
     }
+  }
   else if ($header && $compose_mode == RCUBE_COMPOSE_DRAFT)
-    {
+  {
     // get drafted headers
     if ($header=='to' && !empty($MESSAGE['headers']->to))
       $fvalue = $IMAP->decode_header($MESSAGE['headers']->to);
@@ -209,11 +214,11 @@ function rcmail_compose_headers($attrib)
 
     if ($header=='bcc' && !empty($MESSAGE['headers']->bcc))
       $fvalue = $IMAP->decode_header($MESSAGE['headers']->bcc);
-    }
+  }
 
         
   if ($fname && $field_type)
-    {
+  {
     // pass the following attributes to the form class
     $field_attrib = array('name' => $fname);
     foreach ($attrib as $attr => $value)
@@ -223,19 +228,19 @@ function rcmail_compose_headers($attrib)
     // create teaxtarea object
     $input = new $field_type($field_attrib);
     $out = $input->show($fvalue);    
-    }
+  }
   
   if ($form_start)
     $out = $form_start.$out;
 
   return $out;  
-  }
+}
 
 
 
 function rcmail_compose_header_from($attrib)
-  {
-  global $IMAP, $MESSAGE, $DB, $OUTPUT, $compose_mode;
+{
+  global $IMAP, $MESSAGE, $DB, $USER, $OUTPUT, $compose_mode;
     
   // pass the following attributes to the form class
   $field_attrib = array('name' => '_from');
@@ -246,37 +251,32 @@ function rcmail_compose_header_from($attrib)
   // extract all recipients of the reply-message
   $a_recipients = array();
   if ($compose_mode == RCUBE_COMPOSE_REPLY && is_object($MESSAGE['headers']))
-    {
+  {
     $MESSAGE['FROM'] = array();
 
     $a_to = $IMAP->decode_address_list($MESSAGE['headers']->to);
     foreach ($a_to as $addr)
-      {
+    {
       if (!empty($addr['mailto']))
         $a_recipients[] = $addr['mailto'];
-      }
+    }
 
     if (!empty($MESSAGE['headers']->cc))
-      {
+    {
       $a_cc = $IMAP->decode_address_list($MESSAGE['headers']->cc);
       foreach ($a_cc as $addr)
-        {
+      {
         if (!empty($addr['mailto']))
           $a_recipients[] = $addr['mailto'];
-        }
       }
     }
+  }
 
   // get this user's identities
-  $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']);
+  $sql_result = $USER->list_identities();
 
   if ($DB->num_rows($sql_result))
-    {
+  {
     $from_id = 0;
     $a_signatures = array();
 
@@ -284,22 +284,22 @@ function rcmail_compose_header_from($attrib)
     $select_from = new select($field_attrib);
 
     while ($sql_arr = $DB->fetch_assoc($sql_result))
-      {
+    {
       $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[$identity_id]['text'] = $sql_arr['signature'];
         $a_signatures[$identity_id]['is_html'] = ($sql_arr['html_signature'] == 1) ? true : false;
         if ($a_signatures[$identity_id]['is_html'])
-          {
+        {
             $h2t = new html2text($a_signatures[$identity_id]['text'], false, false);
             $plainTextPart = $h2t->get_text();
             $a_signatures[$identity_id]['plain_text'] = trim($plainTextPart);
-          }
         }
+      }
 
       // set identity if it's one of the reply-message recipients
       if (in_array($sql_arr['email'], $a_recipients))
@@ -310,7 +310,7 @@ function rcmail_compose_header_from($attrib)
 
       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
     if (isset($_POST['_from']))
@@ -320,23 +320,22 @@ function rcmail_compose_header_from($attrib)
 
     // add signatures to client
     $OUTPUT->set_env('signatures', $a_signatures);
-    }
+  }
   else
-    {
+  {
     $input_from = new textfield($field_attrib);
     $out = $input_from->show($_POST['_from']);
-    }
+  }
   
   if ($form_start)
     $out = $form_start.$out;
 
   return $out;
-  }
+}
 
-  
 
 function rcmail_compose_body($attrib)
-  {
+{
   global $CONFIG, $OUTPUT, $MESSAGE, $compose_mode;
   
   list($form_start, $form_end) = get_form_tags($attrib);
@@ -410,12 +409,9 @@ function rcmail_compose_body($attrib)
     $body = rcmail_create_draft_body($body, $isHtml);
     }
 
-  if ($CONFIG['enable_htmleditor'])
-    {
-    $OUTPUT->include_script('tiny_mce/tiny_mce.js');
-    $OUTPUT->include_script("editor.js");
-    $OUTPUT->add_script('rcmail_editor_init("$__skin_path");');
-    }
+  $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" : '';
 
@@ -470,11 +466,11 @@ function rcmail_compose_body($attrib)
   $out .= "\n".'<iframe name="savetarget" src="program/blank.gif" style="width:0;height:0;visibility:hidden;"></iframe>';
 
   return $out;
-  }
+}
 
 
 function rcmail_create_reply_body($body, $bodyIsHtml)
-  {
+{
   global $IMAP, $MESSAGE;
 
   if (! $bodyIsHtml)
@@ -487,12 +483,12 @@ function rcmail_create_reply_body($body, $bodyIsHtml)
   
     // 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);
 
@@ -511,21 +507,21 @@ function rcmail_create_reply_body($body, $bodyIsHtml)
   }
   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));
+    $prefix = sprintf("<br><br>On %s, %s wrote:<br><blockquote type=\"cite\" " .
+                      "style=\"padding-left: 5px; border-left: #1010ff 2px solid; " .
+                      "margin-left: 5px; width: 100%%\">",
+                      $MESSAGE['headers']->date,
+                      $IMAP->decode_header($MESSAGE['headers']->from));
 
-     $suffix = "</blockquote>";
+    $suffix = "</blockquote>";
   }
 
   return $prefix.$body.$suffix;
-  }
+}
 
 
 function rcmail_create_forward_body($body, $bodyIsHtml)
-  {
+{
   global $IMAP, $MESSAGE;
 
   if (! $bodyIsHtml)
@@ -541,7 +537,7 @@ function rcmail_create_forward_body($body, $bodyIsHtml)
   }
   else
   {
-      $prefix = sprintf(
+    $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>" .
@@ -560,24 +556,28 @@ function rcmail_create_forward_body($body, $bodyIsHtml)
     rcmail_write_compose_attachments($MESSAGE);
     
   return $prefix.$body;
-  }
+}
 
 
 function rcmail_create_draft_body($body, $bodyIsHtml)
-  {
+{
   global $IMAP, $MESSAGE;
-    
-  // add attachments
-  if (!isset($_SESSION['compose']['forward_attachments']) &&
-      is_array($MESSAGE['parts']) && sizeof($MESSAGE['parts'])>1)
+  
+  /**
+   * add attachments
+   * sizeof($MESSAGE['parts'] can be 1 - e.g. attachment, but no text!
+   */
+  if (!isset($_SESSION['compose']['forward_attachments'])
+      && is_array($MESSAGE['parts'])
+      && count($MESSAGE['parts']) > 0)
     rcmail_write_compose_attachments($MESSAGE);
 
   return $body;
-  }
+}
   
   
 function rcmail_write_compose_attachments(&$message)
-  {
+{
   global $IMAP, $CONFIG;
 
   $temp_dir = unslashify($CONFIG['temp_dir']);
@@ -586,14 +586,14 @@ function rcmail_write_compose_attachments(&$message)
     $_SESSION['compose']['attachments'] = array();
   
   foreach ($message['parts'] as $pid => $part)
-    {
-    if ($part->ctype_primary != 'message' && $part->ctype_primary != 'text' &&
+  {
+    if ($part->ctype_primary != 'message' &&
         ($part->disposition=='attachment' || $part->disposition=='inline' || $part->headers['content-id'] ||
          (empty($part->disposition) && $part->filename)))
-      {
+    {
       $tmp_path = tempnam($temp_dir, 'rcmAttmnt');
       if ($fp = fopen($tmp_path, 'w'))
-        {
+      {
         fwrite($fp, $IMAP->get_message_part($message['UID'], $pid, $part->encoding));
         fclose($fp);
         
@@ -602,16 +602,16 @@ function rcmail_write_compose_attachments(&$message)
           'name' => $part->filename,
           'path' => $tmp_path
           );
-        }
       }
     }
+  }
        
   $_SESSION['compose']['forward_attachments'] = TRUE;
-  }
+}
 
 
 function rcmail_compose_subject($attrib)
-  {
+{
   global $CONFIG, $MESSAGE, $compose_mode;
   
   list($form_start, $form_end) = get_form_tags($attrib);
@@ -628,21 +628,21 @@ function rcmail_compose_subject($attrib)
     
   // create a reply-subject
   else if ($compose_mode == RCUBE_COMPOSE_REPLY)
-    {
+  {
     if (eregi('^re:', $MESSAGE['subject']))
       $subject = $MESSAGE['subject'];
     else
       $subject = 'Re: '.$MESSAGE['subject'];
-    }
+  }
 
   // create a forward-subject
   else if ($compose_mode == RCUBE_COMPOSE_FORWARD)
-    {
+  {
     if (eregi('^fwd:', $MESSAGE['subject']))
       $subject = $MESSAGE['subject'];
     else
       $subject = 'Fwd: '.$MESSAGE['subject'];
-    }
+  }
 
   // creeate a draft-subject
   else if ($compose_mode == RCUBE_COMPOSE_DRAFT)
@@ -653,11 +653,11 @@ function rcmail_compose_subject($attrib)
   $out .= $form_end ? "\n$form_end" : '';
          
   return $out;
-  }
+}
 
 
 function rcmail_compose_attachment_list($attrib)
-  {
+{
   global $OUTPUT, $CONFIG;
   
   // add ID if not given
@@ -670,7 +670,7 @@ function rcmail_compose_attachment_list($attrib)
   $out = '<ul'. $attrib_str . ">\n";
   
   if (is_array($_SESSION['compose']['attachments']))
-    {
+  {
     if ($attrib['deleteicon'])
       $button = sprintf('<img src="%s%s" alt="%s" border="0" style="padding-right:2px;vertical-align:middle" />',
                         $CONFIG['skin_path'],
@@ -687,18 +687,17 @@ function rcmail_compose_attachment_list($attrib)
                       Q(rcube_label('delete')),
                       $button,
                       Q($a_prop['name']));
-    }
+  }
 
   $OUTPUT->add_gui_object('attachmentlist', $attrib['id']);
     
   $out .= '</ul>';
   return $out;
-  }
-
+}
 
 
 function rcmail_compose_attachment_form($attrib)
-  {
+{
   global $OUTPUT, $SESS_HIDDEN_FIELD;
 
   // add ID if not given
@@ -726,21 +725,23 @@ EOF;
   
   $OUTPUT->add_gui_object('uploadbox', $attrib['id']);
   return $out;
-  }
+}
 
 
 function rcmail_compose_attachment_field($attrib)
-  {
+{
   // allow the following attributes to be added to the <input> tag
   $attrib_str = create_attrib_string($attrib, array('id', 'class', 'style', 'size'));
  
   $out = '<input type="file" name="_attachments[]"'. $attrib_str . " />";
   return $out;
-  }
+}
 
 
 function rcmail_priority_selector($attrib)
-  {
+{
+  global $MESSAGE;
+  
   list($form_start, $form_end) = get_form_tags($attrib);
   unset($attrib['form']);
   
@@ -754,18 +755,20 @@ function rcmail_priority_selector($attrib)
                        rcube_label('highest')),
                  array(5, 4, 0, 2, 1));
                  
-  $sel = isset($_POST['_priority']) ? $_POST['_priority'] : 0;
+  $sel = isset($_POST['_priority']) ? $_POST['_priority'] : intval($MESSAGE['headers']->priority);
 
   $out = $form_start ? "$form_start\n" : '';
   $out .= $selector->show($sel);
   $out .= $form_end ? "\n$form_end" : '';
          
   return $out;
-  }
+}
 
 
 function rcmail_receipt_checkbox($attrib)
-  {
+{
+  global $MESSAGE;
+  
   list($form_start, $form_end) = get_form_tags($attrib);
   unset($attrib['form']);
   
@@ -777,19 +780,16 @@ function rcmail_receipt_checkbox($attrib)
   $checkbox = new checkbox($attrib);
 
   $out = $form_start ? "$form_start\n" : '';
-  $out .= $checkbox->show(0);
+  $out .= $checkbox->show($MESSAGE['headers']->mdn_to ? 1 : 0);
   $out .= $form_end ? "\n$form_end" : '';
 
   return $out;
-  }
+}
 
 
 function rcmail_editor_selector($attrib)
 {
   global $CONFIG, $MESSAGE, $compose_mode;
-  
-  if (!$CONFIG['enable_htmleditor'])
-    return '';
 
   $choices = array(
     'html'  => 'htmltoggle',
@@ -805,17 +805,17 @@ function rcmail_editor_selector($attrib)
   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 = '';
   
   $attrib['name'] = '_editorSelect';
   $attrib['onchange'] = 'return rcmail_toggle_editor(this)';
   foreach ($choices as $value => $text)
-    {
+  {
     $checked = '';
     if ((($value == 'html') && $useHtml) ||
         (($value != 'html') && !$useHtml))
@@ -829,26 +829,26 @@ function rcmail_editor_selector($attrib)
                          $rb->show($value),
                          $attrib['id'],
                          rcube_label($text));
-    }
+  }
 
   return $selector;
 }
 
 
 function get_form_tags($attrib)
-  {
+{
   global $CONFIG, $OUTPUT, $MESSAGE_FORM, $SESS_HIDDEN_FIELD;  
 
   $form_start = '';
   if (!strlen($MESSAGE_FORM))
-    {
+  {
     $hiddenfields = new hiddenfield(array('name' => '_task', 'value' => $GLOBALS['_task']));
     $hiddenfields->add(array('name' => '_action', 'value' => 'send'));
 
     $form_start = empty($attrib['form']) ? '<form name="form" action="./" method="post">' : '';
     $form_start .= "\n$SESS_HIDDEN_FIELD\n";
     $form_start .= $hiddenfields->show();
-    }
+  }
     
   $form_end = (strlen($MESSAGE_FORM) && !strlen($attrib['form'])) ? '</form>' : '';
   $form_name = !empty($attrib['form']) ? $attrib['form'] : 'form';
@@ -859,7 +859,7 @@ function get_form_tags($attrib)
   $MESSAGE_FORM = $form_name;
 
   return array($form_start, $form_end);  
-  }
+}
 
 
 // register UI objects
@@ -875,24 +875,54 @@ $OUTPUT->add_handlers(array(
   'receiptcheckbox' => 'rcmail_receipt_checkbox',
 ));
 
-
 /****** get contacts for this user and add them to client scripts ********/
 
 require_once('include/rcube_contacts.inc');
+require_once('include/rcube_ldap.inc'); 
 
-$CONTACTS = new rcube_contacts($DB, $_SESSION['user_id']);
+$CONTACTS = new rcube_contacts($DB, $USER->ID);
 $CONTACTS->set_pagesize(1000);
+
+$a_contacts = array(); 
                                    
 if ($result = $CONTACTS->list_records())
-  {        
-  $a_contacts = array();
+  {
   while ($sql_arr = $result->iterate())
     if ($sql_arr['email'])
       $a_contacts[] = format_email_recipient($sql_arr['email'], JQ($sql_arr['name']));
+  }
+if (isset($CONFIG['ldap_public']))
+  {
+  /* LDAP autocompletion */ 
+  foreach ($CONFIG['ldap_public'] as $ldapserv_config) 
+    { 
+    if ($ldapserv_config['fuzzy_search'] != 1) 
+      { 
+      continue; 
+         } 
+        
+    $LDAP = new rcube_ldap($ldapserv_config); 
+    $LDAP->connect(); 
+    $LDAP->set_pagesize(1000);
   
-  $OUTPUT->set_env('contacts', $a_contacts);
+    $results = $LDAP->search($ldapserv_config['mail_field'], ""); 
+    for ($i = 0; $i < $results->count; $i++) 
+         { 
+         if ($results->records[$i]['email'] != '') 
+           { 
+           $email = $results->records[$i]['email']; 
+           $name = $results->records[$i]['name']; 
+                
+           $a_contacts[] = format_email_recipient($email, JQ($name)); 
+           } 
+         }
+    $LDAP->close(); 
+    }
   }
-
-
+if ($a_contacts) 
+  { 
+       $OUTPUT->set_env('contacts', $a_contacts); 
+  } 
 parse_template('compose');
-?>
+?>
\ No newline at end of file
index 13184e7f91ab70cefe267ec3b909e2ff604860a6..1b740ae6540e501b0226bf795f40922e59703ec9 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: folders.inc 850 2007-10-03 00:13:32Z ihug $
+ $Id: folders.inc 1020 2008-02-05 22:56:29Z thomasb $
 */
 
 $mbox_name = $IMAP->get_mailbox_name();
@@ -39,18 +39,22 @@ if ($_action=='expunge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)))
 // clear mailbox
 else if ($_action=='purge' && ($mbox = get_input_value('_mbox', RCUBE_INPUT_POST)))
 {
-  $success = $IMAP->clear_mailbox($mbox);
-  
-  if ($success && !empty($_REQUEST['_reload']))
+  // we should only be purging trash and junk
+  if($mbox == $CONFIG['trash_mbox'] || $mbox == $CONFIG['junk_mbox']) 
   {
-    $OUTPUT->set_env('messagecount', 0);
-    $OUTPUT->set_env('pagecount', 0);
-    $OUTPUT->command('message_list.clear');
-    $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text());
-    $OUTPUT->command('set_unread_count', $mbox_name, 0);
+    $success = $IMAP->clear_mailbox($mbox);
+  
+    if ($success && !empty($_REQUEST['_reload']))
+    {
+      $OUTPUT->set_env('messagecount', 0);
+      $OUTPUT->set_env('pagecount', 0);
+      $OUTPUT->command('message_list.clear');
+      $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text());
+      $OUTPUT->command('set_unread_count', $mbox_name, 0);
+    }
+    else
+      $commands = "// purged: $success";
   }
-  else
-    $commands = "// purged: $success";
 }
 
 $OUTPUT->send($commands);
index 6d7c751da4b248e926c67462038f00390f3c48b7..7df8dabbc0b708411307c5cdc11443d4b6284989 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 875 2007-10-17 06:50:28Z thomasb $
+ $Id: func.inc 1125 2008-02-20 22:47:06Z thomasb $
 
 */
 
 require_once('lib/html2text.inc');
 require_once('lib/enriched.inc');
+require_once('include/rcube_smtp.inc');
 
 
 $EMAIL_ADDRESS_PATTERN = '/([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9]\\.[a-z]{2,5})/i';
@@ -30,16 +31,10 @@ if (empty($_SESSION['mbox']))
 
 // set imap properties and session vars
 if ($mbox = get_input_value('_mbox', RCUBE_INPUT_GPC))
-  {
-  $IMAP->set_mailbox($mbox);
-  $_SESSION['mbox'] = $mbox;
-  }
+  $IMAP->set_mailbox(($_SESSION['mbox'] = $mbox));
 
 if (!empty($_GET['_page']))
-  {
-  $IMAP->set_page((int)$_GET['_page']);
-  $_SESSION['page'] = (int)$_GET['_page'];
-  }
+  $IMAP->set_page(($_SESSION['page'] = intval($_GET['_page'])));
 
 // set mailbox to INBOX if not set
 if (empty($_SESSION['mbox']))
@@ -53,7 +48,11 @@ if (!isset($_SESSION['sort_order']))
 
 // set message set for search result
 if (!empty($_REQUEST['_search']) && isset($_SESSION['search'][$_REQUEST['_search']]))
+  {
   $IMAP->set_search_set($_SESSION['search'][$_REQUEST['_search']]);
+  $OUTPUT->set_env('search_request', $_REQUEST['_search']);
+  $OUTPUT->set_env('search_text', $_SESSION['last_text_search']);
+  }
 
 
 // define url for getting message parts
@@ -77,7 +76,7 @@ if (!$OUTPUT->ajax_call)
 
 // set page title
 if (empty($_action) || $_action == 'list')
-  $OUTPUT->set_pagetitle(rcube_charset_convert($IMAP->get_mailbox_name(), 'UTF-7'));
+  $OUTPUT->set_pagetitle(rcmail_localize_foldername($IMAP->get_mailbox_name()));
 
 
 
@@ -291,6 +290,7 @@ function rcmail_message_list($attrib)
     $OUTPUT->set_env('attachmenticon', $skin_path . $attrib['attachmenticon']);
   
   $OUTPUT->set_env('messages', $a_js_message_arr);
+  $OUTPUT->set_env('coltypes', $a_show_cols);
   
   $OUTPUT->include_script('list.js');
   
@@ -482,6 +482,127 @@ function rcmail_get_messagecount_text($count=NULL, $page=NULL)
   }
 
 
+/* Stolen from Squirrelmail */
+function sq_deent(&$attvalue, $regex, $hex=false)
+  {
+  $ret_match = false;
+  preg_match_all($regex, $attvalue, $matches);
+  if (is_array($matches) && sizeof($matches[0]) > 0)
+    {
+    $repl = Array();
+    for ($i = 0; $i < sizeof($matches[0]); $i++)
+      {
+      $numval = $matches[1][$i];
+      if ($hex)
+        $numval = hexdec($numval);
+      $repl{$matches[0][$i]} = chr($numval);
+      }
+    $attvalue = strtr($attvalue, $repl);
+    return true;
+    }
+  else
+    return false;
+  }
+
+
+/* Stolen verbatim from Squirrelmail */
+function sq_defang(&$attvalue)
+  {
+  /* Skip this if there aren't ampersands or backslashes. */
+  if ((strpos($attvalue, '&') === false) &&
+      (strpos($attvalue, '\\') === false))
+    return;
+  $m = false;
+  do
+    {
+    $m = false;
+    $m = $m || sq_deent($attvalue, '/\&#0*(\d+);*/s');
+    $m = $m || sq_deent($attvalue, '/\&#x0*((\d|[a-f])+);*/si', true);
+    $m = $m || sq_deent($attvalue, '/\\\\(\d+)/s', true);
+    } while ($m == true);
+  $attvalue = stripslashes($attvalue);
+  }
+
+
+function rcmail_html_filter($html)
+  {
+  preg_match_all('/<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|\'.*?\'|[^\'">\s]+))?)+\s*|\s*)\/?>/', $html, $tags);
+
+  /* From Squirrelmail: Translate all dangerous Unicode or Shift_JIS characters which are accepted by
+   * IE as regular characters. */
+  $replace = array(array('&#x029F;', '&#0671;',  /* L UNICODE IPA Extension */
+                         '&#x0280;', '&#0640;',  /* R UNICODE IPA Extension */
+                         '&#x0274;', '&#0628;',  /* N UNICODE IPA Extension */
+                         '&#xFF25;', '&#65317;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER E */
+                         '&#xFF45;', '&#65349;', /* Unicode FULLWIDTH LATIN SMALL LETTER E */
+                         '&#xFF38;', '&#65336;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER X */
+                         '&#xFF58;', '&#65368;', /* Unicode FULLWIDTH LATIN SMALL LETTER X */
+                         '&#xFF30;', '&#65328;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER P */
+                         '&#xFF50;', '&#65360;', /* Unicode FULLWIDTH LATIN SMALL LETTER P */
+                         '&#xFF32;', '&#65330;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER R */
+                         '&#xFF52;', '&#65362;', /* Unicode FULLWIDTH LATIN SMALL LETTER R */
+                         '&#xFF33;', '&#65331;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER S */
+                         '&#xFF53;', '&#65363;', /* Unicode FULLWIDTH LATIN SMALL LETTER S */
+                         '&#xFF29;', '&#65321;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER I */
+                         '&#xFF49;', '&#65353;', /* Unicode FULLWIDTH LATIN SMALL LETTER I */
+                         '&#xFF2F;', '&#65327;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER O */
+                         '&#xFF4F;', '&#65359;', /* Unicode FULLWIDTH LATIN SMALL LETTER O */
+                         '&#xFF2E;', '&#65326;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER N */
+                         '&#xFF4E;', '&#65358;', /* Unicode FULLWIDTH LATIN SMALL LETTER N */
+                         '&#xFF2C;', '&#65324;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER L */
+                         '&#xFF4C;', '&#65356;', /* Unicode FULLWIDTH LATIN SMALL LETTER L */
+                         '&#xFF35;', '&#65333;', /* Unicode FULLWIDTH LATIN CAPITAL LETTER U */
+                         '&#xFF55;', '&#65365;', /* Unicode FULLWIDTH LATIN SMALL LETTER U */
+                         '&#x207F;', '&#8319;' , /* Unicode SUPERSCRIPT LATIN SMALL LETTER N */
+                         "\xEF\xBC\xA5", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER E */
+                                         /* in unicode this is some Chinese char range */
+                         "\xEF\xBD\x85", /* Shift JIS FULLWIDTH LATIN SMALL LETTER E */
+                         "\xEF\xBC\xB8", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER X */
+                         "\xEF\xBD\x98", /* Shift JIS FULLWIDTH LATIN SMALL LETTER X */
+                         "\xEF\xBC\xB0", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER P */
+                         "\xEF\xBD\x90", /* Shift JIS FULLWIDTH LATIN SMALL LETTER P */
+                         "\xEF\xBC\xB2", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER R */
+                         "\xEF\xBD\x92", /* Shift JIS FULLWIDTH LATIN SMALL LETTER R */
+                         "\xEF\xBC\xB3", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER S */
+                         "\xEF\xBD\x93", /* Shift JIS FULLWIDTH LATIN SMALL LETTER S */
+                         "\xEF\xBC\xA9", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER I */
+                         "\xEF\xBD\x89", /* Shift JIS FULLWIDTH LATIN SMALL LETTER I */
+                         "\xEF\xBC\xAF", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER O */
+                         "\xEF\xBD\x8F", /* Shift JIS FULLWIDTH LATIN SMALL LETTER O */
+                         "\xEF\xBC\xAE", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER N */
+                         "\xEF\xBD\x8E", /* Shift JIS FULLWIDTH LATIN SMALL LETTER N */
+                         "\xEF\xBC\xAC", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER L */
+                         "\xEF\xBD\x8C", /* Shift JIS FULLWIDTH LATIN SMALL LETTER L */
+                         "\xEF\xBC\xB5", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER U */
+                         "\xEF\xBD\x95", /* Shift JIS FULLWIDTH LATIN SMALL LETTER U */
+                         "\xE2\x81\xBF", /* Shift JIS FULLWIDTH SUPERSCRIPT N */
+                         "\xCA\x9F",   /* L UNICODE IPA Extension */
+                         "\xCA\x80",   /* R UNICODE IPA Extension */
+                         "\xC9\xB4"),  /* N UNICODE IPA Extension */
+                   array('l', 'l', 'r', 'r', 'n', 'n', 'E', 'E', 'e', 'e', 'X', 'X', 'x', 'x',
+                         'P', 'P', 'p', 'p', 'R', 'R', 'r', 'r', 'S', 'S', 's', 's', 'I', 'I',
+                         'i', 'i', 'O', 'O', 'o', 'o', 'N', 'N', 'n', 'n', 'L', 'L', 'l', 'l',
+                         'U', 'U', 'u', 'u', 'n', 'n', 'E', 'e', 'X', 'x', 'P', 'p', 'R', 'r',
+                         'S', 's', 'I', 'i', 'O', 'o', 'N', 'n', 'L', 'l', 'U', 'u', 'n', 'l', 'r', 'n'));
+  if ((count($tags)>3) && (count($tags[3])>0))
+    foreach ($tags[3] as $nr=>$value)
+      {
+      /* Remove comments */
+      $newvalue = preg_replace('/(\/\*.*\*\/)/','$2',$value);
+      /* Translate dangerous characters */
+      $newvalue = str_replace($replace[0], $replace[1], $newvalue);
+      sq_defang($newvalue);
+      /* Rename dangerous CSS */
+      $newvalue = preg_replace('/expression/i', 'idiocy', $newvalue);
+      $newvalue = preg_replace('/url/i', 'idiocy', $newvalue);
+      $newattrs = preg_replace('/'.preg_quote($value, '/').'$/', $newvalue, $tags[1][$nr]);
+      $newtag = preg_replace('/'.preg_quote($tags[1][$nr], '/').'/', $newattrs, $tags[0][$nr]);
+      $html = preg_replace('/'.preg_quote($tags[0][$nr], '/').'/', $newtag, $html);
+      }
+  return $html;
+  }
+
+
 function rcmail_print_body($part, $safe=FALSE, $plain=FALSE)
   {
   global $IMAP, $REMOTE_OBJECTS;
@@ -533,7 +654,7 @@ function rcmail_print_body($part, $safe=FALSE, $plain=FALSE)
       $body = preg_replace($remote_patterns, $remote_replaces, $body);
       }
 
-    return Q($body, 'show', FALSE);
+    return Q(rcmail_html_filter($body), 'show', FALSE);
     }
 
   // text/enriched
@@ -639,7 +760,7 @@ function rcmail_parse_message(&$structure, $arg=array(), $recursive=FALSE)
     $structure->type = 'content';
     $a_return_parts[] = &$structure;
     }
-
+    
   // message contains alternative parts
   else if ($message_ctype_primary=='multipart' && $message_ctype_secondary=='alternative' && is_array($structure->parts))
     {
@@ -731,7 +852,7 @@ function rcmail_parse_message(&$structure, $arg=array(), $recursive=FALSE)
 
       // part text/[plain|html] OR message/delivery-status
       else if (($primary_type=='text' && ($secondary_type=='plain' || $secondary_type=='html') && $mail_part->disposition!='attachment') ||
-               ($primary_type=='message' && $secondary_type=='delivery-status'))
+               ($primary_type=='message' && ($secondary_type=='delivery-status' || $secondary_type=='disposition-notification')))
         {
         $mail_part->type = 'content';
         $a_return_parts[] = $mail_part;
@@ -745,6 +866,10 @@ function rcmail_parse_message(&$structure, $arg=array(), $recursive=FALSE)
         $a_return_parts = array_merge($a_return_parts, $parts);
         $a_attachments = array_merge($a_attachments, $attachmnts);
         }
+        
+      // ignore "virtual" protocol parts
+      else if ($primary_type=='protocol')
+        continue;
 
       // part is file/attachment
       else if ($mail_part->disposition=='attachment' || $mail_part->disposition=='inline' || $mail_part->headers['content-id'] ||
@@ -764,7 +889,7 @@ function rcmail_parse_message(&$structure, $arg=array(), $recursive=FALSE)
         else
           {
           if (!$mail_part->filename)
-            $mail_part->filename = 'file_'.$mail_part->mime_id;
+            $mail_part->filename = 'Part '.$mail_part->mime_id;
           $a_attachments[] = $mail_part;
           }
         }
@@ -862,7 +987,7 @@ function rcmail_message_body($attrib)
   if (!$attrib['id'])
     $attrib['id'] = 'rcmailMsgBody';
 
-  $safe_mode = (bool)$_GET['_safe'];
+  $safe_mode = $MESSAGE['is_safe'] || intval($_GET['_safe']);
   $attrib_str = create_attrib_string($attrib, array('style', 'class', 'id'));
   $out = '<div '. $attrib_str . ">\n";
   
@@ -973,10 +1098,10 @@ function rcmail_sanitize_html($body, $container_id)
   // remove SCRIPT tags
   foreach (array('script', 'applet', 'object', 'embed', 'iframe') as $tag)
     {
-    while (($pos = strpos($body_lc, '<'.$tag)) && ($pos2 = strpos($body_lc, '</'.$tag.'>', $pos)))
+    while (($pos = strpos($body_lc, '<'.$tag)) && (($pos2 = strpos($body_lc, '</'.$tag.'>', $pos)) || ($pos3 = strpos($body_lc, '>', $pos))))
       {
-      $pos2 += strlen('</'.$tag.'>');
-      $body = substr($body, 0, $pos) . substr($body, $pos2, strlen($body)-$pos2);
+      $end = $pos2 ? $pos2 + strlen('</'.$tag.'>') : $pos3 + 1;
+      $body = substr($body, 0, $pos) . substr($body, $end, strlen($body)-$end);
       $body_lc = strtolower($body);
       }
     }
@@ -985,7 +1110,7 @@ function rcmail_sanitize_html($body, $container_id)
   while ($body != $prev_body)
     {
     $prev_body = $body;
-    $body = preg_replace('/(<[^!][^>]*\s)(on[^=>]+)=([^>]+>)/im', '$1__removed=$3', $body);
+    $body = preg_replace('/(<[^!][^>]*\s)on(?:load|unload|click|dblclick|mousedown|mouseup|mouseover|mousemove|mouseout|focus|blur|keypress|keydown|keyup|submit|reset|select|change)=([^>]+>)/im', '$1__removed=$2', $body);
     $body = preg_replace('/(<[^!][^>]*\shref=["\']?)(javascript:)([^>]*?>)/im', '$1null:$3', $body);
     }
 
@@ -1197,15 +1322,15 @@ function rcmail_message_part_controls()
   {
   global $CONFIG, $IMAP, $MESSAGE;
   
-  if (!is_array($MESSAGE) || !is_array($MESSAGE['parts']) || !($_GET['_uid'] && $_GET['_part']) || !$MESSAGE['parts'][$_GET['_part']])
+  $part = asciiwords(get_input_value('_part', RCUBE_INPUT_GPC));
+  if (!is_array($MESSAGE) || !is_array($MESSAGE['parts']) || !($_GET['_uid'] && $_GET['_part']) || !$MESSAGE['parts'][$part])
     return '';
     
-  $part = &$MESSAGE['parts'][$_GET['_part']];
-  
+  $part = $MESSAGE['parts'][$part];
   $attrib_str = create_attrib_string($attrib, array('id', 'class', 'style', 'cellspacing', 'cellpadding', 'border', 'summary'));
   $out = '<table '. $attrib_str . ">\n";
   
-  if ($filename)
+  if ($part->filename)
     {
     $out .= sprintf('<tr><td class="title">%s</td><td>%s</td><td>[<a href="./?%s">%s</a>]</tr>'."\n",
                     Q(rcube_label('filename')),
@@ -1230,7 +1355,7 @@ function rcmail_message_part_frame($attrib)
   {
   global $MESSAGE;
   
-  $part = $MESSAGE['parts'][$_GET['_part']];
+  $part = $MESSAGE['parts'][asciiwords(get_input_value('_part', RCUBE_INPUT_GPC))];
   $ctype_primary = strtolower($part->ctype_primary);
 
   $attrib['src'] = Q('./?'.str_replace('_frame=', ($ctype_primary=='text' ? '_show=' : '_preload='), $_SERVER['QUERY_STRING']));
@@ -1255,6 +1380,141 @@ function rcmail_compose_cleanup()
   
   unset($_SESSION['compose']);
   }
+  
+
+/**
+ * Send the given message compose object using the configured method
+ */
+function rcmail_deliver_message(&$message, $from, $mailto)
+{
+  global $CONFIG;
+
+  $headers = $message->headers();
+  $msg_body = $message->get();
+  
+  // send thru SMTP server using custom SMTP library
+  if ($CONFIG['smtp_server'])
+    {
+    // generate list of recipients
+    $a_recipients = array($mailto);
+  
+    if (strlen($headers['Cc']))
+      $a_recipients[] = $headers['Cc'];
+    if (strlen($headers['Bcc']))
+      $a_recipients[] = $headers['Bcc'];
+  
+    // clean Bcc from header for recipients
+    $send_headers = $headers;
+    unset($send_headers['Bcc']);
+
+    // send message
+    $smtp_response = array();
+    $sent = smtp_mail($from, $a_recipients, ($foo = $message->txtHeaders($send_headers)), $msg_body, $smtp_response);
+
+    // log error
+    if (!$sent)
+      raise_error(array('code' => 800, 'type' => 'smtp', 'line' => __LINE__, 'file' => __FILE__,
+                        'message' => "SMTP error: ".join("\n", $smtp_response)), TRUE, FALSE);
+    }
+  
+  // send mail using PHP's mail() function
+  else
+    {
+    // unset some headers because they will be added by the mail() function
+    $headers_enc = $message->headers($headers);
+    $headers_php = $message->_headers;
+    unset($headers_php['To'], $headers_php['Subject']);
+    
+    // reset stored headers and overwrite
+    $message->_headers = array();
+    $header_str = $message->txtHeaders($headers_php);
+  
+    if (ini_get('safe_mode'))
+      $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str);
+    else
+      $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str, "-f$from");
+    }
+  
+  if ($sent)  // remove MDN headers after sending
+    unset($headers['Return-Receipt-To'], $headers['Disposition-Notification-To']);
+  
+  $message->_headers = array();
+  $message->headers($headers);
+  
+  return $sent;
+}
+
+
+function rcmail_send_mdn($uid)
+{
+  global $CONFIG, $USER, $IMAP;
+  
+  $message = array('UID' => $uid);
+  $message['headers'] = $IMAP->get_headers($message['UID']);
+  $message['subject'] = rcube_imap::decode_mime_string($message['headers']->subject, $message['headers']->charset);
+  
+  if ($message['headers']->mdn_to && !$message['headers']->mdn_sent)
+  {
+    $identity = $USER->get_identity();
+    $sender = format_email_recipient($identity['email'], $identity['name']);
+    $recipient = array_shift($IMAP->decode_address_list($message['headers']->mdn_to));
+    $mailto = $recipient['mailto'];
+
+    $compose = new rc_mail_mime(rcmail_header_delm());
+    $compose->setParam(array(
+      'text_encoding' => 'quoted-printable',
+      'html_encoding' => 'quoted-printable',
+      'head_encoding' => 'quoted-printable',
+      'head_charset'  => RCMAIL_CHARSET,
+      'html_charset'  => RCMAIL_CHARSET,
+      'text_charset'  => RCMAIL_CHARSET,
+    ));
+    
+    // compose headers array
+    $headers = array(
+      'Date' => date('r'),
+      'From' => $sender,
+      'To'   => $message['headers']->mdn_to,
+      'Subject' => rcube_label('receiptread') . ': ' . $message['subject'],
+      'Message-ID' => sprintf('<%s@%s>', md5(uniqid('rcmail'.rand(),true)), rcmail_mail_domain($_SESSION['imap_host'])),
+      'X-Sender' => $identity['email'],
+      'Content-Type' => 'multipart/report; report-type=disposition-notification',
+    );
+    
+    if (!empty($CONFIG['useragent']))
+      $headers['User-Agent'] = $CONFIG['useragent'];
+
+    $body = rcube_label("yourmessage") . "\r\n\r\n" .
+      "\t" . rcube_label("to") . ': ' . rcube_imap::decode_mime_string($message['headers']->to, $message['headers']->charset) . "\r\n" .
+      "\t" . rcube_label("subject") . ': ' . $message['subject'] . "\r\n" .
+      "\t" . rcube_label("sent") . ': ' . format_date(strtotime($message['headers']->date), $CONFIG['date_long']) . "\r\n" .
+      "\r\n" . rcube_label("receiptnote") . "\r\n";
+    
+    $ua = !empty($CONFIG['useragent']) ? $CONFIG['useragent'] : "RoundCube Webmail (Version ".RCMAIL_VERSION.")";
+    $report = "Reporting-UA: $ua\r\n";
+    
+    if ($message['headers']->to)
+        $report .= "Original-Recipient: {$message['headers']->to}\r\n";
+    
+    $report .= "Final-Recipient: rfc822; {$identity['email']}\r\n" .
+               "Original-Message-ID: {$message['headers']->messageID}\r\n" .
+               "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
+    
+    $compose->headers($headers, true);
+    $compose->setTXTBody($body);
+    $compose->addAttachment($report, 'message/disposition-notification', 'MDNPart2.txt', false, '7bit', 'inline');
+
+    $sent = rcmail_deliver_message($compose, $identity['email'], $mailto);
+
+    if ($sent)
+    {
+      $IMAP->set_flag($message['UID'], 'MDNSENT');
+      return true;
+    }
+  }
+  
+  return false;
+}
 
 
 // register UI objects
index 91c1a30a583fa3c46df7ff38686cbe7c7bf744ae..c5f94804476979aa05773545394a7331717f31cc 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: get.inc 884 2007-10-18 09:10:35Z thomasb $
+ $Id: get.inc 1026 2008-02-07 07:50:37Z thomasb $
 
 */
 
@@ -88,7 +88,7 @@ else if ($pid = get_input_value('_part', RCUBE_INPUT_GET))
       // we have to analyze the whole structure again to find inline objects
       list($new_parts, $new_attachments) =
         rcmail_parse_message($MESSAGE['structure'],
-                             array('safe' => (bool)$_GET['_safe'],
+                             array('safe' => intval($_GET['_safe']),
                                    'prefer_html' => TRUE,
                                    'get_url' => $GET_URL.'&_part=%s'));
 
@@ -102,16 +102,16 @@ else if ($pid = get_input_value('_part', RCUBE_INPUT_GET))
         $part->body = $IMAP->get_message_part($MESSAGE['UID'], $part->mime_id, $part);
 
       $OUTPUT = new rcube_html_page();
-      $OUTPUT->write(rcmail_print_body($part, (bool)$_GET['_safe']));
+      $OUTPUT->write(rcmail_print_body($part, intval($_GET['_safe'])));
       }
     else
       {
       header(sprintf('Content-Disposition: %s; filename="%s";',
                      $_GET['_download'] ? 'attachment' : 'inline',
-                     $part->filename ? $part->filename : "roundcube.$ctype_secondary"));
+                     $part->filename ? abbreviate_string($part->filename, 55) : "roundcube.$ctype_secondary"));
 
       // turn off output buffering and print part content
-      $IMAP->get_message_part($MESSAGE['UID'], $part->mime_id, $part->encoding, true);
+      $IMAP->get_message_part($MESSAGE['UID'], $part->mime_id, $part, true);
       }
 
     exit;
@@ -130,7 +130,7 @@ else
 
   $cont = ''; 
   list($MESSAGE['parts']) = rcmail_parse_message($MESSAGE['structure'],
-                                                 array('safe' => (bool)$_GET['_safe'],
+                                                 array('safe' => intval($_GET['_safe']),
                                                  'get_url' => $GET_URL.'&_part=%s'));
 
   $cont = "<html>\n<head><title></title>\n</head>\n<body>";
index 0650ebe0303c7999529d99652d857761bad7db55..897a10b96ce2bb03dc57547cb3234b4cbfb54aa4 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: getunread.inc 850 2007-10-03 00:13:32Z ihug $
+ $Id: getunread.inc 1019 2008-02-05 21:39:08Z thomasb $
 
 */
 
@@ -24,7 +24,7 @@ $a_folders = $IMAP->list_mailboxes();
 if (!empty($a_folders))
 {
   foreach ($a_folders as $mbox_row)
-    $OUTPUT->command('set_unread_count', $mbox_row, $IMAP->messagecount($mbox_row, 'UNSEEN'));
+    $OUTPUT->command('set_unread_count', $mbox_row, $IMAP->messagecount($mbox_row, 'UNSEEN'), ($IMAP->get_mailbox_name() == 'INBOX' && $mbox_row == 'INBOX'));
 }
 
 $OUTPUT->send();
index 2937f78de3a1ceca3e44247b27aa622074497d9f..4c948bed4ab64b7574b2f3e8cf236f2048208d9b 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: list.inc 850 2007-10-03 00:13:32Z ihug $
+ $Id: list.inc 1019 2008-02-05 21:39:08Z thomasb $
 
 */
 
@@ -40,9 +40,10 @@ else
 $mbox_name = $IMAP->get_mailbox_name();
 
 // fetch message headers
-if ($count = $IMAP->messagecount($mbox_name, 'ALL', !empty($_REQUEST['_refresh'])))
+if ($IMAP->messagecount($mbox_name, 'ALL', !empty($_REQUEST['_refresh'])))
   $a_headers = $IMAP->list_headers($mbox_name, NULL, $sort_col, $sort_order);
 
+$count = $IMAP->messagecount($mbox_name);
 $unseen = $IMAP->messagecount($mbox_name, 'UNSEEN', !empty($_REQUEST['_refresh']));
 
 // update message count display
@@ -51,9 +52,6 @@ $OUTPUT->set_env('messagecount', $count);
 $OUTPUT->set_env('pagecount', $pages);
 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count));
 
-// update mailboxlist
-$OUTPUT->command('set_unread_count', $mbox_name, $unseen);
-
 
 // add message rows
 if (isset($a_headers) && count($a_headers))
@@ -61,6 +59,9 @@ if (isset($a_headers) && count($a_headers))
 else
   $OUTPUT->show_message('nomessagesfound', 'notice');
   
+// update mailboxlist
+$OUTPUT->command('set_unread_count', $mbox_name, $unseen, ($mbox_name == 'INBOX'));
+
 // send response
 $OUTPUT->send();
 
index 3958329e739f6b093970a43bc9c96d36e164654b..2010075fab34307ff11175fc6c42b63ed653096d 100644 (file)
@@ -14,7 +14,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: mark.inc 573 2007-05-18 11:29:25Z thomasb $
+ $Id: mark.inc 1019 2008-02-05 21:39:08Z thomasb $
 
 */
 
@@ -32,7 +32,7 @@ if (($uids = get_input_value('_uid', RCUBE_INPUT_POST)) && ($flag = get_input_va
   if ($marked != -1)
   {
     $mbox_name = $IMAP->get_mailbox_name();
-    $OUTPUT->command('set_unread_count', $mbox_name, $IMAP->messagecount($mbox_name, 'UNSEEN'));
+    $OUTPUT->command('set_unread_count', $mbox_name, $IMAP->messagecount($mbox_name, 'UNSEEN'), ($mbox_name == 'INBOX'));
     $OUTPUT->send();
   }
 }
index ffe96fdad502ce6e3ddb6c777048435e9dfaaa88..5f518ed56e8f7c6e03e213ec1f24024993a08244 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: move_del.inc 848 2007-10-02 08:42:18Z thomasb $
+ $Id: move_del.inc 1019 2008-02-05 21:39:08Z thomasb $
 
 */
 
@@ -60,7 +60,7 @@ else if ($_action=='delete' && !empty($_POST['_uid']))
 else
   exit;
 
-// refresh saved seach set after moving some messages
+// refresh saved search set after moving some messages
 if (($search_request = get_input_value('_search', RCUBE_INPUT_GPC)) && $IMAP->search_set)
   $_SESSION['search'][$search_request] = $IMAP->refresh_search();
 
@@ -86,7 +86,7 @@ $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($msg_count));
 
 // update mailboxlist
 $mbox = $IMAP->get_mailbox_name();
-$OUTPUT->command('set_unread_count', $mbox, $IMAP->messagecount($mbox, 'UNSEEN'));
+$OUTPUT->command('set_unread_count', $mbox, $IMAP->messagecount($mbox, 'UNSEEN'), ($mbox == 'INBOX'));
 
 if ($_action=='moveto' && $target)
   $OUTPUT->command('set_unread_count', $target, $IMAP->messagecount($target, 'UNSEEN'));
index b32bfa491d130fdc995c18227f242db5d06b0db8..a0c20b989f865ceea6c09a176fec00e97adaba69 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Sjon Hortensius <sjon@hortensius.net>                         |
  +-----------------------------------------------------------------------+
 
- $Id: rss.inc 850 2007-10-03 00:13:32Z ihug $
+ $Id: rss.inc 931 2007-11-25 19:45:38Z thomasb $
 
 */
 
@@ -79,7 +79,7 @@ echo '
 
 // Check if the user wants to override the default sortingmethode
 if (isset($_GET['_sort']))
-  list($sort_col, $sort_order) = explode('_', $_GET['_sort']);
+  list($sort_col, $sort_order) = explode('_', get_input_value('_sort', RCUBE_INPUT_GET));
 
 // Add message to output
 if ($messagecount > 0)
index a3f6dda66cdf5524f95a9dc7e8874f1f6ae008d3..66fcf47a3554c618f8ca7fe7f18763822b90dfd2 100644 (file)
@@ -64,7 +64,8 @@ else if (preg_match("/^body:/i", $str))
 // search in subject and sender by default
 else
 {
-  $subject = array("HEADER SUBJECT", "HEADER FROM");
+  $from = ($mbox == $CONFIG['sent_mbox'] || $mbox == $CONFIG['drafts_mbox']) ? "TO" : "FROM";
+  $subject = array("HEADER SUBJECT", "HEADER $from");
   $search = trim($str);
 }
 
@@ -88,6 +89,7 @@ if (is_array($result) && $result[0] != '')
   if ($result_h != NULL)
   {
     $_SESSION['search'][$search_request] = $IMAP->get_search_set();
+    $_SESSION['last_text_search'] = $str;
     rcmail_js_message_list($result_h);
     $OUTPUT->show_message('searchsuccessful', 'confirmation', array('nr' => $count));
   }
@@ -106,4 +108,4 @@ $OUTPUT->set_env('pagecount', $pages);
 $OUTPUT->command('set_rowcount', rcmail_get_messagecount_text($count, 1));
 $OUTPUT->send();
 
-?>
\ No newline at end of file
+?>
index 8ea5f13318eccebc677bd971e3986c840a5f4663..12dd18a6ceddba4e9358d5f67246fe96d5df174b 100644 (file)
  |                                                                       |
  | PURPOSE:                                                              |
  |   Compose a new mail message with all headers and attachments         |
- |   and send it using IlohaMail's SMTP methods or with PHP mail()       |
+ |   and send it using the PEAR::Net_SMTP class or with PHP mail()       |
  |                                                                       |
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: sendmail.inc 816 2007-09-26 08:13:21Z thomasb $
+ $Id: sendmail.inc 1120 2008-02-19 23:59:38Z thomasb $
 
 */
 
 
 //require_once('lib/smtp.inc');
-require_once('include/rcube_smtp.inc');
 require_once('lib/html2text.inc');
 require_once('lib/rc_mail_mime.inc');
 
@@ -37,26 +36,19 @@ if (!isset($_SESSION['compose']['id']))
 /****** message sending functions ********/
 
 
+// get identity record
 function rcmail_get_identity($id)
   {
-  global $DB, $OUTPUT;
+  global $USER, $OUTPUT;
   
-  // get identity record
-  $sql_result = $DB->query("SELECT *, email AS mailto
-                            FROM ".get_table_name('identities')."
-                            WHERE  identity_id=?
-                            AND    user_id=?
-                            AND    del<>1",
-                            $id,$_SESSION['user_id']);
-                                   
-  if ($DB->num_rows($sql_result))
+  if ($sql_arr = $USER->get_identity($id))
     {
-    $sql_arr = $DB->fetch_assoc($sql_result);
     $out = $sql_arr;
+    $out['mailto'] = $sql_arr['email'];
     $name = strpos($sql_arr['name'], ",") ? '"'.$sql_arr['name'].'"' : $sql_arr['name'];
     $out['string'] = sprintf('%s <%s>',
                              rcube_charset_convert($name, RCMAIL_CHARSET, $OUTPUT->get_charset()),
-                             $sql_arr['mailto']);
+                             $sql_arr['email']);
     return $out;
     }
 
@@ -137,7 +129,7 @@ $OUTPUT->framed = TRUE;
 /****** check submission and compose message ********/
 
 
-if (!$savedraft && empty($_POST['_to']) && empty($_POST['_subject']) && $_POST['_message'])
+if (!$savedraft && empty($_POST['_to']) && empty($_POST['_cc']) && empty($_POST['_bcc']) && empty($_POST['_subject']) && $_POST['_message'])
   {
   $OUTPUT->show_message("sendingfailed", 'error');
   $OUTPUT->send('iframe');
@@ -154,28 +146,34 @@ $mailto_replace = array(', ', ', ', '', ',');
 
 // replace new lines and strip ending ', '
 $mailto = preg_replace($mailto_regexp, $mailto_replace, get_input_value('_to', RCUBE_INPUT_POST, TRUE, $message_charset));
+$mailcc = preg_replace($mailto_regexp, $mailto_replace, get_input_value('_cc', RCUBE_INPUT_POST, TRUE, $message_charset));
+$mailbcc = preg_replace($mailto_regexp, $mailto_replace, get_input_value('_bcc', RCUBE_INPUT_POST, TRUE, $message_charset));
 
-// decode address strings
-$to_address_arr = $IMAP->decode_address_list($mailto);
-$identity_arr = rcmail_get_identity(get_input_value('_from', RCUBE_INPUT_POST));
+if (empty($mailto) && !empty($mailcc)) {
+  $mailto = $mailcc;
+  $mailcc = null;
+}
+else if (empty($mailto))
+  $mailto = 'undisclosed-recipients:;';
 
+// get sender name and address
+$identity_arr = rcmail_get_identity(get_input_value('_from', RCUBE_INPUT_POST));
 $from = $identity_arr['mailto'];
-$first_to = is_array($to_address_arr[0]) ? $to_address_arr[0]['mailto'] : $mailto;
 
 if (empty($identity_arr['string']))
   $identity_arr['string'] = $from;
 
 // compose headers array
-$headers = array('Date' => date('D, j M Y H:i:s O'),
+$headers = array('Date' => date('r'),
                  'From' => rcube_charset_convert($identity_arr['string'], RCMAIL_CHARSET, $message_charset),
                  'To'   => $mailto);
 
 // additional recipients
-if (!empty($_POST['_cc']))
-  $headers['Cc'] = preg_replace($mailto_regexp, $mailto_replace, get_input_value('_cc', RCUBE_INPUT_POST, TRUE, $message_charset));
+if (!empty($mailcc))
+  $headers['Cc'] = $mailcc;
 
-if (!empty($_POST['_bcc']))
-  $headers['Bcc'] = preg_replace($mailto_regexp, $mailto_replace, get_input_value('_bcc', RCUBE_INPUT_POST, TRUE, $message_charset));
+if (!empty($mailbcc))
+  $headers['Bcc'] = $mailbcc;
   
 if (!empty($identity_arr['bcc']))
   $headers['Bcc'] = ($headers['Bcc'] ? $headers['Bcc'].', ' : '') . $identity_arr['bcc'];
@@ -199,7 +197,7 @@ if (!empty($_SESSION['compose']['references']))
 
 if (!empty($_POST['_priority']))
   {
-  $priority = (int)$_POST['_priority'];
+  $priority = intval($_POST['_priority']);
   $a_priorities = array(1=>'highest', 2=>'high', 4=>'low', 5=>'lowest');
   if ($str_priority = $a_priorities[$priority])
     $headers['X-Priority'] = sprintf("%d (%s)", $priority, ucfirst($str_priority));
@@ -214,6 +212,12 @@ if (!empty($_POST['_receipt']))
 // additional headers
 $headers['Message-ID'] = $message_id;
 $headers['X-Sender'] = $from;
+$headers['Received'] =  wordwrap('from ' .
+  (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ?
+    gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']).' ['.$_SERVER['HTTP_X_FORWARDED_FOR'].'] via ' : '') .
+  gethostbyaddr($_SERVER['REMOTE_ADDR']).' ['.$_SERVER['REMOTE_ADDR'].'] with ' .
+  $_SERVER['SERVER_PROTOCOL'].' ('.$_SERVER['REQUEST_METHOD'].'); ' . date('r'),
+  69, rcmail_header_delm() . "\t");
 
 if (!empty($CONFIG['useragent']))
   $headers['User-Agent'] = $CONFIG['useragent'];
@@ -225,23 +229,11 @@ $message_body = get_input_value('_message', RCUBE_INPUT_POST, TRUE, $message_cha
 if (!$savedraft && !empty($CONFIG['generic_message_footer']) && ($footer = file_get_contents(realpath($CONFIG['generic_message_footer']))))
   $message_body .= "\r\n" . rcube_charset_convert($footer, 'UTF-8', $message_charset);
 
-// try to autodetect operating system and use the correct line endings
-// use the configured delimiter for headers
-if (!empty($CONFIG['mail_header_delimiter']))
-  $header_delm = $CONFIG['mail_header_delimiter'];
-else if (strtolower(substr(PHP_OS, 0, 3)=='win')) 
-  $header_delm = "\r\n";
-else if (strtolower(substr(PHP_OS, 0, 3)=='mac'))
-  $header_delm = "\r\n";
-else    
-  $header_delm = "\n";
-
-
 $isHtmlVal = strtolower(get_input_value('_is_html', RCUBE_INPUT_POST));
 $isHtml = ($isHtmlVal == "1");
 
 // create extended PEAR::Mail_mime instance
-$MAIL_MIME = new rc_mail_mime($header_delm);
+$MAIL_MIME = new rc_mail_mime(rcmail_header_delm());
 
 // For HTML-formatted messages, construct the MIME message with both
 // the HTML part and the plain-text part
@@ -253,7 +245,7 @@ if ($isHtml)
   // add a plain text version of the e-mail as an alternative part.
   $h2t = new html2text($message_body);
   $plainTextPart = wordwrap($h2t->get_text(), 998, "\r\n", true);
-  $MAIL_MIME->setTXTBody($plainTextPart);
+  $MAIL_MIME->setTXTBody(html_entity_decode($plainTextPart, ENT_COMPAT, 'utf-8'));
 
   // look for "emoticon" images from TinyMCE and copy into message as attachments
   rcmail_attach_emoticons($MAIL_MIME);
@@ -268,8 +260,28 @@ else
 
 // add stored attachments, if any
 if (is_array($_SESSION['compose']['attachments']))
-  foreach ($_SESSION['compose']['attachments'] as $attachment)
-    $MAIL_MIME->addAttachment($attachment['path'], $attachment['mimetype'], $attachment['name'], true, 'base64', 'attachment', $message_charset);
+  foreach ($_SESSION['compose']['attachments'] as $id => $attachment)
+  {
+    $dispurl = '/\ssrc\s*=\s*[\'"]?\S+display-attachment\S+file=rcmfile' . $id . '[\'"]?/';
+    $match = preg_match($dispurl, $message_body);
+    if ($isHtml && ($match > 0))
+    {
+      $message_body = preg_replace($dispurl, ' src="'.$attachment['name'].'"', $message_body);
+      $MAIL_MIME->setHTMLBody($message_body);
+      $MAIL_MIME->addHTMLImage($attachment['path'], $attachment['mimetype'], $attachment['name']);
+    }
+    else
+    {
+      /*
+        We need to replace mime_content_type in a later release because the function
+        is deprecated in favour of File_Info
+      */
+      $MAIL_MIME->addAttachment($attachment['path'],
+        rc_mime_content_type($attachment['path'], $attachment['mimetype']),
+        $attachment['name'], true, 'base64',
+        'attachment', $message_charset);
+    }
+  }
 
 // add submitted attachments
 if (is_array($_FILES['_attachments']['tmp_name']))
@@ -282,80 +294,30 @@ $charset_7bit = array('ASCII', 'ISO-2022-JP', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8
 $transfer_encoding = in_array(strtoupper($message_charset), $charset_7bit) ? '7bit' : '8bit';
 
 // encoding settings for mail composing
-$message_param = array(
+$MAIL_MIME->setParam(array(
   'text_encoding' => $transfer_encoding,
   'html_encoding' => 'quoted-printable',
   'head_encoding' => 'quoted-printable',
   'head_charset'  => $message_charset,
   'html_charset'  => $message_charset,
   'text_charset'  => $message_charset,
-);
-
-// compose message body and get headers
-$msg_body = $MAIL_MIME->get($message_param);
-// unset to save memory.
-unset($MAIL_MIME->_parts);
+));
 
 // encoding subject header with mb_encode provides better results with asian characters
 if ($MBSTRING && function_exists("mb_encode_mimeheader"))
 {
   mb_internal_encoding($message_charset);
-  $mb_subject = mb_encode_mimeheader($headers['Subject'], $message_charset, 'Q');
+  $headers['Subject'] = mb_encode_mimeheader($headers['Subject'], $message_charset, 'Q');
   mb_internal_encoding(RCMAIL_CHARSET);
 }
 
-// Begin SMTP Delivery Block 
-if (!$savedraft) {
+// pass headers to message object
+$MAIL_MIME->headers($headers);
 
-  // send thru SMTP server using custom SMTP library
-  if ($CONFIG['smtp_server'])
-    {
-    // generate list of recipients
-    $a_recipients = array($mailto);
-  
-    if (strlen($headers['Cc']))
-      $a_recipients[] = $headers['Cc'];
-    if (strlen($headers['Bcc']))
-      $a_recipients[] = $headers['Bcc'];
-  
-    // clean Bcc from header for recipients
-    $send_headers = $headers;
-    unset($send_headers['Bcc']);
-  
-    if (!empty($mb_subject))
-      $send_headers['Subject'] = $mb_subject;
-  
-    // send message
-    $smtp_response = array();
-    $sent = smtp_mail($from, $a_recipients, ($foo = $MAIL_MIME->txtHeaders($send_headers)), $msg_body, $smtp_response);
-  
-    // log error
-    if (!$sent)
-      raise_error(array('code' => 800, 'type' => 'smtp', 'line' => __LINE__, 'file' => __FILE__,
-                        'message' => "SMTP error: ".join("\n", $smtp_response)), TRUE, FALSE);
-    }
-  
-  // send mail using PHP's mail() function
-  else
-    {
-    // unset some headers because they will be added by the mail() function
-    $headers_enc = $MAIL_MIME->headers($headers);
-    $headers_php = $MAIL_MIME->_headers;
-    unset($headers_php['To'], $headers_php['Subject']);
-    
-    if (!empty($mb_subject))
-      $headers_enc['Subject'] = $mb_subject;
-    
-    // reset stored headers and overwrite
-    $MAIL_MIME->_headers = array();
-    $header_str = $MAIL_MIME->txtHeaders($headers_php);
-  
-    if (ini_get('safe_mode'))
-      $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str);
-    else
-      $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str, "-f$from");
-    }
-  
+// Begin SMTP Delivery Block 
+if (!$savedraft)
+{
+  $sent = rcmail_deliver_message($MAIL_MIME, $from, $mailto);
   
   // return to compose page if sending failed
   if (!$sent)
@@ -365,7 +327,6 @@ if (!$savedraft) {
     return;
     }
   
-  
   // set repliead flag
   if ($_SESSION['compose']['reply_uid'])
     $IMAP->set_flag($_SESSION['compose']['reply_uid'], 'ANSWERED');
@@ -382,21 +343,15 @@ else
 
 if ($CONFIG[$store_target])
   {
-  // create string of complete message headers
-  $header_str = $MAIL_MIME->txtHeaders($headers);
-
   // check if mailbox exists
   if (!in_array_nocase($CONFIG[$store_target], $IMAP->list_mailboxes()))
     $store_folder = $IMAP->create_mailbox($CONFIG[$store_target], TRUE);
   else
     $store_folder = TRUE;
   
-  // add headers to message body
-  $msg_body = $header_str."\r\n".$msg_body;
-
   // append message to sent box
   if ($store_folder)
-    $saved = $IMAP->save_message($CONFIG[$store_target], $msg_body);
+    $saved = $IMAP->save_message($CONFIG[$store_target], $MAIL_MIME->getMessage());
 
   // raise error if saving failed
   if (!$saved)
@@ -459,5 +414,4 @@ else
   $OUTPUT->send('iframe');
   }
 
-
 ?>
diff --git a/program/steps/mail/sendmdn.inc b/program/steps/mail/sendmdn.inc
new file mode 100644 (file)
index 0000000..530dcac
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/mail/sendmdn.inc                                        |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2008, RoundCube Dev. - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Send a message disposition notification for a specific mail         |
+ |                                                                       |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id: sendmail.inc 930 2007-11-25 17:34:19Z thomasb $
+
+*/
+
+require_once('lib/rc_mail_mime.inc');
+
+
+if (!empty($_POST['_uid'])) {
+  $sent = rcmail_send_mdn(get_input_value('_uid', RCUBE_INPUT_POST));
+}
+
+// show either confirm or error message
+if ($sent) {
+  $OUTPUT->set_env('mdn_request', false);
+  $OUTPUT->show_message('receiptsent', 'confirmation');
+}
+else {
+  $OUTPUT->show_message('errorsendingreceipt', 'error');
+}
+
+$OUTPUT->send();
+
+?>
\ No newline at end of file
index 3033ea37f8dfea1d846c9411a879e53f4a37f5ae..ec79c2cfdddb4079e39c0fe93447360d90610bff 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/mail/show.inc                                           |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: show.inc 668 2007-08-10 08:27:40Z thomasb $
+ $Id: show.inc 1046 2008-02-11 23:07:44Z thomasb $
 
 */
 
 require_once('Mail/mimeDecode.php');
+require_once('lib/rc_mail_mime.inc');
 
 $PRINT_MODE = $_action=='print' ? TRUE : FALSE;
 
@@ -41,12 +42,18 @@ if ($_GET['_uid'])
       return;
       }
     }
+    
+  // check if safe flag is set
+  if ($MESSAGE['is_safe'] = intval($_GET['_safe']))
+    $_SESSION['safe_messages'][$MESSAGE['UID']] = true;
+  else if ($_SESSION['safe_messages'][$MESSAGE['UID']])
+    $MESSAGE['is_safe'] = 1;
 
   // calculate Etag for this request
-  $etag = md5($MESSAGE['UID'].$IMAP->get_mailbox_name().session_id().($PRINT_MODE?1:0));
+  $etag = md5($MESSAGE['UID'].$IMAP->get_mailbox_name().session_id().intval($MESSAGE['headers']->mdn_sent).intval($MESSAGE['is_safe']).intval($PRINT_MODE));
 
   // allow caching, unless remote images are present
-  if ((bool)get_input_value('_safe', RCUBE_INPUT_GET))
+  if ((bool)$MESSAGE['is_safe'])
     send_nocacheing_headers();
   else if (empty($CONFIG['devel_mode']))
     send_modified_header($_SESSION['login_time'], $etag);
@@ -57,7 +64,7 @@ if ($_GET['_uid'])
   if ($MESSAGE['structure'] = $IMAP->get_structure($MESSAGE['UID']))
     list($MESSAGE['parts'], $MESSAGE['attachments']) = rcmail_parse_message(
       $MESSAGE['structure'],
-      array('safe' => (bool)$_GET['_safe'],
+      array('safe' => $MESSAGE['is_safe'],
             'prefer_html' => $CONFIG['prefer_html'],
             'get_url' => $GET_URL.'&_part=%s')
       );
@@ -71,12 +78,28 @@ if ($_GET['_uid'])
 
   // give message uid to the client
   $OUTPUT->set_env('uid', $MESSAGE['UID']);
-  $OUTPUT->set_env('safemode', (bool)$_GET['_safe']);
+  $OUTPUT->set_env('safemode', $MESSAGE['is_safe']);
+  
+  // check for unset disposition notification
+  if ($MESSAGE['headers']->mdn_to && !$MESSAGE['headers']->mdn_sent && $IMAP->get_mailbox_name() != $CONFIG['drafts_mbox'])
+  {
+    if (intval($CONFIG['mdn_requests']) === 1)
+    {
+      if (rcmail_send_mdn($MESSAGE['UID']))
+        $OUTPUT->show_message('receiptsent', 'confirmation');
+    }
+    else if (empty($CONFIG['mdn_requests']))
+    {
+      rcube_add_label('mdnrequest');
+      $OUTPUT->set_env('mdn_request', true);
+    }
+  }
+
 
-  $next = $prev = -1;
+  $next = $prev = $first = $last = -1;
   // get previous, first, next and last message UID
-  if (!($_SESSION['sort_col'] == 'date' && $_SESSION['sort_order'] == 'DESC') && 
-      $IMAP->get_capability('sort')) 
+  if ((!($_SESSION['sort_col'] == 'date' && $_SESSION['sort_order'] == 'DESC') &&
+      $IMAP->get_capability('sort')) || !empty($_REQUEST['_search']))
     {
     // Only if we use custom sorting
     $a_msg_index = $IMAP->message_index(NULL, $_SESSION['sort_col'], $_SESSION['sort_order']);
@@ -177,4 +200,4 @@ else if ($_action=='preview' && template_exists('messagepreview'))
     parse_template('messagepreview');
 else
   parse_template('message');
-?>
\ No newline at end of file
+?>
index 693e01c680cdd5fa712e8b1784597d5c78baa139..9495d9935944f7da265cf343b5e6ee1fa05daf88 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: upload.inc 850 2007-10-03 00:13:32Z ihug $
+ $Id: upload.inc 1085 2008-02-14 23:49:30Z till $
 
 */
 
@@ -36,50 +36,52 @@ if (!is_array($_SESSION['compose']['attachments']))
 
 $response = '';
 
-foreach ($_FILES['_attachments']['tmp_name'] as $i => $filepath)
+if (is_array($_FILES['_attachments']['tmp_name']))
   {
-  $tmpfname = tempnam($temp_dir, 'rcmAttmnt');
-  if (move_uploaded_file($filepath, $tmpfname))
+  foreach ($_FILES['_attachments']['tmp_name'] as $i => $filepath)
     {
-    $id = count($_SESSION['compose']['attachments']);
-    $_SESSION['compose']['attachments'][] = array('name' => $_FILES['_attachments']['name'][$i],
+    $tmpfname = tempnam($temp_dir, 'rcmAttmnt');
+    if (move_uploaded_file($filepath, $tmpfname))
+      {
+      $id = count($_SESSION['compose']['attachments']);
+      $_SESSION['compose']['attachments'][] = array('name' => $_FILES['_attachments']['name'][$i],
                                                   'mimetype' => $_FILES['_attachments']['type'][$i],
                                                   'path' => $tmpfname);
 
-    if (is_file($CONFIG['skin_path'] . '/images/icons/remove-attachment.png'))
-      $button = sprintf(
-        '<img src="%s/images/icons/remove-attachment.png" alt="%s" border="0" style="padding-right:2px;vertical-align:middle" />',
-        $CONFIG['skin_path'],
-        Q(rcube_label('delete')));
-    else
-      $button = Q(rcube_label('delete'));
-
-    $content = sprintf(
-      '<a href="#delete" onclick="return %s.command(\'remove-attachment\', \'rcmfile%d\', this)" title="%s">%s</a>%s',
-      JS_OBJECT_NAME,
-      $id,
-      Q(rcube_label('delete')),
-      $button,
-      Q($_FILES['_attachments']['name'][$i]));
-
-    $OUTPUT->command('add2attachment_list', "rcmfile$id", $content);
-    }
-  else // upload failed
-    {
-    $err = $_FILES['_attachments']['error'][$i];
-    if ($err == UPLOAD_ERR_INI_SIZE || $err == UPLOAD_ERR_FORM_SIZE)
-      $msg = rcube_label(array('name' => 'filesizeerror', 'vars' => array('size' => show_bytes(parse_bytes(ini_get('upload_max_filesize'))))));
-    else
-      $msg = rcube_label('fileuploaderror');
+      if (is_file($CONFIG['skin_path'] . '/images/icons/remove-attachment.png'))
+        $button = sprintf(
+          '<img src="%s/images/icons/remove-attachment.png" alt="%s" border="0" style="padding-right:2px;vertical-align:middle" />',
+          $CONFIG['skin_path'],
+          Q(rcube_label('delete')));
+      else
+        $button = Q(rcube_label('delete'));
+
+      $content = sprintf(
+        '<a href="#delete" onclick="return %s.command(\'remove-attachment\', \'rcmfile%d\', this)" title="%s">%s</a>%s',
+        JS_OBJECT_NAME,
+        $id,
+        Q(rcube_label('delete')),
+        $button,
+        Q($_FILES['_attachments']['name'][$i]));
+
+      $OUTPUT->command('add2attachment_list', "rcmfile$id", $content);
+      }
+    else // upload failed
+      {
+      $err = $_FILES['_attachments']['error'][$i];
+      if ($err == UPLOAD_ERR_INI_SIZE || $err == UPLOAD_ERR_FORM_SIZE)
+        $msg = rcube_label(array('name' => 'filesizeerror', 'vars' => array('size' => show_bytes(parse_bytes(ini_get('upload_max_filesize'))))));
+      else
+        $msg = rcube_label('fileuploaderror');
     
-    $OUTPUT->command('display_message', $msg, 'error');
+      $OUTPUT->command('display_message', $msg, 'error');
+      }
     }
   }
 
-
 // send html page with JS calls as response
 $OUTPUT->command('show_attachment_form', false);
 $OUTPUT->command('auto_save_start', false);
 $OUTPUT->send('iframe');
 
-?>
+?>
\ No newline at end of file
index 4555a6f110029d44e21ab287dc1d1981893245a4..8b0b0be3357e720d22dfeb26e6b383103ec9ba79 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: delete_identity.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: delete_identity.inc 1035 2008-02-10 17:08:40Z till $
 
 */
 
 if (($ids = get_input_value('_iid', RCUBE_INPUT_GET)) && preg_match('/^[0-9]+(,[0-9]+)*$/', $ids))
 {
-  $DB->query(
-    "UPDATE ".get_table_name('identities')."
-     SET    del=1
-     WHERE  user_id=?
-     AND    identity_id IN (".$ids.")",
-    $_SESSION['user_id']);
-
-  $count = $DB->affected_rows();
-  if ($count)
-    $OUTPUT->show_message('deletedsuccessfully', 'confirmation');
 
+  if ($USER->delete_identity($ids))
+  {
+    $OUTPUT->show_message('deletedsuccessfully', 'confirmation');
+  }
+  else 
+  {
+    $OUTPUT->show_message('nodeletelastidentity', 'error');
+  }
   // send response
   if ($OUTPUT->ajax_call)
     $OUTPUT->send();
index 31e0ccc6aaeaa619b5f47a7d28b10878ae6896ba..30eca4a98e52a7364d5043ffd838e4954a7503dd 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: edit_identity.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: edit_identity.inc 940 2007-12-11 04:20:01Z estadtherr $
 
 */
 
 if (($_GET['_iid'] || $_POST['_iid']) && $_action=='edit-identity')
   {
-  $DB->query("SELECT * FROM ".get_table_name('identities')."
-              WHERE  identity_id=?
-              AND    user_id=?
-              AND    del<>1",
-              get_input_value('_iid', RCUBE_INPUT_GPC),
-              $_SESSION['user_id']);
-  
-  $IDENTITY_RECORD = $DB->fetch_assoc();
+  $IDENTITY_RECORD = $USER->get_identity(get_input_value('_iid', RCUBE_INPUT_GPC));
   
   if (is_array($IDENTITY_RECORD))
     $OUTPUT->set_env('iid', $IDENTITY_RECORD['identity_id']);
@@ -50,7 +43,6 @@ function rcube_identity_form($attrib)
   $OUTPUT->add_script("tinyMCE.init({ mode : 'specific_textareas'," .
                                     "apply_source_formatting : true," .
                                     "content_css : '\$__skin_path' + '/editor_content.css'," .
-                                    "popups_css : '\$__skin_path' + '/editor_popups.css'," .
                                     "editor_css : '\$__skin_path' + '/editor_ui.css'," .
                                     "theme : 'advanced'," .
                                     "theme_advanced_toolbar_location : 'top'," .
index 7bac1f7d27ac2f6bc733e1fc1b578cda2a0b3c73..f8190c01f562d27572a300f4c2934e50c1cf8dfe 100644 (file)
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: func.inc 892 2007-10-20 21:47:11Z thomasb $
+ $Id: func.inc 1176 2008-03-03 21:47:59Z thomasb $
 
 */
 
 
-// get user record
-$sql_result = $DB->query("SELECT username, mail_host FROM ".get_table_name('users')."
-                          WHERE  user_id=?",
-                          $_SESSION['user_id']);
-                                 
-if ($USER_DATA = $DB->fetch_assoc($sql_result))
-{
-  $username = $USER_DATA['username'] . (!strpos($USER_DATA['username'], '@') ? '@'.$USER_DATA['mail_host'] : '');
-  $OUTPUT->set_pagetitle(sprintf('%s %s', rcube_label('settingsfor'), $username));
-}
+if ($USER->ID)
+  $OUTPUT->set_pagetitle(rcube_label('settingsfor') . " ". $USER->get_username());
 
 
 
@@ -37,7 +29,7 @@ function rcmail_user_prefs_form($attrib)
   {
   global $DB, $CONFIG, $sess_user_lang;
 
-  $no_override = !empty($CONFIG['dont_override']) ? array_flip((array)$CONFIG['dont_override']) : array('preview_pane'=>true);
+  $no_override = is_array($CONFIG['dont_override']) ? array_flip($CONFIG['dont_override']) : array();
 
   // add some labels to client
   rcube_add_label('nopagesizewarning');
@@ -110,7 +102,7 @@ function rcmail_user_prefs_form($attrib)
     $out .= sprintf("<tr><td class=\"title\"><label for=\"%s\">%s</label></td><td>%s</td></tr>\n",
                     $field_id,
                     Q(rcube_label('timezone')),
-                    $select_timezone->show($CONFIG['timezone']));
+                    $select_timezone->show((string)$CONFIG['timezone']));
     }
 
   // daylight savings
@@ -161,7 +153,7 @@ function rcmail_user_prefs_form($attrib)
     }
 
   // Show checkbox for HTML Editor
-  if (!isset($no_override['htmleditor']) && $CONFIG['enable_htmleditor'])
+  if (!isset($no_override['htmleditor']))
     {
     $field_id = 'rcmfd_htmleditor';
     $input_htmleditor = new checkbox(array('name' => '_htmleditor', 'id' => $field_id, 'value' => 1));
@@ -205,16 +197,7 @@ function rcmail_user_prefs_form($attrib)
 
 function rcmail_identities_list($attrib)
   {
-  global $DB, $CONFIG, $OUTPUT;
-
-
-  // get contacts from DB
-  $sql_result = $DB->query("SELECT * FROM ".get_table_name('identities')."
-                            WHERE  del<>1
-                            AND    user_id=?
-                            ORDER BY standard DESC, name ASC",
-                            $_SESSION['user_id']);
-
+  global $OUTPUT, $USER;
 
   // add id to message list table if not specified
   if (!strlen($attrib['id']))
@@ -224,7 +207,7 @@ function rcmail_identities_list($attrib)
   $a_show_cols = array('name', 'email', 'organization', 'reply-to');
 
   // create XHTML table  
-  $out = rcube_table_output($attrib, $sql_result, $a_show_cols, 'identity_id');
+  $out = rcube_table_output($attrib, $USER->list_identities(), $a_show_cols, 'identity_id');
   
   // set client env
   $OUTPUT->add_gui_object('identitieslist', $attrib['id']);
@@ -271,7 +254,8 @@ function get_form_tags($attrib, $action, $add_hidden=array())
 // register UI objects
 $OUTPUT->add_handlers(array(
   'userprefs' => 'rcmail_user_prefs_form',
-  'itentitieslist' => 'rcmail_identities_list'
+  'identitieslist' => 'rcmail_identities_list',
+  'itentitieslist' => 'rcmail_identities_list'  // keep this for backward compatibility
 ));
 
 
index 061fdf56d334e4e5bbc9795ee47c27f849e6f764..ee368ad36c1b53cc4245928917b7a9f151dbdb81 100644 (file)
@@ -5,7 +5,7 @@
  | program/steps/settings/manage_folders.inc                             |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: manage_folders.inc 887 2007-10-19 12:24:04Z robin $
+ $Id: manage_folders.inc 1159 2008-02-29 11:49:09Z thomasb $
 
 */
 
@@ -85,9 +85,9 @@ else if ($_action=='rename-folder')
     $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF-7');
     $OUTPUT->command('replace_folder_row', $oldname, $rename, $display_rename);
     foreach ($a_mboxes as $mbox)
-      if (preg_match('/^'.preg_quote($oldname.$delimiter).'/', $mbox))
+      if (preg_match('/^'.preg_quote($oldname . $delimiter, '/').'/', $mbox))
         {
-        $c_rename = preg_replace('/^'.preg_quote($oldname).'/', $rename, $mbox);
+        $c_rename = preg_replace('/^'.preg_quote($oldname, '/').'/', $rename, $mbox);
         $foldersplit = explode($delimiter, $c_rename);
         $level = count($foldersplit) - 1;
         $display_rename = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF-7');
@@ -119,8 +119,14 @@ else if ($_action=='delete-folder')
     {
     $OUTPUT->command('remove_folder_row', get_input_value('_mboxes', RCUBE_INPUT_POST));
     foreach ($a_mboxes as $mbox)
-      if (preg_match('/^'.preg_quote(get_input_value('_mboxes', RCUBE_INPUT_POST).$delimiter).'/', $mbox))
+      {
+      $regex = get_input_value('_mboxes', RCUBE_INPUT_POST) . $delimiter;
+      $regex = preg_quote($regex, '/');
+      if (preg_match('/^'. $regex .'/', $mbox))
+        {
         $OUTPUT->command('remove_folder_row', $mbox);
+        }
+      }
     $OUTPUT->show_message('folderdeleted', 'confirmation');
     $OUTPUT->send();
     }
@@ -153,9 +159,9 @@ function rcube_subscription_form($attrib)
 
   // add table header
   $out .= "<thead><tr>\n";
-  $out .= sprintf('<td class="name">%s</td><td class="subscribed">%s</td>'.
+  $out .= sprintf('<td class="name">%s</td><td class="msgcount">%s</td><td class="subscribed">%s</td>'.
                   '<td class="rename">&nbsp;</td><td class="delete">&nbsp;</td>',
-                  rcube_label('foldername'), rcube_label('subscribed'));
+                  rcube_label('foldername'), rcube_label('messagecount'), rcube_label('subscribed'));
                   
   $out .= "\n</tr></thead>\n<tbody>\n";
 
@@ -190,25 +196,26 @@ function rcube_subscription_form($attrib)
     $foldersplit = explode($delimiter, $folder);
     $level = count($foldersplit) - 1;
     $display_folder = str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;', $level) . rcube_charset_convert($foldersplit[$level], 'UTF-7');
-    $folder_html = $CONFIG['protect_default_folders'] && in_array($folder, $CONFIG['default_imap_folders']) ? rcube_label(strtolower($folder)) : $display_folder;
+    $folder_html = $CONFIG['protect_default_folders'] && in_array($folder, $CONFIG['default_imap_folders']) ? rcmail_localize_foldername($folder) : $display_folder;
     
     if (!$protected)
       $a_js_folders['rcmrow'.($i+1)] = array($folder, rcube_charset_convert($folder, 'UTF-7'));
 
-    $out .= sprintf('<tr id="rcmrow%d" class="%s"><td>%s</td>',
+    $out .= sprintf('<tr id="rcmrow%d" class="%s"><td class="name">%s</td><td class="msgcount">%d</td>',
                     $i+1,
                     $zebra_class,
-                    Q($folder_html));
+                    Q($folder_html),
+                    $IMAP->messagecount($folder));
                     
     if ($protected)
-      $out .= '<td>&nbsp;'.($subscribed ? '&#x2022;' : '-').'</td>';
+      $out .= '<td class="subscribed">&nbsp;'.($subscribed ? '&#x2022;' : '-').'</td>';
     else
-      $out .= '<td>'.$checkbox_subscribe->show($subscribed?$folder:'', array('value' => $folder)).'</td>';
+      $out .= '<td class="subscribed">'.$checkbox_subscribe->show($subscribed?$folder:'', array('value' => $folder)).'</td>';
 
     // add rename and delete buttons
     if (!$protected)
-      $out .= sprintf('<td><a href="#rename" title="%s">%s</a>'.
-                      '<td><a href="#delete" title="%s">%s</a></td>',
+      $out .= sprintf('<td class="rename"><a href="#rename" title="%s">%s</a>'.
+                      '<td class="delete"><a href="#delete" title="%s">%s</a></td>',
                       rcube_label('renamefolder'),
                       $edit_button,
                       rcube_label('deletefolder'),
@@ -233,9 +240,13 @@ function rcube_subscription_form($attrib)
 
 function rcube_create_folder_form($attrib)
   {
+  global $OUTPUT;
+  
   list($form_start, $form_end) = get_form_tags($attrib, 'create-folder');
   unset($attrib['form']);
 
+  if ($attrib['hintbox'])
+    $OUTPUT->add_gui_object('createfolderhint', $attrib['hintbox']);
 
   // return the complete edit form as table
   $out = "$form_start\n";
@@ -292,7 +303,7 @@ function rcube_rename_folder_form($attrib)
     }
 
   $out .= "\n$form_end";
-
+  
   return $out;
   }
 
@@ -305,7 +316,7 @@ $OUTPUT->add_handlers(array(
 ));
 
 // add some labels to client
-rcube_add_label('deletefolderconfirm');
+rcube_add_label('deletefolderconfirm','addsubfolderhint');
 
 $OUTPUT->send('managefolders');
 ?>
index eeadd58093df54db0ce7aa303d1c58b285b31dba..787c5d2aea8205e633343184b9643676e2aa4196 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: save_identity.inc 543 2007-04-28 18:07:12Z thomasb $
+ $Id: save_identity.inc 938 2007-12-10 15:27:19Z thomasb $
 
 */
 
@@ -33,123 +33,78 @@ if (empty($_POST['_name']) || empty($_POST['_email']))
   }
 
 
-// update an existing contact
-if ($_POST['_iid'])
-  {
-  $a_write_sql = array();
+$save_data = array();
+foreach ($a_save_cols as $col)
+{
+  $fname = '_'.$col;
+  if (isset($_POST[$fname]))
+    $save_data[$col] = get_input_value($fname, RCUBE_INPUT_POST, in_array($col, $a_html_cols));
+}
 
-  foreach ($a_save_cols as $col)
-    {
-    $fname = '_'.$col;
-    if (isset($_POST[$fname]))
-      $a_write_sql[] = sprintf("%s=%s",
-        $DB->quoteIdentifier($col),
-        $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]))
+    $save_data[$col] = 0;
+}
 
-  // 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')."
-       SET ".join(', ', $a_write_sql)."
-       WHERE  identity_id=?
-       AND    user_id=?
-       AND    del<>1",
-      get_input_value('_iid', RCUBE_INPUT_POST),
-      $_SESSION['user_id']);
-                       
-    $updated = $DB->affected_rows();
-    }
-       
-  if ($updated)
-    {
+// update an existing contact
+if ($_POST['_iid'])
+{
+  if ($updated = $USER->update_identity(get_input_value('_iid', RCUBE_INPUT_POST), $save_data))
+  {
     $OUTPUT->show_message('successfullysaved', 'confirmation');
     
     if (!empty($_POST['_standard']))
       $default_id = get_input_value('_iid', RCUBE_INPUT_POST);
     
     if ($_POST['_framed'])
-      {
+    {
       // update the changed col in list
       // ...      
-      }
     }
+  }
   else if ($DB->is_error())
-    {
+  {
     // show error message
     $OUTPUT->show_message('errorsaving', 'error');
     rcmail_overwrite_action('edit-identitiy');
     return;
-    }
   }
+}
 
 // insert a new contact
 else
+{
+  if ($insert_id = $USER->insert_identity($save_data))
   {
-  $a_insert_cols = $a_insert_values = array();
-
-  foreach ($a_save_cols as $col)
-    {
-    $fname = '_'.$col;
-    if (!isset($_POST[$fname]))
-      continue;
-    
-    $a_insert_cols[] = $DB->quoteIdentifier($col);
-    $a_insert_values[] = $DB->quote(get_input_value($fname, RCUBE_INPUT_POST, in_array($col, $a_html_cols)));
-    }
-    
-  if (sizeof($a_insert_cols))
-    {
-    $DB->query("INSERT INTO ".get_table_name('identities')."
-                (user_id, ".join(', ', $a_insert_cols).")
-                VALUES (?, ".join(', ', $a_insert_values).")",
-                $_SESSION['user_id']);
-
-    $insert_id = $DB->insert_id(get_sequence_name('identities'));
-    }
-    
-  if ($insert_id)
-    {
     $_GET['_iid'] = $insert_id;
 
     if (!empty($_POST['_standard']))
       $default_id = $insert_id;
 
     if ($_POST['_framed'])
-      {
+    {
       // add contact row or jump to the page where it should appear
       // ....
-      }
     }
+  }
   else
-    {
+  {
     // show error message
     $OUTPUT->show_message('errorsaving', 'error');
     rcmail_overwrite_action('edit-identity');
     return;
-    }
   }
+}
 
 
 // mark all other identities as 'not-default'
 if ($default_id)
-  $DB->query(
-    "UPDATE ".get_table_name('identities')."
-     SET ".$DB->quoteIdentifier('standard')."='0'
-     WHERE  user_id=?
-     AND    identity_id<>?
-     AND    del<>1",
-    $_SESSION['user_id'],
-    $default_id);
+  $USER->set_default($default_id);
 
 // go to next step
 rcmail_overwrite_action($_framed ? 'edit-identity' : 'identities');
index 9b65af02dac3a736b63fb606ae2cde58cd9562ab..a2894d8f2ca105a98639683a8b2dd715e359db10 100644 (file)
@@ -15,7 +15,7 @@
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
 
- $Id: save_prefs.inc 768 2007-09-01 14:55:10Z till $
+ $Id: save_prefs.inc 938 2007-12-10 15:27:19Z thomasb $
 
 */
 
@@ -44,15 +44,12 @@ if (isset($_POST['_language']))
 
 // force min size
 if ($a_user_prefs['pagesize'] < 1)
-  {
   $a_user_prefs['pagesize'] = 10;
-  }
+
 if (isset($CONFIG['max_pagesize']) && ($a_user_prefs['pagesize'] > $CONFIG['max_pagesize']))
-  {
   $a_user_prefs['pagesize'] = (int) $CONFIG['max_pagesize'];
-  }
 
-if (rcmail_save_user_prefs($a_user_prefs))
+if ($USER->save_prefs($a_user_prefs))
   $OUTPUT->show_message('successfullysaved', 'confirmation');
 
 
index c7743e84a5d8d87a99292b378472ab4386d6bead..82e1d409d5804c30c083b908c94fb346e71f2b57 100644 (file)
@@ -10,6 +10,7 @@ body
 body.iframe
 {
   margin: 0px;
+  background-color: #FFF;
 }
 
 body.extwin
@@ -106,6 +107,11 @@ img
   font-size: 11px;
 }
 
+.hint
+{
+  color: #666;
+  font-size: 11px;
+}
 
 /** common user interface objects */
 
index 182e791211da181b620847c9438f27e16bc60050..e8b1c88fe4e39fb34802f8ab4428e3fc6d5dc0e6 100644 (file)
@@ -3,11 +3,14 @@
 \r
 body, td, pre {\r
        font-family: Verdana, Arial, Helvetica, sans-serif;\r
-       font-size: 10px;\r
+       font-size: 12px;\r
 }\r
 \r
 body {\r
-       background-color: #FFFFFF;\r
+       background-color: #FFFFFF;
+       margin-left: 4px;
+       margin-right: 4px;
+       margin-top: 2px;
 }\r
 \r
 .mceVisualAid {\r
diff --git a/skins/default/editor_popup.css b/skins/default/editor_popup.css
deleted file mode 100644 (file)
index f8d3550..0000000
+++ /dev/null
@@ -1,331 +0,0 @@
-/* This file contains the CSS data for all popups in TinyMCE */\r
-\r
-body {\r
-       background-color: #F0F0EE;\r
-       font-family: Verdana, Arial, Helvetica, sans-serif;\r
-       font-size: 11px;\r
-       scrollbar-3dlight-color: #F0F0EE;\r
-       scrollbar-arrow-color: #676662;\r
-       scrollbar-base-color: #F0F0EE;\r
-       scrollbar-darkshadow-color: #DDDDDD;\r
-       scrollbar-face-color: #E0E0DD;\r
-       scrollbar-highlight-color: #F0F0EE;\r
-       scrollbar-shadow-color: #F0F0EE;\r
-       scrollbar-track-color: #F5F5F5;\r
-       margin: 8px;\r
-}\r
-\r
-td {\r
-       font-family: Verdana, Arial, Helvetica, sans-serif;\r
-       font-size: 11px;\r
-}\r
-\r
-input {\r
-       background: #FFFFFF;\r
-       border: 1px solid #cccccc;\r
-}\r
-\r
-td, input, select, textarea {\r
-       font-family: Verdana, Arial, Helvetica, sans-serif;\r
-       font-size: 10px;\r
-}\r
-\r
-input, select, textarea {\r
-       border: 1px solid #808080;\r
-}\r
-\r
-.input_noborder {\r
-       border: 0;\r
-}\r
-\r
-#insert, .updateButton {\r
-   font-weight: bold;\r
-   width: 90px;\r
-   height: 21px;\r
-   border: 0;\r
-   background-image: url('../images/insert_button_bg.gif');\r
-   cursor: pointer;\r
-}\r
-\r
-#cancel {\r
-   font-weight: bold;\r
-   width: 90px;\r
-   height: 21px;\r
-   border: 0;\r
-   background-image: url('../images/cancel_button_bg.gif');\r
-   cursor: pointer;\r
-}\r
-\r
-/* Mozilla only style */\r
-html>body #insert, html>body #cancel {\r
-       padding-bottom: 2px;\r
-}\r
-\r
-.title {\r
-       font-size: 12px;\r
-       font-weight: bold;\r
-       color: #2B6FB6;\r
-}\r
-\r
-table.charmap {\r
-       border-style: solid;\r
-       border-width: 1px;\r
-       border-color: #AAAAAA;\r
-}\r
-\r
-td.charmap, td.charmapOver {\r
-       color: #000000;\r
-       border-color: #AAAAAA;\r
-       border-style: solid;\r
-       border-width: 1px;\r
-       text-align: center;\r
-       font-size: 12px;\r
-}\r
-\r
-td.charmapOver {\r
-       background-color: #CCCCCC;\r
-       cursor: default;\r
-}\r
-\r
-a.charmap {\r
-       color: #000000;\r
-       text-decoration: none\r
-}\r
-\r
-.wordWrapCode {\r
-       vertical-align: middle;\r
-       border: 1px none #000000;\r
-       background-color: transparent;\r
-}\r
-\r
-input.radio {\r
-       border: 1px none #000000;\r
-       background-color: transparent;\r
-       vertical-align: middle;\r
-}\r
-\r
-input.checkbox {\r
-       border: 1px none #000000;\r
-       background-color: transparent;\r
-       vertical-align: middle;\r
-}\r
-\r
-.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {\r
-       margin-left: 1px;\r
-}\r
-\r
-.mceButtonNormal {\r
-       border-top: 1px solid;\r
-       border-left: 1px solid;\r
-       border-bottom: 1px solid;\r
-       border-right: 1px solid;\r
-       border-color: #F0F0EE;\r
-       cursor: default;\r
-}\r
-\r
-.mceButtonOver {\r
-       border: 1px solid #0A246A;\r
-       cursor: default;\r
-       background-color: #B6BDD2;\r
-}\r
-\r
-.mceButtonDown {\r
-       cursor: default;\r
-       border: 1px solid #0A246A;\r
-       background-color: #8592B5;\r
-}\r
-\r
-.mceButtonDisabled {\r
-       filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);\r
-       -moz-opacity:0.3;\r
-       opacity: 0.3;\r
-       border-top: 1px solid;\r
-       border-left: 1px solid;\r
-       border-bottom: 1px solid;\r
-       border-right: 1px solid;\r
-       border-color: #F0F0EE;\r
-       cursor: default;\r
-}\r
-\r
-.mceActionPanel {\r
-       margin-top: 5px;\r
-}\r
-\r
-/* Tabs classes */\r
-\r
-.tabs {\r
-       float: left;\r
-       width: 100%;\r
-       line-height: normal;\r
-       background-image: url("../images/xp/tabs_bg.gif");\r
-}\r
-\r
-.tabs ul {\r
-       margin: 0;\r
-       padding: 0 0 0;\r
-       list-style: none;\r
-}\r
-\r
-.tabs li {\r
-       float: left;\r
-       background: url("../images/xp/tab_bg.gif") no-repeat left top;\r
-       margin: 0;\r
-       margin-left: 0;\r
-       margin-right: 2px;\r
-       padding: 0 0 0 10px;\r
-       line-height: 18px;\r
-}\r
-\r
-.tabs li.current {\r
-       background: url("../images/xp/tab_sel_bg.gif") no-repeat left top;\r
-       margin-right: 2px;\r
-}\r
-\r
-.tabs span {\r
-       float: left;\r
-       display: block;\r
-       background: url("../images/xp/tab_end.gif") no-repeat right top;\r
-       padding: 0px 10px 0 0;\r
-}\r
-\r
-.tabs .current span {\r
-       background: url("../images/xp/tab_sel_end.gif") no-repeat right top;\r
-}\r
-\r
-.tabs a {\r
-       text-decoration: none;\r
-       font-family: Verdana, Arial;\r
-       font-size: 10px;\r
-}\r
-\r
-.tabs a:link, .tabs a:visited, .tabs a:hover {\r
-       color: black;\r
-}\r
-\r
-.tabs a:hover {\r
-}\r
-\r
-.tabs .current {\r
-}\r
-\r
-.tabs .current a, .tabs .current a:link, .tabs .current a:visited {\r
-}\r
-\r
-.panel_wrapper div.panel {\r
-       display: none;\r
-}\r
-\r
-.panel_wrapper div.current {\r
-       display: block;\r
-       width: 100%;\r
-       height: 300px;\r
-       overflow: visible; /* Should be auto but that breaks Safari */\r
-}\r
-\r
-.panel_wrapper {\r
-       border: 1px solid #919B9C;\r
-       border-top: 0px;\r
-       padding: 10px;\r
-       padding-top: 5px;\r
-       clear: both;\r
-       background-color: white;\r
-}\r
-\r
-fieldset {\r
-       border: 1px solid #919B9C;\r
-       font-family: Verdana, Arial;\r
-       font-size: 10px;\r
-       padding: 0;\r
-       margin: 0;\r
-       padding: 4px;\r
-}\r
-\r
-legend {\r
-       color: #2B6FB6;\r
-       font-weight: bold;\r
-}\r
-\r
-.properties {\r
-       width: 100%;\r
-}\r
-\r
-.properties .column1 {\r
-}\r
-\r
-.properties .column2 {\r
-       text-align: left;\r
-}\r
-\r
-a:link, a:visited {\r
-       color: black;\r
-}\r
-\r
-a:hover {\r
-       color: #2B6FB6;\r
-}\r
-\r
-#plugintable thead {\r
-       font-weight: bold;\r
-       background-color: #DDDDDD;\r
-}\r
-\r
-#plugintable, #about #plugintable td {\r
-       border: 1px solid #919B9C;\r
-}\r
-\r
-#plugintable {\r
-       width: 99%;\r
-       margin-top: 10px;\r
-}\r
-\r
-#pluginscontainer {\r
-       height: 290px;\r
-       overflow: auto;\r
-}\r
-\r
-/* MSIE Specific styles */\r
-\r
-* html .panel_wrapper {\r
-       width: 100%;\r
-}\r
-\r
-.column {\r
-       float: left;\r
-}\r
-\r
-h1, h2, h3, h4 {\r
-       color: #2B6FB6;\r
-       margin: 0;\r
-       padding: 0;\r
-       padding-top: 5px;\r
-}\r
-\r
-h3 {\r
-       font-size: 14px;\r
-}\r
-\r
-#link .panel_wrapper, #link div.current {\r
-       height: 125px;\r
-}\r
-\r
-#image .panel_wrapper, #image div.current {\r
-       height: 190px;\r
-}\r
-\r
-label.msg { display: none; }\r
-label.invalid { color: #EE0000; display: inline; }\r
-input.invalid { border: 1px solid #EE0000; }\r
-\r
-/* Disables the advanced tab in the table plugin. */\r
-/*\r
-#table #advanced_tab {\r
-       display: none;\r
-}\r
-*/\r
-\r
-/* Disables the border input field and label in the table plugin. */\r
-/*\r
-#table #border, #table #borderlabel {\r
-       display: none;\r
-}\r
-*/\r
diff --git a/skins/default/images/buttons/markread_act.png b/skins/default/images/buttons/markread_act.png
new file mode 100644 (file)
index 0000000..32c0511
Binary files /dev/null and b/skins/default/images/buttons/markread_act.png differ
diff --git a/skins/default/images/icons/edit.png b/skins/default/images/icons/edit.png
deleted file mode 100644 (file)
index 9b40b5c..0000000
Binary files a/skins/default/images/icons/edit.png and /dev/null differ
diff --git a/skins/default/images/icons/rename.png b/skins/default/images/icons/rename.png
new file mode 100644 (file)
index 0000000..7844b00
Binary files /dev/null and b/skins/default/images/icons/rename.png differ
index fb130ce6c4af724c6e108bfe910d5c62da842e39..aa3f64313f7ebb33c66337bd1d17c634306120b1 100644 (file)
   padding-left: 2px;
 }
 
+#markmessagemenu
+{
+  position: absolute;
+  top: 32px;
+  left: 90px;
+  width: auto;
+  visibility: hidden;
+  background-color: #F9F9F9;
+  border: 1px solid #CCC;
+  padding: 1px;
+  opacity: 0.9;
+  z-index: 240;
+}
+
+ul.toolbarmenu
+{
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+
+ul.toolbarmenu li
+{
+  font-size: 11px;
+  white-space: nowrap;
+  min-width: 130px;
+  width: auto !important;
+  width: 130px;
+}
+
+ul.toolbarmenu li a
+{
+  display: block;
+  color: #a0a0a0;
+  padding: 2px 8px 3px 12px;
+  text-decoration: none;
+}
+
+ul.toolbarmenu li a.active:hover
+{
+  background-color: #ddd;
+}
+
 #listcontrols
 {
   position: absolute;
@@ -71,6 +114,9 @@ td.formlinks a:visited
 #mailboxcontrols a.active,
 #mailboxcontrols a.active:active,
 #mailboxcontrols a.active:visited,
+ul.toolbarmenu li a.active,
+ul.toolbarmenu li a.active:active,
+ul.toolbarmenu li a.active:visited,
 td.formlinks a,
 td.formlinks a:visited
 {
@@ -152,15 +198,12 @@ td.formlinks a:visited
 
 #messagepartframe
 {
-  position: absolute;
-  top: 0px;
-  left: 0px;
-  right: 0px;
-  bottom: 0px;
-  width: auto;
-  height: auto;
+  width: 100%;
+  height: 100%;
   border: 1px solid #999999;
   background-color: #F9F9F9;
+  /* css hack for IE */
+  height: expression(parseInt(document.getElementById('messagepartcontainer').offsetHeight)+'px');
 }
 
 
@@ -193,6 +236,7 @@ td.formlinks a:visited
 {
   display: block;
   height: 12px;
+  margin: 0;
   padding: 3px 10px 4px 10px;
   background-color: #EBEBEB;
   background-image: url(images/listheader_aqua.gif); 
@@ -230,12 +274,10 @@ td.formlinks a:visited
 
 #mailboxlist li
 {
- /* height: 18px; */
   font-size: 11px;
   background: url(images/icons/folder-closed.png) no-repeat;
   background-position: 10px 1px;
   border-bottom: 1px solid #EBEBEB;
-/* IE 5.5  margin-left: -16px; */
 }
 
 #mailboxlist li.inbox
@@ -272,11 +314,6 @@ td.formlinks a:visited
   text-decoration: none;
 }
 
-#mailboxlist li, #mailboxlist li.unread
-{  
- /* background-image: url(images/mailbox_list.gif); */
-}
-
 #mailboxlist li.unread
 {
   font-weight: bold;
@@ -288,7 +325,8 @@ td.formlinks a:visited
   background-color: #929292;
 }
 
-#mailboxlist li.selected a
+#mailboxlist li.selected > a,
+#mailboxlist li.droptarget li.selected a
 {
   color: #FFF;
   font-weight: bold;
@@ -305,28 +343,10 @@ td.formlinks a:visited
   padding: 0;
   margin:0;
   border-top: 1px solid #EBEBEB;  
-}
-
-#mailboxlist ul li {
   padding-left: 15px;
   background-position: 25px 1px;
-}
-
-#mailboxlist li.selected li,
-#mailboxlist li.droptarget li {
   background-color: #F9F9F9;
-}
-
-#mailboxlist li.unread li {
-  font-weight: normal;
-}
-
-#mailboxlist li.unread li.unread {
-  font-weight: bold;
-}
-
-#mailboxlist li.selected li a{
-  color: black;
+  color: blue;
   font-weight: normal;
 }
 
@@ -360,6 +380,10 @@ body.messagelist
   width: expression(parseInt(document.getElementById('mailcontframe').clientWidth)+'px');
 }
 
+/* safari hack \*/
+html>body*#messagelist[id$="messagelist"]:not([class="none"]) { table-layout: auto; }
+/**/
+
 #messagelist thead tr td
 {
   height: 20px;
@@ -632,16 +656,20 @@ table.headers-table tr td.subject
 {
   position:relative;
   min-height: 300px;
-  padding-top: 10px;
   padding-bottom: 10px;
   background-color: #FFFFFF;
 }
 
 div.message-part
 {
-  padding: 8px;
-  padding-top: 10px;
-  overflow: hidden;
+  padding: 10px 8px;
+  border-top: 1px solid #ccc;
+/*  overflow: hidden; */
+}
+
+#messagebody div:first-child
+{
+  border-top: 0;
 }
 
 div.message-part a
index 53e948c7e7515e0ac757ae517de926b09ffb9d5d..7ee50f527c92aac2231aa8176b41e18260427221 100644 (file)
@@ -69,11 +69,11 @@ span.tablink-selected a
 
 #folder-manager
 {
-  width: 500px;
-  bottom: 120px;
+  width: 540px;
+  bottom: 140px;
   overflow: auto;
   border: 1px solid #999999;
-  height: expression((parseInt(document.documentElement.clientHeight)-215)+'px');
+  height: expression((parseInt(document.documentElement.clientHeight)-235)+'px');
 }
 
 #folder-manager.droptarget
@@ -104,7 +104,7 @@ span.tablink-selected a
 #identity-details
 {
   margin-top: 30px;
-  width: 500px;
+  width: 600px;
   border: 1px solid #999999;
 }
 
@@ -119,8 +119,8 @@ span.tablink-selected a
 #bottomboxes
 {
   position: absolute;
-  width: 500px;
-  height: 100px;
+  width: 540px;
+  height: 120px;
   left: 20px;
   bottom: 20px;
 }
@@ -142,7 +142,7 @@ div.boxtitle,
 
 div.settingsbox
 {
-  width: 500px;
+  width: 540px;
   margin-top: 20px;
   margin-bottom: 20px;
   border: 1px solid #999999;
@@ -157,13 +157,13 @@ div.settingspart
 #subscription-table
 {
   width: 100%;
-  table-layout: fixed;
 }
 
 #subscription-table tbody td
 {
+  height: 16px;
   padding-left: 6px;
-  padding-right: 20px;
+  padding-right: 10px;
   white-space: nowrap;
   border-bottom: 1px solid #EBEBEB;
   background-color: #F9F9F9;
@@ -183,12 +183,30 @@ div.settingspart
   background-color: #FFFFA6;
 }
 
-#subscription-table td.name
+#subscription-table thead td.name
+{
+  width: 240px;
+}
+
+#subscription-table thead td.msgcount
+{
+  width: 70px;
+}
+
+#subscription-table thead td.subscribed
+{
+  width: 60px;
+}
+
+#subscription-table tbody td.msgcount,
+#subscription-table tbody td.subscribed
 {
-  width: 280px;
+  padding-left: 18px;
 }
 
-#subscription-table td.subscribed
+#subscription-table thead td.rename,
+#subscription-table thead td.delete
 {
-  width: 80px;
+  width: 20px;
+  text-align: center;
 }
index 97965a245aeff25822b336a56526c9299eeff660..0b02fb5e522455c150c600dd4a58ec6836e04011 100644 (file)
@@ -11,8 +11,8 @@ function rcube_splitter(attrib)
   this.id = attrib.id ? attrib.id : this.p1id + '_' + this.p2id + '_splitter';
   this.orientation = attrib.orientation;
   this.horizontal = (this.orientation == 'horizontal' || this.orientation == 'h');
-  this.offset_1 = bw.ie ? 0 : (bw.safari ? 2 : -1);
-  this.offset_2 = bw.ie ? -2 : (bw.safari ? -2 : 1);
+  this.offset_1 = bw.ie ? 0 : -1;
+  this.offset_2 = bw.ie ? -2 : 1;
   this.pos = 0;
 
   this.init = function()
index d38d806426e8c0951f51ee040df928f166f715d4..8162d1cdda64950165cae285909438bf1cf93795 100644 (file)
@@ -13,7 +13,7 @@
 
 
 <div id="identities-list">
-<roundcube:object name="itentitiesList" id="identities-table" class="records-table" cellspacing="0" summary="Identities list" editIcon="" />
+<roundcube:object name="identitiesList" id="identities-table" class="records-table" cellspacing="0" summary="Identities list" editIcon="" />
 
 <p><roundcube:button command="add" type="input" label="newidentity" class="button" /></p>
 
index 7e02ff54275518f8cf457a2045b462efa2716a8f..f45c63bcb0598960fc4b1805a5743a1c6c837954 100644 (file)
@@ -137,10 +137,8 @@ function rcmail_prev_sibling(elm)
 <roundcube:button type="input" command="list" class="button" label="cancel" />
 </td>
 <td align="right">
-  <roundcube:if condition="config:enable_htmleditor" />
-    <roundcube:label name="editortype" />:&nbsp;
-    <span class="radios-left"><roundcube:object name="editorSelector" tabindex="9" /></span>
-  <roundcube:endif />
+ <roundcube:label name="editortype" />:&nbsp;
+ <span class="radios-left"><roundcube:object name="editorSelector" tabindex="9" /></span>
 </td>
 </tr>
 </tbody></table>
index 4fb087d40b1d7c1762f74f615e9d033bc30b1ffd..04a3e8b39f3018366761df5d197bc7c393646152 100644 (file)
@@ -13,7 +13,7 @@
 
 
 <div id="identities-list">
-<roundcube:object name="itentitiesList" id="identities-table" class="records-table" cellspacing="0" summary="Identities list" editIcon="" />
+<roundcube:object name="identitiesList" id="identities-table" class="records-table" cellspacing="0" summary="Identities list" editIcon="" />
 
 <p><roundcube:button command="add" type="input" label="newidentity" class="button" /></p>
 
index 7e311cc7f54287aaa57915a36a41885377aa5513..f9f3436ef185a6f49c24957e9fe3c65ca8adb343 100644 (file)
@@ -12,7 +12,7 @@
 <roundcube:include file="/includes/settingstabs.html" />
 
 <div id="identities-list">
-<roundcube:object name="itentitiesList" id="identities-table" class="records-table" cellspacing="0" summary="Identities list" editIcon="" />
+<roundcube:object name="identitiesList" id="identities-table" class="records-table" cellspacing="0" summary="Identities list" editIcon="" />
 
 <p><roundcube:button command="add" type="input" label="newidentity" class="button" /></p>
 </div>
index 6f7999d7727888bf0a689941b5533ec347bb9f15..1950be2e83d0487e09c08e297c44848910ff2bb9 100644 (file)
@@ -28,7 +28,7 @@
 </head>
 <body>
 
-<img src="/images/roundcube_logo.png" width="165" height="55" border="0" alt="<roundcube:object name='productname' />" hspace="10" />
+<img src="/images/roundcube_logo.png" width="165" height="55" border="0" alt="<roundcube:object name='productname' />" hspace="12" vspace="2"/>
 
 <roundcube:object name="message" id="message" />
 
index a38c06aee4444ff9caff088f87744a6ab85b0065..2c3846b2b22ed116543b115c3a85280886b30677 100644 (file)
@@ -5,36 +5,50 @@
 <roundcube:include file="/includes/links.html" />
 <link rel="stylesheet" type="text/css" href="/mail.css" />
 <script type="text/javascript" src="/splitter.js"></script>
+<script type="text/javascript">
+
+function rcube_mail_ui()
+{
+  this.markmenu = new rcube_layer('markmessagemenu');
+}
+
+rcube_mail_ui.prototype = {
+
+show_markmenu: function(show)
+{
+  if (typeof show == 'undefined')
+    show = this.markmenu.visible ? false : true;
+  
+  var ref = rcube_find_object('markreadbutton');
+  if (show && ref)
+    this.markmenu.move(ref.offsetLeft, ref.offsetTop + ref.offsetHeight);
+  
+  this.markmenu.show(show);
+},
+
+body_mouseup: function(evt, p)
+{
+  if (this.markmenu && this.markmenu.visible)
+    this.show_markmenu(false);
+},
+
+body_keypress: function(evt, p)
+{
+  if (rcube_event.get_keycode(evt) == 27 && this.markmenu && this.markmenu.visible)
+    this.show_markmenu(false);
+}
+
+};
+
+</script>
 </head>
 <body>
 
 <roundcube:include file="/includes/taskbar.html" />
 <roundcube:include file="/includes/header.html" />
 
-<div id="messagetoolbar">
-<roundcube:button command="checkmail" imageSel="/images/buttons/inbox_sel.png" imageAct="/images/buttons/inbox_act.png" imagePas="/images/buttons/inbox_pas.png" width="32" height="32" title="checkmail" />
-<roundcube:button command="compose" imageSel="/images/buttons/compose_sel.png" imageAct="/images/buttons/compose_act.png" imagePas="/images/buttons/compose_pas.png" width="32" height="32" title="writenewmessage" />
-<roundcube:button command="reply" imageSel="/images/buttons/reply_sel.png" imageAct="/images/buttons/reply_act.png" imagePas="/images/buttons/reply_pas.png" width="32" height="32" title="replytomessage" />
-<roundcube:button command="reply-all" imageSel="/images/buttons/replyall_sel.png" imageAct="/images/buttons/replyall_act.png" imagePas="/images/buttons/replyall_pas.png" width="32" height="32" title="replytoallmessage" />
-<roundcube:button command="forward" imageSel="/images/buttons/forward_sel.png" imageAct="/images/buttons/forward_act.png" imagePas="/images/buttons/forward_pas.png" width="32" height="32" title="forwardmessage" />
-<roundcube:button command="delete" imageSel="/images/buttons/delete_sel.png" imageAct="/images/buttons/delete_act.png" imagePas="/images/buttons/delete_pas.png" width="32" height="32" title="deletemessage" />
-<roundcube:button command="print" imageSel="/images/buttons/print_sel.png" imageAct="/images/buttons/print_act.png" imagePas="/images/buttons/print_pas.png" width="32" height="32" title="printmessage" />
-</div>
-
-<div id="quicksearchbar">
-<roundcube:object name="searchform" type="search" results="5" id="quicksearchbox" /><roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" />
-</div>
-
-<div id="messagecountbar">
-<roundcube:button command="firstpage" imageSel="/images/buttons/first_sel.png" imageAct="/images/buttons/first_act.png" imagePas="/images/buttons/first_pas.png" width="11" height="11" title="firstmessages" />
-<roundcube:button command="previouspage" imageSel="/images/buttons/previous_sel.png" imageAct="/images/buttons/previous_act.png" imagePas="/images/buttons/previous_pas.png" width="11" height="11" title="previousmessages" />
-&nbsp;<roundcube:object name="messageCountDisplay" />&nbsp;
-<roundcube:button command="nextpage" imageSel="/images/buttons/next_sel.png" imageAct="/images/buttons/next_act.png" imagePas="/images/buttons/next_pas.png" width="11" height="11" title="nextmessages" />
-<roundcube:button command="lastpage" imageSel="/images/buttons/last_sel.png" imageAct="/images/buttons/last_act.png" imagePas="/images/buttons/last_pas.png" width="11" height="11" title="lastmessages" />
-</div>
-
 <div id="mailboxlist-container">
-<div id="mailboxlist-header"><roundcube:label name="mailboxlist" /></div>
+<h3 id="mailboxlist-header"><roundcube:label name="mailboxlist" /></h3>
 <roundcube:object name="mailboxlist" id="mailboxlist" maxlength="16" />
 </div>
 
 <roundcube:endif />
 </div>
 
+<div id="messagetoolbar">
+<roundcube:button command="checkmail" imageSel="/images/buttons/inbox_sel.png" imageAct="/images/buttons/inbox_act.png" imagePas="/images/buttons/inbox_pas.png" width="32" height="32" title="checkmail" />
+<roundcube:button command="compose" imageSel="/images/buttons/compose_sel.png" imageAct="/images/buttons/compose_act.png" imagePas="/images/buttons/compose_pas.png" width="32" height="32" title="writenewmessage" />
+<roundcube:button id="markreadbutton" image="/images/buttons/markread_act.png" width="32" height="32" title="markmessages" onclick="rcmailUI.show_markmenu();return false" />
+<roundcube:button command="reply" imageSel="/images/buttons/reply_sel.png" imageAct="/images/buttons/reply_act.png" imagePas="/images/buttons/reply_pas.png" width="32" height="32" title="replytomessage" />
+<roundcube:button command="reply-all" imageSel="/images/buttons/replyall_sel.png" imageAct="/images/buttons/replyall_act.png" imagePas="/images/buttons/replyall_pas.png" width="32" height="32" title="replytoallmessage" />
+<roundcube:button command="forward" imageSel="/images/buttons/forward_sel.png" imageAct="/images/buttons/forward_act.png" imagePas="/images/buttons/forward_pas.png" width="32" height="32" title="forwardmessage" />
+<roundcube:button command="delete" imageSel="/images/buttons/delete_sel.png" imageAct="/images/buttons/delete_act.png" imagePas="/images/buttons/delete_pas.png" width="32" height="32" title="deletemessage" />
+<roundcube:button command="print" imageSel="/images/buttons/print_sel.png" imageAct="/images/buttons/print_act.png" imagePas="/images/buttons/print_pas.png" width="32" height="32" title="printmessage" />
+
+<div id="markmessagemenu">
+  <ul class="toolbarmenu">
+    <li><roundcube:button command="mark" prop="read" label="markread" classAct="active" /></li>
+    <li><roundcube:button command="mark" prop="unread" label="markunread" classAct="active" /></li>
+  </ul>
+</div>
+</div>
+
+<div id="quicksearchbar">
+<roundcube:object name="searchform" type="search" results="5" id="quicksearchbox" /><roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" />
+</div>
+
+<div id="messagecountbar">
+<roundcube:button command="firstpage" imageSel="/images/buttons/first_sel.png" imageAct="/images/buttons/first_act.png" imagePas="/images/buttons/first_pas.png" width="11" height="11" title="firstmessages" />
+<roundcube:button command="previouspage" imageSel="/images/buttons/previous_sel.png" imageAct="/images/buttons/previous_act.png" imagePas="/images/buttons/previous_pas.png" width="11" height="11" title="previousmessages" />
+&nbsp;<roundcube:object name="messageCountDisplay" />&nbsp;
+<roundcube:button command="nextpage" imageSel="/images/buttons/next_sel.png" imageAct="/images/buttons/next_act.png" imagePas="/images/buttons/next_pas.png" width="11" height="11" title="nextmessages" />
+<roundcube:button command="lastpage" imageSel="/images/buttons/last_sel.png" imageAct="/images/buttons/last_act.png" imagePas="/images/buttons/last_pas.png" width="11" height="11" title="lastmessages" />
+</div>
+
+<script type="text/javascript">
+
+var rcmailUI = new rcube_mail_ui();
+rcube_event.add_listener({ object:rcmailUI, method:'body_mouseup', event:'mouseup' });
+rcube_event.add_listener({ object:rcmailUI, method:'body_keypress', event:'keypress' });
+  
+</script>
 </body>
 </html>
index d37861916a775cf274ebed50794dd81b1011e186..16379723e2481afe851b65c379941f52d6a4823a 100644 (file)
@@ -17,7 +17,7 @@
 <roundcube:object name="foldersubscription" form="subscriptionform" id="subscription-table"
   cellpadding="1" cellspacing="0" summary="Folder subscription table"
   deleteIcon="/images/icons/folder-trash.png"
-  renameIcon="/images/icons/edit.png" />
+  renameIcon="/images/icons/rename.png" />
 </div>
 
 <div id="bottomboxes">
@@ -26,8 +26,9 @@
 
 <div class="settingspart">
 <roundcube:label name="foldername" />:&nbsp;
-<roundcube:object name="createfolder" form="subscriptionform" />
+<roundcube:object name="createfolder" form="subscriptionform" hintbox="rcmailaddfolderhint" />
 <roundcube:button command="create-folder" type="input" class="button" label="create" />
+<div id="rcmailaddfolderhint" class="hint" style="margin-top:1em; height:16px"></div>
 </div>
 </div>
 
index cf5803db04f36ef6fc5bfbd8d26ab056157e79c2..9da9d199cda7356b37d00c32344fb05af639dfba 100644 (file)
@@ -15,7 +15,7 @@
 
 
 <div id="messagepartcontainer">
-<roundcube:object name="messagePartFrame" id="messagepartframe" width="100%" height="85%" />
+<roundcube:object name="messagePartFrame" id="messagepartframe" width="100%" height="100%" />
 </div>
 
 </body>